Struts2框架使用(五)之关于Struts2的拦截器和拦截器栈
Struts2 拦截器是在访问某个 Action 或 Action 的某个方法,字段之前或之后实施拦截,并且 Struts2 拦截器是可
插拔的,拦截器是AOP的一种实现.
优点:通用功能的封装,提供了可重用性;
Struts2 拦截器原理:
Struts2拦截器是在访问某个Action或Action的方法之前或之后实施拦截。在请求Struts2的Action时,Struts2会查找配置文件,并根据配置文件实例化相应的拦截器对象。
注意,这里的拦截器栈,执行顺序与栈相同。
那么如何要创建一个拦截器呢?
创建一个类,然后实现Interceptor接口。如下:
package com.mrlv.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; public class MyInterceptor implements Interceptor{ /** * */ private static final long serialVersionUID = 1L; @Override public void destroy() { System.out.println("MyInterceptor销毁"); } @Override public void init() { System.out.println("MyInterceptor初始化"); } @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("执行Action之前"); String result = invocation.invoke(); System.out.println(result); System.out.println("执行Action之后"); return result; } }
invocation.invoke()方法,是执行Action。result则是执行后的返回结果。
编写好拦截器类后需要在struts.xml配置
<package name="manage" namespace="/" extends="struts-default"> <interceptors> <!-- 配置拦截器 --> <interceptor name="myInterceptor" class="com.mrlv.interceptor.MyInterceptor"></interceptor> </interceptors> </package>
调用的时候,我们可以把编写好的拦截器放在一个位,后面需要携带一个默认的拦截器defaultStack。
<action name="hello" class="com.mrlv.action.HelloAction"> <result name="success">success.jsp</result> <!-- 注意,这里的拦截器调用有顺序之分 --> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action>
关于拦截器栈,拦截器栈的定义。
<interceptors> <!-- 配置拦截器 --> <interceptor name="myInterceptor" class="com.mrlv.interceptor.MyInterceptor"></interceptor> <interceptor name="loginInterceptor" class="com.mrlv.interceptor.LoginInterceptor"></interceptor> <!-- 配置拦截器栈 --> <interceptor-stack name="myStack"> <interceptor-ref name="loginInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors>
拦截器以及拦截器栈皆可以用于局部或全局。
如果想将其用于全局,只需要在package内配置。
<!-- 注意:一旦在package内配置了拦截器栈,那么该package内所有的action都将使用该拦截器栈, 如果某action想要不使用,需要在action内配置 <interceptor-ref name="defaultStack"></interceptor-ref> --> <default-interceptor-ref name="myStack"></default-interceptor-ref>
如果想要实现拦截某方法,有两种方法:这里的includeMethods是设置拦截的方法。excludeMethods是能通过的方法。
1.
<interceptors> <!--方法拦截器配置--> <interceptor name="myInterceptor" class="com.mrlv.interceptor.MyInterceptor"> <!--配置参数 :拦截什么方法--> <!--includeMethods控制能访问哪些--> <param name="includeMethods">add,delete</param> <!--excludeMethods控制能访问哪些--> <param name="excludeMethods">update</param> </interceptors>
2.
<action name="hello" class="com.mrlv.action.HelloAction"> <result name="success"> hello.jsp </result> <interceptor-ref name="myInterceptor"> <param name="includeMethods">myExecute</param> <param name="excludeMethods">execute</param><!--对myExecute进行拦截,对execute不拦截--> </interceptor-ref> </action>
以上便是一些拦截器的应用。