Struts2(9):开发自己的Struts2拦截器(编码与配置)
???? 要开发自己的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" name="code"><action name="register" name="code"><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" name="code"><action name="register" name="code"><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" name="code"><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>
?