0%

struts2 自定义拦截器的使用

拦截器类似于Filter,会在调用Action前和后执行。默认情况下,每个Action都会调用defaultStack这个拦截器栈,包含了多个常用的拦截器(在struts-default.xml中声明),但是当在Action声明中显式添加某个拦截器时,defaultStack就会失效,需要在最后一行手动添加. Interceptor1.java:

package com.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class Interceptor1 implements Interceptor {
    /*
     * 声明字符串变量,及setter方法,名字与param name属性对应,会自动从struts.xml读取配置
     */
    private String test;
    public void setTest(String test) {
        this.test = test;
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void init() {
        // TODO Auto-generated method stub
        System.out.println("init invoked");
        System.out.println(test);
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("before invoked");
        String result=invocation.invoke();
        System.out.println(result);
        System.out.println("after invoked");
        return result;
    }

}

也可以继承AbstractInterceptor,而不是实现Interceptor,该类对init和destory方法作了空实现 struts.xml中声明及使用:

        <interceptors>
            <interceptor name="interceptor1" class="com.interceptor.Interceptor1">
                <!-- 初始化参数,需要在拦截器类中定义相应的属性 -->
                <param name="test">asdfjweoifjljfsd</param>
            </interceptor>
        </interceptors>



        <action name="login" class="com.struts2.LoginAction">
            <result name="success">/result.jsp</result>
            <result name="input">/login.jsp</result>
            <result name="invalid.token">/1.jsp</result>
            <interceptor-ref name="interceptor1"></interceptor-ref>
            <interceptor-ref name="token"></interceptor-ref>
            <!-- 添加其他拦截器后,默认的defaultStack拦截器栈就会失效,需要显示添加 -->
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>