拦截器是struts2的一个功能,在访问Action的时候会调用struts2的拦截器(如果存在的话)。拦截器既可以作用于Action的前面,将传递的参数修改;也可以作用于Action的后面,将返回的结果转换。他是AOP(面向切面编程)的一种实现。
要实现拦截器,有三种方式:
实现Intercept接口( com.opensymphony.xwork2.interceptor.Interceptor )
实现 AbstractInterceptor抽象类(com.opensymphony.xwork2.interceptor.AbstractInterceptor)
实现 MethodFilterInterceptor 抽象类(com.opensymphony.xwork2.interceptor.MethodFilterInterceptor)。
Interceptor 有以下方法必须实现:
public class AInterceptor implements Interceptor{
public void init(){}
public void destroy(){}
public String intercept(ActionInvocation invocation) throws Exception{
return invocation.invoke()
}
}
init方法在拦截器初始化的时候执行
AbstractInterceptor和MethodFilterInterceptor是Interceptor的一个模板,简化了Interceptor的实现。
其中AbstracetInterceptor已经实现了init(),destroy方法。而MethodFilterInterceptor则多了 includeMethods 和 excludeMethods 两个属性,includeMethods决定哪些方法需要拦截,exceludeMethods决定哪些方法不需要拦截。
-----------------------------------------------------例子---------------------------------------------------
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import java.util.Map;
public class HeheInterceptor implements Interceptor {
public void init(){
System.out.println("this is init !");
}
public void destroy(){
System.out.println("this is destroy !");
}
public String intercept(ActionInvocation invocation) throws Exception{
try{
Thread.sleep(10000);
}catch (InterruptedException e){
e.printStackTrace();
}
Map session = invocation.getInvocationContext().getSession();
Operator operator = (Operator)session.get("cms_operator");
System.out.println("hello the user's name is "+operator.getLoginName());
System.out.println("hello the user's password is "+operator.getPassword());
operator.setLoginName("hehe");
return invocation.invoke();
}
}
在以上代码中实现步骤是这样的:
1.初始化的时候会执行init方法
2.被拦截时进入interceptor方法
3.“沉睡”10秒钟
4.将一个账号的名字修改
5.让action继续执行
6.当该对象被回收时执行destory方法
struts的配置文件可以这样写:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" >
<struts>
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="hehe" class="moretv.cms.interceptor.HeheInterceptor"/>
<interceptor-stack name="default">
<interceptor-ref name="hehe" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="default" />
</package>
<package name="user" extends="default" namespace="/">
<action name = "login" class="AAction" method="login">
<result name="error">/WEB-INF/jsp/login.jsp</result>
<result name="success">/WEB-INF/jsp/main.jsp</result>
</action>
</package>
</struts>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" >
<struts>
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="hehe" class="moretv.cms.interceptor.HeheInterceptor"/>
</interceptors>
</package>
<package name="user" extends="default" namespace="/">
<action name = "login" class="AAction" method="login">
<interceptor-ref name="hehe" />
<result name="error">/WEB-INF/jsp/login.jsp</result>
<result name="success">/WEB-INF/jsp/main.jsp</result>
</action>
</package>
</struts>
第一种方法所有继承了default的package下的action都会被hehe拦截器拦截
第二种方法则可以在需要的时候被拦截