拦截器(Interceptor):拦截器是Struts2的核心,Struts2的众多功能都是通过拦截器来实现的。
拦截器跟filter的概念是非常类似的,拦截器只能拦截Action的,而filter是可以过滤所有的东西的.An interceptor is a stateless class that follows the interceptor pattern, as found inFilter
and in AOP languages.
Interceptors must be stateless(无状态的) and not assume that a new instance will be created for each request or Action是单实例的,
拦截器的编写有两步,一个是编写代码,第二个是编写配置文件.
自定义的拦截器要实现Interceptor接口ActionInvocation的invoke方法就类似于filter的dofilter
配置文件中用<interceptors>中进行配置.注意拦截器的init方法也是在服务器一启动的时候就调用的,跟filter一样的.整个struts都是靠这些拦截器所串联起来的.我们并没有在action里面配置也没问题啊,因为他有个默认的拦截器栈嘛.是通过 <default-interceptor-ref name="defaultStack"/>来指定的.
注意:一旦定义了自己的拦截器,将其配置到action上后,我们需要在action的最后加上默认的拦截器栈:defaultStack。因为自己的会覆盖默认的.
拦截器也可以跟filter一样配置param,然后在程序里面可以把它读出来.在程序中它用setter方法set进去的.
如:
<interceptor name="theInterceptor1" class="cn.wenping.interceptor.TheInterceptor1">
<param name="test">wenp</param>
</interceptor>
拦截器定义如下:
public class TheInterceptor1 implements Interceptor {
private String test;
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
.............
..............
}
定义拦截器时可以直接继承AbstractInterceptor抽象类(该类实现了Interceptor接口,并且对init和destroy方法进行了空实现),然后实现其抽象方法intercept即可,实际上就是一个适配器
注意:以上说的过滤Action实际上是过滤他的execute方法,如果要对指定的方法进行拦截用:MethodFilterInterceptor,此即方法过滤拦截器(可以对指定方法进行拦截的拦截器)。
采用的是下面两种param进行配置
- excludeMethods - method names to be excluded from interceptor processing
- includeMethods - method names to be included in interceptor processing
配置如下:如果用如下配置,那么myExecute方法在Action中要进行method方法的配置
<interceptor-ref name="theInterceptor3">
<param name="includeMethods">myExecute</param>
</interceptor-ref>
注意:在方法过滤拦截器中,如果既没有指定includeMethods参数,也没有指定execludeMethods参数,那么所有的方法都会被拦截,也就是说所有的方法都被认为是includeMethods的;如果仅仅指定了includeMethods,那么只会拦截includeMethods中的方法,没有包含在includeMethods中的方法就不会被拦截。
关于拦截器中的监听器:
ActionInvocation中的方法:addPreResultListener
PreResultListeners may be registered with anActionInvocation
to get a callback after theAction
has been executed but before theResult
is executed.
他起的作用就是:如果你想在Action的方法执行完毕之后在结果返回之前想要做点东西的话就可以用它们.