要开发自己的Struts2拦截器类,需要实现Interceptor接口,并实现相应的三个方法 。或继承AbstractInterceptor类,只实现doIntercept方法。这两个类都在xwork.jar包中,路径为com.opensymphony.xwork2.interceptor。
拦截器类MyInterceptor
public class MyInterceptor implements Interceptor { public void destroy() { System.out.println("destroy..."); } public void init() { System.out.println("init..."); } public String intercept(ActionInvocation invocation) throws Exception { System.out.println("my interceptor..."); String result = invocation.invoke(); return result; } }
init()方法会在服务器启动时自动执行,只会执行一次。
写好自己的拦截器类后,在struts2的配置文件struts.xml文件中也要做相应的配置,在package那层下,与其它action同级
<interceptors> <interceptor name="myInterceptor" class="com.interceptor.MyInterceptor"></interceptor> </interceptors>
在action中使用刚配置好的自定义拦截器类
<action name="register" class="com.test.action.RegisterAction"> <result name="success">/success.jsp</result> <result name="input">/register.jsp</result> <interceptor-ref name="myInterceptor"></interceptor-ref> </action>
当程序在调用register action时,会执行MyInterceptor的intercept方法。
注意:在action中使用自定义的拦截器后,Struts2中自带的默认拦截器都将失效,需手工将默认的拦截器也加入进来。如下,
<interceptor-ref name="defaultStack"></interceptor-ref>
默认的拦截器在struts2-core.jar包的根目录下,名称为struts-default.xml
我们在定义一个struts.xml文件时,都会声明此配置文件继承struts-default,如下,只有在使用了自定义的拦截器后,action才不会再调用默认的拦截器,所以需要手工将其再配置一次。
<package name="struts2" extends="struts-default">
2,在拦截器中定义变量hello,在配置文件中可定义此变更的值,可以声明拦截器处赋值,也可在使用的action处赋值,如
在声明处
<interceptor name="myInterceptor" class="com.interceptor.MyInterceptor"> <param name="hello">world</param> </interceptor>
在action使用处,此处的赋值会覆盖上面的赋值
<action name="register" class="com.test.action.RegisterAction"> <result name="success">/success.jsp</result> <result name="input">/register.jsp</result> <interceptor-ref name="myInterceptor"> <param name="hello">world2</param> </interceptor-ref> </action>
3,拦截器栈:它和拦截器类似,在一个拦截器栈中可以引用多个拦截器或多个拦截器栈。
<interceptor-stack name="myStack"> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack>
拦截器栈采用的是先进后出的操作顺序,即在执行目标对象方法前,先按栈中拦截器的顺序执行拦截器中的方法,再执行目标对象的方法,执行完再按逆序执行栈中的方法。
interceptor1
interceptor2
execute(目标对象的方法)
interceptor2
interceptor1
4,改变默认拦截器,如下配置,如下可以声明一个默认拦截器,它与action平级
<default-interceptor-ref name="myStack"></default-interceptor-ref>
如果一个action中没有配置一个自定义地拦截器,则它会默认使用默认拦截器。注意:只能有一个默认的拦截器
5,方法过滤拦截器:需要继承MethodFilterInterceptor并实现doIntercept方法
自定义的拦截器会拦截action中的所有方法(除了javabean方法,即get,set方法)
public class MyMethodInterceptor extends MethodFilterInterceptor { protected String doIntercept(ActionInvocation invocation) throws Exception { System.out.println("myMethodFilterInterceptor...."); return invocation.invoke(); }
在配置文件中声明此拦截器。
<interceptor name="myMethodInterceptor" class="com.interceptor.MyMethodInterceptor">
在action中配置,注意必须定义在其它拦截器前
<action name="register" class="com.test.action.RegisterAction"> <result name="success">/success.jsp</result> <result name="input">/register.jsp</result> <interceptor-ref name="myMethodInterceptor"> <param name="includeMethods">test1,execute</param> <!-- 包含,--> <param name="excludeMethods">test2,execute</param> <!-- 不包含,当一个方法在includeMethods和excludeMethods都有声明时,则includeMethods优先--> </interceptor-ref> <interceptor-ref name="myStack"></interceptor-ref> </action>