拦截器可以在动作执行之前或之后执行附加的动作。常见的应用有身份验证、日志记录等。
默认拦截器定义在struts-default包中。其中有几个重要的拦截器:
<s:token/>
实现。
对于每个拦截器,每次请求intercept只会被调用一次。intercept一般都会调用invoke方法,它的作用是执行下一个拦截器,如果没有下一个拦截器,那么会执行Action中的代码。下面是一个拦截器的例子,注意它在动作执行前和执行后都增加了额外的操作。
public String intercept(ActionInvocation invoker) throws Exception { System.out.println("Before invoke"); String result = invoker.invoke(); System.out.println("After invoke"); }
所以拦截器的工作流程是这样的:首先框架调用第一个拦截器,第一个拦截器通过invoke方法调用第二个拦截器,第二个拦截器也是通过同一个invoke方法调用第三个拦截器,这样一条很长的调用链下来,直到拦截器调用完成为止,最后执行Action中的代码。
invoke方法,第一次调用的时候会执行第一个拦截器,第二次调用执行第二个拦截器……最后一次调用执行Action中的代码。它的返回值含义是视图名称,所以在拦截器中可以代替Action提前返回视图名称。
拦截器的配置。在struts.xml文件中,拦截器的配置应该包括两个部分,声明拦截器、定义拦截器栈。
声明拦截器的代码示例如下。一个包中只能有一个interceptors标签。
<interceptors> <interceptor name="params" class="ParametersInterceptor"/> <interceptor name="timer" class="TimerInterceptor"/> </interceptors>
这样拦截器就声明好了,接下来定义拦截器栈。在引用拦截器的时候可以传入参数。
<interceptor-stack name="defaultStack"> <interceptor-ref name="params"/> <interceptor-ref name="workflow"> <param name="execludeMethod>input,back,cancel</param> </interceptor-ref> </interceptor-stack> <default-interceptor-ref name="defaultStack"/>
给动作指定拦截器。需要注意的是,只要指定了任何一个拦截器,那么默认的拦截器就不会执行。
<action name="MyAction" class="com.test.MyAction"> <interceptor-ref name="timer"/> <interceptor-ref name="logger"/> <interceptor-ref name="defaultStack"/> <result>success.jsp</result> </action>
原文地址:http://blog.csdn.net/caipeichao2/article/details/39011977