Struts2 中的拦截器

Struts2中的拦截器和servelt中的过滤器是非常的相似的。如果学过过滤器的话,肯定能够感觉的到,尽管有些微的不同。可是struts2的拦截器到底如何使用呢,为什么会有这些配置呢?接下来一一来看。

过滤器和拦截器是非常相似的,过滤器publicinterfaceFilter接口里面有三个方法:

init(FilterConfigfilterConfig),

destroy(),

doFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain),

这里面的doFilter()方法是最重要的,在struts2中Stringintercept(ActionInvocationinvocation)就相当于此方法。

如何完成一个拦截器呢?在struts2中要实现一个接口这个接口是什么呢?在哪呢?,是否在哪听说过?是webwork是我们以前听的最多的关于拦截器的框架,struts2用了其中一个核心的东西,这个东西在是什么呢?是xwork。恩,有了它才可以拦截,好了我们在哪找呢?在com.opensymphony.xwork2.interceptor中找,里面有个Interceptor这是个接口,里面也有三个方法,有init,destroy和intercept三个方法,而在struts2里面的所有的拦截器都继承这个接口!

struts2接受客户端请求时,在执行action之前已经执行了自身默认的拦截器,这些拦截器完成struts2的大部分初始化的功能,比如设置属性值等。

执行完这些拦截器后,再执行action,返回客户端时,还得经过拦截器的拦截,最终返回客户端。下面我们开始模拟拦截器的实现过程:

1、新建自己的拦截器:

viewplaincopytoclipboardprint?

packagecom.beckham.interceptors;

/**

*@authorOwner

*Jan14,20102:36:14PM

*定义一个接口

*/

publicinterfaceMyInterceptor{

publicvoidinteceptor(Invocationinvocation);

}

packagecom.beckham.interceptors;

/**

*@authorOwner

*Jan14,20102:36:14PM

*定义一个接口

*/

publicinterfaceMyInterceptor{

publicvoidinteceptor(Invocationinvocation);

}

2、拦截器的具体实现

viewplaincopytoclipboardprint?

packagecom.beckham.interceptors;

/**

*@authorOwner

*Jan14,20102:41:26PM

*

*spring

*com.beckham.interceptors

*FirstInterceptor.java

*/

publicclassFirstInterceptorimplementsMyInterceptor{

publicvoidinteceptor(Invocationinvocation){

System.out.println("第一个拦截器开始。。。。");

//调用invoke方法

invocation.invoke();

System.out.println("第一个拦截器结束.......");

}

}

packagecom.beckham.interceptors;

/**

*@authorOwner

*Jan14,20102:41:26PM

*

*spring

*com.beckham.interceptors

*FirstInterceptor.java

*/

publicclassFirstInterceptorimplementsMyInterceptor{

publicvoidinteceptor(Invocationinvocation){

System.out.println("第一个拦截器开始。。。。");

//调用invoke方法

invocation.invoke();

System.out.println("第一个拦截器结束.......");

}

}

viewplaincopytoclipboardprint?

packagecom.beckham.interceptors;

/**

*@authorOwner

*Jan14,20102:42:22PM

*

*spring

*com.beckham.interceptors

*SecondInterceptor.java

*/

publicclassSecondInterceptorimplementsMyInterceptor{

publicvoidinteceptor(Invocationinvocation){

System.out.println("第二个拦截器开始.....");

//调用invoke方法

invocation.invoke();

System.out.println("第二个拦截器结束......");

}

}

packagecom.beckham.interceptors;

/**

*@authorOwner

*Jan14,20102:42:22PM

*

*spring

*com.beckham.interceptors

*SecondInterceptor.java

*/

publicclassSecondInterceptorimplementsMyInterceptor{

publicvoidinteceptor(Invocationinvocation){

System.out.println("第二个拦截器开始.....");

//调用invoke方法

invocation.invoke();

System.out.println("第二个拦截器结束......");

}

}

3、需要执行的action

viewplaincopytoclipboardprint?

packagecom.beckham.interceptors;

/**

*@authorOwner

*Jan14,20102:45:30PM

*

*spring

*com.beckham.interceptors

*Action.java

*/

publicclassAction{

publicStringexecute(){

System.out.println("执行execute方法");

returnnull;

}

}

packagecom.beckham.interceptors;

/**

*@authorOwner

*Jan14,20102:45:30PM

*

*spring

*com.beckham.interceptors

*Action.java

*/

publicclassAction{

publicStringexecute(){

System.out.println("执行execute方法");

returnnull;

}

}

4、控制器,该控制器调配执行拦截器和action

viewplaincopytoclipboardprint?

packagecom.beckham.interceptors;

importjava.util.ArrayList;

importjava.util.List;

/**

*@authorOwner

*Jan14,20102:46:44PM

*

*spring

*com.beckham.interceptors

*Invocation.java

*/

publicclassInvocation{

List<MyInterceptor>interceptors=newArrayList<MyInterceptor>();

intindex=-1;

publicInvocation(){

//需要执行的拦截器

this.interceptors.add(newFirstInterceptor());

this.interceptors.add(newSecondInterceptor());

}

publicvoidinvoke(){

index++;

if(index<interceptors.size()){

//一次调用拦截器的inteceptor方法

interceptors.get(index).inteceptor(this);

}else{

//拦截器拦截完毕后执行action

newAction().execute();

}

}

}

packagecom.beckham.interceptors;

importjava.util.ArrayList;

importjava.util.List;

/**

*@authorOwner

*Jan14,20102:46:44PM

*

*spring

*com.beckham.interceptors

*Invocation.java

*/

publicclassInvocation{

List<MyInterceptor>interceptors=newArrayList<MyInterceptor>();

intindex=-1;

publicInvocation(){

//需要执行的拦截器

this.interceptors.add(newFirstInterceptor());

this.interceptors.add(newSecondInterceptor());

}

publicvoidinvoke(){

index++;

if(index<interceptors.size()){

//一次调用拦截器的inteceptor方法

interceptors.get(index).inteceptor(this);

}else{

//拦截器拦截完毕后执行action

newAction().execute();

}

}

}

5、main方法执行,在struts2框架中,前台的一个请求被过滤器拦截后就执行拦截,然后再执行action

viewplaincopytoclipboardprint?

packagecom.beckham.interceptors;

/**

*@authorOwner

*Jan14,20102:47:32PM

*

*spring

*com.beckham.interceptors

*Test.java

*/

publicclassTest{

publicstaticvoidmain(String[]args){

//struts2的拦截器入口就是invoke方法

newInvocation().invoke();

}

}

packagecom.beckham.interceptors;

/**

*@authorOwner

*Jan14,20102:47:32PM

*

*spring

*com.beckham.interceptors

*Test.java

*/

publicclassTest{

publicstaticvoidmain(String[]args){

//struts2的拦截器入口就是invoke方法

newInvocation().invoke();

}

}

模拟结果:

第一个拦截器开始。。。。

第二个拦截器开始.....

执行execute方法

第二个拦截器结束......

第一个拦截器结束.......

从模拟结果分析,拦截器相当于包裹在action外面的屏障,要达到执行action的目的,需要穿过屏障-------->执行action-------->穿出屏障

拦截器的实现其实是aop编程思想,在实现相应逻辑的前后,加上其他逻辑的实现,而且没有任何依赖关系。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gaowenming/archive/2010/01/14/5189803.aspx

相关推荐