struts2 之六:拦截器

前言

拦截器是structs2框架的核心功能,理解并使用拦截器有助于更灵活使用structs2.它像一个可插播的组件,围绕action和result进行,可以在方法调用之前、之后使用。通过structs2的工作流程,可以发现调用一个action之前之后有许多的拦截器,这些拦截器都通过后才可以执行具体的action。对与每一个拦截器来说,可以直接返回,从而终止余下的拦截器

以下,是structs工作原理图
Alt text

从图中可以看出,从一个具体的请求到action需要经过多个拦截器,action处理完成后,后续的拦截器会据需执行,最终到浏览器中。大概其工作流程如下

上述的servlet filters图示与实际有点不一样,其他一样(图不是现在版本)

一 首先请求发送给StrutsPrepareAndExecuteFilter(web.xml配置那个)

二:StrutsPrepareAndExecuteFilter判断该请求是否是一个structs2请求,如果是则进入第3步

三:如果是structs2请求,则把请求交给ActionProxy,是action代理类,ActionProxy创建一个Actioninvocation实例,并进行初始化

在执行具体的action之前,actionProxy会设计相关拦截器的调用
Action调用结束后,会根据structs.xml文件中action的result配置对象得到对应的返回结果。调用execute方法之后,执行后面的拦截器,把结果返回给浏览器

从整个请求处理过程来看,拦截器是处理的关键

下面将通过实现Interceptor接口来写一个简单的拦截器,
该接口有三个方法,init(),destroy(),intercept(),init()在拦截器实例创建之后,intercept方法之前调用,主要用于初始化拦截器所需要的资源,destroy主要销毁初始化分配的资源,intercept方法则是在action之前调用,可以通过invocation对象获取action状态,从而根据状态的不同进行需要的拦截操作
如下为一个简单的模拟案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class lanji implements Interceptor {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init() {
// TODO Auto-generated method stub
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
long start=System.currentTimeMillis();
String result=invocation.invoke();//没有拦截,正常执行
long end=System.currentTimeMillis();
System.out.println(end-start);
return result;
}
}

然后就需要在配置文件中配置
首先申明该拦截器

1
2
3
4
5
6
7
8
<interceptors>
<interceptor name="lanji" class="com.zwl.pojo.lanji"></interceptor>
</interceptors>
在action中引用
<action name="ognlaction" class="com.zwl.action.ognlaction">
<interceptor-ref name="lanji"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>

注意必须要带上默认拦截器

热评文章