1.拦截器(interceptor):拦截器是Struts2的核心,Struts2的众多功能都是通过拦截器来实现的。与filter工作流程相似,只拦截action。
2.Interceptor接口(继承)
- void destory(); 很少使用
- void init(); 很少使用
- String intercept(ActionInvocation invocation)
public String intercept(ActionInvocation arg0) throws Exception { String in = arg0.invoke(); return in ; }
3.ActionInvocation 接口
- Object getAction();获得与这个ActionInvocation所关联到的action
- String invoke(); 如果拦截器堆栈里有其他的拦截器,则将调用下一个拦截器;如果没有,则直接调用action
- void addPreResultListener(PreResultListener listener);当action执行完与页面被渲染之前的这两个时间之间的
4.PreResultListener接口
- void beforeResult(ActionInvocation invocation,Strng resultCode)
5.每个拦截器中的代码的执行顺序,在Action之前,拦截器的执行顺序与堆栈中定义的一致;
而在Action和Result之后,拦截器的执行顺序与堆栈中定义的顺序相反。
5.拦截器的配置
- 编写实现interceptor接口的类
- 在struts.xml文件中定义拦截器
- 在action中使用拦截器
<interceptors> <interceptor name="InterceptorMy" class="com.liule.interceptor.InterceptorMy"></interceptor> </interceptors> <action name="LoginAction"> <result name="sucess">/servlet.jsp</result> <interceptor-ref name="InterceptorMy"></interceptor-ref> </action>
6.在不明确声明拦截器的时候,调用默认的拦截器
指定默认的拦截器栈:
<default-interceptor-ref name="defaultStack" />
7.一旦定义了自己的拦截器,将其配置到action上后,我们需要在action的最后加上默认的拦截器栈:defaultStack
<action name="LoginAction"> <result name="sucess">/servlet.jsp</result> <interceptor-ref name="InterceptorMy"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action>
8.初始化参数
<interceptors> <interceptor name="InterceptorMy" class="com.liule.interceptor.InterceptorMy"> <param name="hello">shengsiyuan</param> </interceptor> </interceptors>
public class InterceptorMy implements Interceptor { private String hello; public String getHello() { return hello; } public void setHello(String hello) { this.hello = hello; } @Override public void destroy() { // TODO Auto-generated method stub } @Override public void init() { // TODO Auto-generated method stub } @Override public String intercept(ActionInvocation arg0) throws Exception { String in = arg0.invoke(); return in ; } }
9.AbstractInterceptor 类(类似于适配器)
- init();
- destory();
- intercept(ActionInvocation invocation);
10.定义拦截器时可以直接继承AbstractInterceptor抽象类(该来实现了Interceptor接口,并且对init()和destory()方法进行了空实现),然后实现其抽象方法intercept即可。
11.方法过滤拦截器(可以对指定方法进行拦截的拦截器)
12.MethodFilterInterceptor 类,继承了AbstractInterceptor
- String doIntercept(ActionInvocation invocation)
13.参数:(拦截器是不是执行)
- excludeMethods,不拦截的方法,拦截器不执行
- includeMethods,拦截的方法,拦截器执行(优先级高)(默认)
在方法过滤拦截器中,如果既没指定include参数与exclude参数,那么所有的方法都会拦截,也就是说所有的方法都默认为include。如果仅仅指定了include,那么只会拦截include中的方法,没有包含在include的不会被执行。
14.Map map = invocation.getInvocationContext().getSession();
15.Action.LOGIN 表示用户没有登录,让用户再登陆一下。