一、了解拦截器
拦截器可以动态增强Action对象的功能,在Struts2与ServletAPI进行解藕,Action对请求的处理不依赖于Servlet API,表单重复提交、对象类型转换、文件上传,还ModelDriven操作,都离不开拦截器。
拦截器动态地作用于Action与Result之间,它可以动态地Action及Result进行增强(在Action与Result加入新功能)
1、浏览器(http请求)--->StrutsPrepareAndExecuteFilter
2、StrutsPrepareAndExecuteFilter(Create)---->ActionProxy
3、ActionProxy(调用)-------->Interceptor
4、Interceptor--->前处理
5、Interceptor--->execute()
6、Interceptor---->返回result
7、Interceptor---->后处理
8、Intercepto(返回result)---->ActionProxy
9、ActionProxy(返回页面)----->浏览器
二、拦截器API
在Struts2API中,存在一个名为“com.opensymphony.xwork2.interceptor”的包,此包的对象是Struts2内置的一些拦截器对象,它们都具有不同的功能,Interceptor接口是Struts2框架中定义的拦截器对象
public interface Interceptor extends Serializable{
void destory();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
**destroy()方法指示拦截器生命周期结束,它在拦截器被销毁前被调用,用于释放拦截器在初始化进所占用的一些资源。
**init()方法用于对拦截器进行一引初始化操作,它在拦截器被实例化后,intercept()方法执行前被调用。
**intercept()方法是拦截器中的主要方法,用于执行Action对象中请求处理方法以及在Action的前前后后进行一些操作,动态增强Action功能。
只有调用intercept()方法中的invocation参数的invoke()方法,才可以执行Action对象中的请求处理方法
AbstractInterceptor对象是一个抽象类,它对Interceptory接口进行了实现,只用重写intercept()方法就行了
三、使用拦截器
(1)、搭建环境
(2)、创建TestAction
public class TestAction extends ActionSupport {
@Override
public String execute() throws Exception {
// 线程睡眠1秒
Thread.sleep(1000);
return SUCCESS;
}
}
(3)、配置struts.xml文件
<struts>
<!-- 声明常量 -->
<constant name="struts.devMode" value="true"></constant>
<!-- 声明包 -->
<package name="myPackage" extends="struts-default">
<action name="testAction" class="com.lyq.action.TestAction">
<!-- 配置拦截器 -->
<interceptor-ref name="timer"/>
<!-- 配置返回页面 -->
<result>success.jsp</result>
</action>
</package>
</struts>
(4)、创建index.jsp与success.jsp
index.jsp
<body>
<a href="testAction.action">测试</a>
</body>
success.jsp
<body>
测试成功,请查看控制台程序的用时。
</body>
当访问TestAction对象扣,将看到TestAction对象执行时间大于1s,原因在第一次访问TestAction时,需要进行一引起初始化的操作,在以后的访问中就可以看到执行时间变成1秒(1000ms)