看看com.opensymphony.xwork2.interceptor.Interceptor的定义
public interface Interceptor extends Serializable { void destroy(); void init(); String intercept(ActionInvocation invocation) throws Exception; }
自定义一个简单的Interceptor
public class AroundInterceptor implements Interceptor { public AroundInterceptor() { // TODO Auto-generated constructor stub } public void destroy() { } public void init() { } @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("before invocation"); String result = invocation.invoke(); System.out.println("after invocation"); return result; } }ActionInvocation保存了action的状态和interceptors
所以我们写在invocation.invoke()之前的代码,执行在action调用之前;写在invocation.invoke()之后的代码,执行在action调用之后。
An ActionInvocation
represents the execution state of an Action
. It holds the Interceptors and the Action instance. By repeated re-entrant execution of the invoke()
method, initially by the ActionProxy
, then by the Interceptors, the Interceptors are all executed, and then the Action
and the Result
.
可以为一个action配置interceptor
<action name="register" class="org.apache.struts.register.action.Register" method="execute"> <interceptor-ref name="timer" /> <interceptor-ref name="logger" /> <interceptor-ref name="defaultStack"> <param name="exception.logEnabled">true</param> <param name="exception.logLevel">ERROR</param> </interceptor-ref> <result name="success">thankyou.jsp</result> <result name="input">register.jsp</result> </action>
可以为一个package配置一个interceptor
<package name="default" namespace="/" extends="struts-default"> <interceptors> <interceptor name="aroundInterceptor" class="interceptor.AroundInterceptor"/> <interceptor-stack name="appDefaultStack"> <interceptor-ref name="defaultStack"> <param name="exception.logEnabled">true</param> <param name="exception.logLevel">ERROR</param> </interceptor-ref> <interceptor-ref name="aroundInterceptor"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="appDefaultStack" /> </package>