11-19笔记
一、Struts拦截器
拦截器(Interceptor):拦截器是struts2的核心,struts2的众多功能都是通过拦截器来实现的。
1.拦截器的配置
? 编写实现Interceptor接口的类
? 在struts.xml文件中定义拦截器
? 在action中使用拦截器
一旦定义了自己的拦截器,将其配置到action上后,我们需要在action的最后加上默认的拦截器栈:defaultStack
2.定义拦截的三种方法
? (1)实现Interceptor接口类
public class TheInterceptor1 implements Interceptor{ public void destroy(){} public void init(){} public String intercept(ActionInvocation invocation) throws Exception{ String result = invocation.invoke();//如果还有拦截器,将传递给下一拦截器,否则执行Action return result; }}
?struts.xml文件中定义拦截器
<struts> <package name="struts" extends="struts-default"> <interceptors> <interceptor name="theInterceptor1" extends="default-struts"> <interceptor-ref name="theInterceptor1"> </interceptor-ref> </action> </package></struts>
?
拦截器中传递参数
?
public class TheInterceptor1 implements Interceptor{ private String test;//拦截器中传递参数,在tomcat启动时,便已执行setTest(),init()方法,setTest()方法在init()方法之前执行 public String getTest(){ return test; } public void setTest(String test){ this.test = test; } public void destroy(){} public void init(){} public String intercept(ActionInvocation invocation) throws Exception{ String result = invocation.invoke();//如果还有拦截器,将传递给下一拦截器,否则执行Action return result; }}
? struts.xml文件中定义拦截器
<struts> <package name="struts" extends="struts-default"> <interceptors> <interceptor name="theInterceptor1" extends="default-struts"> <interceptor-ref name="theInterceptor1"> </interceptor-ref> </action> </package></struts>
?
?
?
? (2)继承AbstractInterceptor抽象类(该类实现了interceptor接口,并且对init和destroy方法进行了空实现),然后实现其抽象方法intercept即可。
? (3)方法过滤拦截器(可以对指定方法进行拦截的拦截器,继承了MethodFilterInterceptor类,实现doIntercept(ActionInvocation invocation)抽象方法)
[MethodFilterInterceptor类重写了AbstractInterceptor类的intercept(ActionInvocation invocation)方法,但提供了一个doIntercept(ActionInvocation invocation)抽象方法。从这种设计方式可以看出,MethodFilterInterceptor类的intercept已经实现了对Action的拦截行为(只是实现了方法过滤的逻辑),但真正的拦截逻辑还需要开发者提供,也就是通过回调doIntercept方法实现。可见,如果用户需要实现自己的拦截逻辑,则应该重写doIntercept(ActionInvocation invocation)方法]
在方法过滤拦截器中,如果没有制定includeMethods参数,也没有指定execludeMethods参数,那么所有的方法都会被拦截,也就是所有的方法都被认为是includeMethods的;如果仅仅指定了includeMethods,那么只会拦截includeMethods中的方法,没有包含在includeMethods中的方法就不会被拦截。
[如果对于相同的方法指定了execludeMethods参数,includeMethods参数,includeMethods参数优先级高,也就是说依旧会被拦截]
注:execludeMethods、includeMethods参数需要在struts.xml的interceptor标签中配置params标签。
?