一、拦截器工作原理
拦截器的执行过程是一个递归的过程,(intercept1,intercept2,intercept3,intercept3,intercept2,intercept1)。与在Web中过滤器的工作原理是几乎一样的。
二、自定义拦截器(有两种方式)
1、实现(implements) Interceptor接口,则需要实现(可以空实现)以下三个方法:
void init():初始化拦截器所需资源
void destory():释放在init()中分配的资源
String intercept(ActionInvocation ai) throws Exception 在调用拦截器时真正执行的方法,实现拦截器功能,利用ActionInvocation参数获取Action状态,返回result字符串作为逻辑视图
2、继承AbstractInterceptor类,AbstractInterceptor实现了Intercept接口,对init()、destory()方法做出了空实现,则它的子类就不再实现了,
只需要实现intercept()方法。
在拦截器的方法中,若本拦截器的功能执行完毕,要调用后面的拦截器(若是最后一个拦截器,则调用的是目标执行的action),只需要在方法中写上invocation.invoke();即可
-----------------------------------eg:计算执行Action花费的时间------------------------------------------
public class MyInterceptor extends AbstractInterceptor{
//进入拦截器,会自动调用此方法
public String intercept(ActionInvocation invocation) throws Exception{
//执行Action之前
long start=System.currentTimeMills();
//执行下一个拦截器,如果 已是最后一个拦截器,则执行目标Action
String result= invocation.invoke(); / /result为最终的结果视图
long end = System.currentTimeMillis();
System.out.println("执行Action花费的时间:"+(end - start) +"ms");
return result;
}
}
在struts.xml中配置拦截器
<package name="default" namespace="/" extends="struts-default">
<!--声明拦截器-->
<interceptors>
<interceptor name="myInterceptor" class="com.yc.interceptor.MyInterceptor"></interceptor>
<!--自定义拦截器栈-->
<interceptor-stack name="mystack">
<interceptor-ref name="defaultStack></interceptor-ref>
<interceptor-ref name="myInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="timer" class="com.yc.TimerAction">
<result>/success.jsp</result>
<!--引用拦截器-->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<!--引用自定义的拦截器栈-->
<interceptor-ref name="myStack"></interceptor-ref>
</action>
二、Struts2内建拦截器
1、params拦截器:负责将请求参数设置为Action属性
2、staticParams拦截器:可以将struts.xml配置文件中action元素的子元素param参数设置为Action属性
3、servletConfig拦截器:将源于Servlet API的各种对象注入到Action,必须实现对应接口
4、fileUpload拦截器:对文件上传提供支持,将文件和元数据设置对应的Action属性(内部有调用Commons-FileUpload组件,对这个组件做了封装)
5、exception拦截器:捕获异常,并将异常映射到用户自定义的错误页面
6、validation拦截器:调用验证框架进行数据验证
可去struts-core包中的struts-default.xml中查看所有配置的栈,
只要在定义包的过程中,继承struts-default包,那么defaultStack(struts-default.xml中配置的一个拦截器栈)将是默认为拦截器
当为包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用,要用默认的拦截器,还需要显式的引用一次
拦截器栈中的各个拦截器的顺序很重要。