读书人

struts2拦截器小结

发布时间: 2013-03-28 10:20:24 作者: rapoo

struts2拦截器总结
以下是struts2拦截器的内容:
Struts2运转流程图:
10.jpg

其实拦截器Interceptors是struts2的最核心的内容,拦截器支撑起了struts2整个的运转流程。
要想理解拦截器,首先要理解过滤器。两个差不太多。

拦截器的作用:拦截用户的请求,对请求进行一些预处理,当请求完毕之后,又可以对请求进行后续的处理,对相应进行后续的处理。作用和过滤器很类似。

创建一个拦截器要是吸纳Interceptor接口。实现里面的三个方法:init()、intercept()、destroy()
Init():初始化方法;
Intercept():拦截逻辑处理方法
destroy():释放资源。
这三个方法和过滤器里面的方法很类似,作用也很类似。

在拦截器里面处理业务逻辑的是Intercept()方法,处理完之后还需要往后走,调用的是ActionInvocation类里面的invoke()方法,这个方法就和过滤器里面的change.doFilter()方法,就是让后续的被执行的action接着去执行。同时也可以配置多个拦截器,如果有多个拦截器的话invoke()方法就会调用下一个拦截器。反正就是让程序继续往下走。

申明拦截器:在struts.xml里面申明interceptor元素。

在tomcat服务器一起来的时候拦截器就被加载了,已经调用了拦截器的init()方法。

拦截器执行流程:
1、先执行inteceptor的intercept()方法;
2、在intercept()里面执行ActionInvocation.invoke()方法,继续往下走,执行action里面的execute()方法,如果执行成功了返回success;
3、execute()方法返回成功success回到inteceptor的intercept()方法,把这个结果返回到action配置的result里面去匹配,回到结果页面。

注意:在默认情况下如果我们在某个action的配置里面没有申明任何拦截器,那么struts2会自动为我们配置一个默认的拦截器defaultStack,而如果我们自己定义了拦截器,并且为某个action配置上了,那么struts2就不会再为这个action配置默认的拦截器,那个默认的拦截器就不会起作用了,只执行我们自定义的拦截器。而这种情况下我们除了使用自定义的拦截器外还必须使用struts2为我们提供的那个默认的拦截器defaultStack(要不然结果参数无法带回到页面上)。所以我们在申明了自定义的拦截器的同时,还要加上struts2为我们提供的默认的拦截器defaultStack,而且配置的时候必须把我们自定义的拦截器配置到上面,最后跟上struts2为我们默认提供的拦截器defaultStack。

实现拦截器的三个步骤:
1、定义一个类,让这个类实现Interceptor这个接口。
2、在struts.xml里面申明这个拦截器。申明不代表使用。
3、在action的配置里面引用拦截器,这才是真正的使用。

具体为interceptor配置参数的示例在拦截器的实例代码里面有标注。

但是如果我们通过事先Interceptor接口来完成拦截器类,那么我们必须得实现这个接口里面的三个方法init()、intercept()、destroy(),其中init()和destroy()方法我们基本上用不到,那么怎么办呢,struts2为我们考虑到了这点,struts2为我们又提供了一个AbstractInterceptor抽象类,这个类实现了Interceptor接口。我们只要在类里面继承这个类就能完成拦截器,而这个类里面的init()和destroy()方法它都给空实现了,intercept()方法定义为抽象方法让我们自己去实现,我们的目的达到了。

拦截器的配置顺序和请求执行的流程是这样的:
首先请求会经过在这个action里面配置的拦截器,拦截器执行顺序是按照拦截器的配置顺序执行,请求先经过第一个拦截器,执行完之后这个拦截器将请求交给第二个拦截器,最后经过struts2提供的默认拦截器,所有拦截器执行完之后请求才会来到action里面去执行execute()方法。Execute()方法执行完之后响应又会按照相反的顺序回到拦截器栈里面去,响应先经过struts2提供的默认的拦截器,然后按照想法顺序一个个经过自定义的拦截器,最后回到成功页面。

下面是过滤器的工作流程,拦截器的工作流程和这个基本相同:
77.jpg
接下来遇到的问题是,如果我们在某个action里面配置了两个拦截器,那么这个action里面的所有方法都会被这些拦截器拦截,但有的时候我们希望我们的action里面的某些方法不被拦截器拦截。所以我们需要通过一些手段让拦截器去拦截我们想让它拦截的方法。前者称为针对类的拦截器,后者称为针对方法的拦截器。

对于针对方法的拦截器struts2又为我们提供了一个抽象类MethodFilterInterceptor,这个抽象类继承了AbstractInterceptor父类,如果我们想要编写针对方法的拦截器的话,继承MethodFilterInterceptor抽象类即可。我们的子类去重写此抽象类里面的doIntercept()方法去实现自己的逻辑。配置需要进行拦截和不拦截方法的配置方式见实例里面。


重点见附件实例:Struts2Interceptor.zip

读书人网 >编程

热点推荐