介绍
拦截器其实是AOP的一种实现方式。拦截器可以在调用Action之前和之后执行代码。框架的大多数核心功能都是作为拦截器实现的。Struts2提供了对个拦截器,开发人员可以根据需要配置拦截器。
客户端发送请求会被Struts2的过滤器拦截,此时Struts2对请求持有控制权。他会创建action的代理对象。之后通过拦截器处理请求,最后交给action处理。在这期间,拦截器对象作用Action和Result的前后可以执行的任何操作,所以Action对象编写简单是由于拦截器进行了处理。
配置拦截器
在struts.xml中配置
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="timer" class=".."/>
<interceptor name="logger" class=".."/>
</interceptors>
<action name="login" class="tutorial.Login">
<interceptor-ref name="timer"/>
<interceptor-ref name="logger"/>
<result name="input">login.jsp</result>
<result name="success" type="redirectAction">/secure/home</result>
</action>
</package>
为包指定特定的拦截器
<package name="basicstruts2" extends="struts-default" >
<interceptors>
<interceptor-stack name="appDefault">
<interceptor-ref name="timer" />
<interceptor-ref name="logger" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="appDefault" />
</package>
编写拦截器
拦截器必须实现com.opensymphony.xwork2.interceptor.Interceptor
接口
在Interceptor中有三个方法:
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
init():方法用于拦截器执行一些初始化操作,此方法在拦截器被实例化后和intercept()方法执行前调用。
destroy():方法指示生命周期结束,他在拦截器被销毁前调用,用于拦截器在初始化时占用一些资源。
intercept():方法是拦截器中的主要方法,用于执行Action对象中的请求处理方法及其后的一些操作,动态增强Action功能。
说明:只有电泳intercept方法中的invocation参数的invoke方法,才可以执行Action对象中的请求处理方法。
使用拦截器
(1)创建动态Java Web项目,将Struts2的相关类包配置到构建路径中,并在web.xml文件中注册Struts2提供的StrutsPrepareAndExecuteFilter过滤器,从而搭建Struts2的开发环境。
(2)创建名为TestAction的类,此类继承于ActionSupport对象。关键代码如下:
package com.yy;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
public String execute() throws Exception{
Thread.sleep(1000);
return SUCCESS;
}
}
(3)在struts.xml中配置TestAction对象,并输出Action执行时间拦截器timer应用到TestAction中,关键代码为
<constant name="struts.devMode" value="true"/>
<constant name="struts.configuration.xml.reload" value="true"/>
<package name="myPackage" extends="struts-default">
<action name="testAction" class="com.yy.TestAction">
<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>success.jsp</result>
</action>
</package>
(4)创建简单的index.jsp和success.jsp页面用来测试timer拦截器,
(5)结果如下