`
Candy_Code
  • 浏览: 13920 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

struts2的灵魂——Interceptor(拦截器)

阅读更多

1.什么是拦截器:
拦截器是动态拦截Action调用的对象。它提供了一种机制使得开发者可以定义action执行之前或之后执行的代码,也可以在一个action执行前将其阻止。

2.AOP:
提到拦截器,我们不得不提到AOP.
AOP(Aspect-Oriented Programming)译为:“面向切面编程”或者“面向方面编程”。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。拦截器的就是实现AOP的一种策略。
下图是拦截器的工作原理简略图:


3.拦截器的作用:
  我们可以用Interceptor在Action的方法执行之前或者之后做一些处理,struts的核心功能正是由拦截器来实现的,比如捕获异常、数据校验、安全审查等等。

4.拦截器的工作原理:
Interceptor Stack(拦截器堆)中有顺序的存储着多个Interceptor,他们联接成链状,然后按照添加的顺序,依次调用。这里用到了递归调用,我认为这是设计者的聪明之处。
DefaultActionInvocation类持有拦截器链的引用,以及action的引用,是控制递归调用的重要类。
关于递归更深入的探讨,请猛击:http://candy-code.iteye.com/blog/1443427
下面我们就来模拟一下Interceptor的工作原理
5.Interceptor模拟:

Invocation.java
package com.interceptor.test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * 模拟DefaultActionInvocation
 *	所有的拦截器存放在一个ArrayList中
 *	该类应当持有拦截器数组的引用和Action的引用
 */
public class Invocation{
	private List<Interceptor> interceptors = new ArrayList<Interceptor>();
	private Iterator<Interceptor> interator;
	private Action action;
	/**
	 * 初始化拦截器和action
	 * 用new 模拟
	 * 实际上Invocation是从struts.xml读取内容,并初始化的
	 */
	public Invocation(){
                  //按顺序加入Interceptor
		interceptors.add(new FirstInterceptor());
		interceptors.add(new SecondInterceptor());
		interceptors.add(new ThirdInterceptor());
		interator = interceptors.iterator();
		action = new Action();
	}
	/**
	 * 这是一个递归方法
            *方法直接或间接地调用自身即为递归
	 * invoke()调用intercept(),intercept()又调用invoke()
	 * 实际上就是 第一个拦截器调用第二个拦截,第二个调用第三个,依次类推
	 */
	public void invoke(){
		Interceptor interceptor;
		//若链表中仍有Interceptor,则调用下一个Interceptor
		if(interator.hasNext()){
			interceptor = interator.next();
			interceptor.intercept(this);
		}
		//链表中中没有Interceptor了,则调用Action
		else{
			action.execute();
		}
	}
}



Interceptor.java
package com.interceptor.test;
//模拟com.opensymphony.xwork2.interceptor.Interceptor接口
//所有拦截器都应该实现该接口或者继承自Interceptor的子类
public interface Interceptor {
	//这是拦截器类的最重要的方法
	//invocation用于存储拦截器链表
	public void intercept(Invocation invocation);
}


FirstInterceptor.java
package com.interceptor.test;
//第一个拦截器
public class FirstInterceptor implements Interceptor{
	@Override
	public void intercept(Invocation invocation) {
		//向控制输出信息,来模拟action调用前的处理工作
		System.out.println("first interceptor -->be called");
		//回调DefaultAcctionInvocation的方法
		invocation.invoke();
		//模拟action调用后的处理工作
		System.out.println("first interceptor -->return");
	}
}

SecondInterceptor.java
package com.interceptor.test;
//第二个拦截器
public class SecondInterceptor implements Interceptor{
	@Override
	public void intercept(Invocation invocation) {
		System.out.println("Second interceptor -->be called");
		invocation.invoke();
		System.out.println("Second interceptor -->return");
	}
}

ThirdInterceptor.java
package com.interceptor.test;
//第三个拦截器
public class ThirdInterceptor implements Interceptor{
	@Override
	public void intercept(Invocation invocation) {
		System.out.println("Third interceptor -->be called");
		invocation.invoke();
		System.out.println("Third interceptor -->return");
	}
}

Main.java
package com.interceptor.test;
//用于启动模拟程序
//模拟StrutsActionProxy的execute()方法
public class Main {
	// 创建Invocation,并调用其invoke()方法
	public static void main(String[] args) {
		new Invocation().invoke();
	}
}

Action.java
package com.interceptor.test;
public class Action {
	public String execute(){
		System.out.println("Action-->execute");
		return "success";
	}
}


控制台输出结果为:

first interceptor -->be called
Second interceptor -->be called
Third interceptor -->be called
Action-->execute
Third interceptor -->return
Second interceptor -->return
first interceptor -->return


相信看到输出结果之后,不用过多的解释,你也会对Interceptor的工作原理有更具体的了解了。
0
0
分享到:
评论
1 楼 liuwuping1206 2012-04-04  
写的非常好 谢谢了。。

相关推荐

    Struts2 的核心——拦截器[Interceptor]

    NULL 博文链接:https://wang4717.iteye.com/blog/796941

    Struts 2的基石——拦截器(Interceptor)

    NULL 博文链接:https://chenyajie.iteye.com/blog/1980865

    理解拦截器用于在某个方法或字段被访

    谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链

    个人认为目前最完备的Struts2教程

    07 Struts 2的基石——拦截器(Interceptor) 08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 Struts 2的新表单标志的使用 13 Struts 2与AJAX

    struts2.0中文教程

    07 Struts 2的基石——拦截器(Interceptor) 08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 trus 2的新表单标志的使用 13 Struts 2与AJAX

    Struts 2.0系列(MAX)

    Struts 2.0系列(MAX),pdf格式,全...Struts 2的基石——拦截器(Interceptor) 在Struts 2中实现IoC 在Struts 2中实现文件上传 在Struts 2中实现CRUD Struts 2中的OGNL Strus 2的新表单标志的使用 Struts 2与AJAX

    Struts2.0中文教程权威版

    07 Struts 2的基石——拦截器(Interceptor) 08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 trus 2的新表单标志的使用 13 Struts 2与AJAX Struts2中用...

    Struts2 in action中文版

    4.3 研究内建的Struts 2拦截器 67 4.3.1 工具拦截器 67 4.3.2 数据转移拦截器 67 4.3.3 工作流拦截器 69 4.3.4 其他拦截器 72 4.3.5 内建的拦截器栈 73 4.4 声明拦截器 74 4.4.1 声明独立的拦截器和拦截器栈 74 ...

    struts2入门实例2 经典入门必备

    1.Struts2_01_login 对应登录。。 ... login_struts2.jsp-------------------------------采用struts标签的登陆页面 ... login_struts_validate_noblank.jsp-----------... 拦截器 17.Struts2_09up&down 上传和下载

    struts2[1].0标签详解

    Struts 2的基石——拦截器(Interceptor);在Struts 2_0中国际化(i18n)您的应用程序;在Struts 2_0中实现表单数据校验(Validation);Struts 2与AJAX;在Struts 2中实现IoC......

    struts2入门实例1

    struts2 最新的入门实例 我自己总结的 呵呵,欢迎提出宝贵的意见 1.Struts2_01_login 对应登录。。 ... login_struts2.jsp-------------------------------采用... 拦截器 17.Struts2_09up&down 上传和下载

    struts2入门实例4 经典入门必备

    1.Struts2_01_login 对应登录。。 ... login_struts2.jsp-------------------------------采用struts标签的登陆页面 ... login_struts_validate_noblank.jsp-----------... 拦截器 17.Struts2_09up&down 上传和下载

    struts2入门实例3 经典入门必备

    1.Struts2_01_login 对应登录。。 ... login_struts2.jsp-------------------------------采用struts标签的登陆页面 ... login_struts_validate_noblank.jsp-----------... 拦截器 17.Struts2_09up&down 上传和下载

    Strut2 源码API +TagAPI +示例

    Strut2 源码API +TagAPI +示例 在Struts 2中实现文件上传 - Max On Java - BlogJava.files Struts 2的基石——拦截器(Interceptor) - Max On Java - BlogJava.htm Struts 2中的OGNL - Max On Java - BlogJava.htm

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    18.3 使用DataSourceInjectorInterceptor拦截器 269 18.4 小结 273 第19章 定制结果类型 274 19.1 概述 274 19.2 编写一个自定义的结果类型 274 19.3 使用新的结果类型 277 19.4 小结 279 第20章 Velocity 280 ...

    webx3框架指南PDF教程附学习Demo

    • Struts • Webwork • Tapestry • Spring MVC 以上框架都是非常优秀的。说实话,如果阿里巴巴网站在2001年开始,就有这么多可选择的话,无论选择哪一个都不会有问题。因为这些年来,所有的开源Web框架都在...

Global site tag (gtag.js) - Google Analytics