拦截器是struts2的一个功能,在访问Action的时候会调用struts2的拦截器(若是存在的话)。拦截器既能够做用于Action的前面,将传递的参数修改;也能够做用于Action的后面,将返回的结果转换。他是AOP(面向切面编程)的一种实现。 java
要实现拦截器,有三种方式: 编程
实现Intercept接口(com.opensymphony.xwork2.interceptor.Interceptor) session
实现AbstractInterceptor抽象类(com.opensymphony.xwork2.interceptor.AbstractInterceptor) jsp
实现MethodFilterInterceptor抽象类(com.opensymphony.xwork2.interceptor.MethodFilterInterceptor)。 this
Interceptor有如下方法必须实现: spa
public class AInterceptor implements Interceptor{ public void init(){} public void destroy(){} public String intercept(ActionInvocation invocation) throws Exception{ return invocation.invoke() } }
init方法在拦截器初始化的时候执行 excel
AbstractInterceptor和MethodFilterInterceptor是Interceptor的一个模板,简化了Interceptor的实现。 code
其中AbstracetInterceptor已经实现了init(),destroy方法。而MethodFilterInterceptor则多了includeMethods和excludeMethods两个属性,includeMethods决定哪些方法须要拦截,exceludeMethods决定哪些方法不须要拦截。 xml
-----------------------------------------------------例子--------------------------------------------------- 对象
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拦截器拦截
第二种方法则能够在须要的时候被拦截