关于拦截器
1、 通常情况下,拦截器都是通过代理的方式调用。拦截器必须先定义再调用,定义时需要指定name属性和class属性。拦截器栈和普通的拦截器一样使用。
2、 如果继承了struts-default包,那也就继承了默认拦截器栈defaultStack,这就意味着如果在子包中没有为Action指定拦截器,则defaultStack拦截器栈将对Action执行拦截。如果开发者为Action指定其他拦截器(栈),则系统不再使用默认拦截器栈拦截该Action。
3、 拦截器的配置元素表
元素名称 | 说明 |
<interceptors> | 用来定义拦截器,所有拦截器与拦截器栈都在此元素在定义。可以包含子元素<interceptor>和<interceptor-stack> |
<interceptor> | 用来定义拦截器栈,需要指定两个属性,name属性用来指定拦截器的名字,class指定其实现类 |
<interceptor-stack> | 用来定义拦截器栈,需要指定name属性,另外i可以通过子元素<interceptor-ref>引人其他拦截器或拦截器栈 |
<interceptor-ref> | 用来引入其他拦截器或拦截器栈,可以作为<interceptor-stack>和<action>的子元素 |
<param> | 用来为拦截器指定参数,可以作为<interceptor>和<interceptor-ref>的子元素 |
<default-interceptor-ref> | 将某个拦截器自定义为默认拦截器 |
4、 自定义拦截器类:需要实现Interceptor接口或者继承抽象拦截器类AbstractInterceptor。一般选择继承这个抽象类,这样只需重写intercept()方法。
实例:创建一个拦截器实现类MyInterceptor。
5、 注意在struts.xml中配置好自定义的拦截器后,还需要引用系统默认的拦截器栈defaultStack,因为只有这样,用户提交的数据才能保存为Action的属性值。
6、 拦截器方法的过滤:在使用拦截器时,可以通过将<interceptor-ref>的子元素<param>的属性值设置为excludeMethods来指定拒绝拦截的方法,和通过值includeMethods来指定需要拦截的方法。默认拦截相关Action的所有方法。
7、 拦截器的执行顺序:在execute()方法执行之前,先配置的拦截器先执行,之后,先配置的后执行。
8、 拦截器结果监听器:在execute()方法执行之后,系统处理result之前。实现拦截结果的拦截器,需要实现PreResultListener接口的beforeResult()方法,并在相关的自定义的拦截器内通过addResultListener()方法注册即可。
9、 设置拦截器的参数,一般用<param>指定。既可以在定义拦截器时指定相关参数的值,也可以在使用时再定义或者覆盖拦截器参数的值。如果想在使用时覆盖拦截器栈中已经赋好值的参数,则使用拦截其名.参数名,可实现目的。