拦截器类似于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>