前言
拦截器是structs2框架的核心功能,理解并使用拦截器有助于更灵活使用structs2.它像一个可插播的组件,围绕action和result进行,可以在方法调用之前、之后使用。通过structs2的工作流程,可以发现调用一个action之前之后有许多的拦截器,这些拦截器都通过后才可以执行具体的action。对与每一个拦截器来说,可以直接返回,从而终止余下的拦截器
以下,是structs工作原理图
从图中可以看出,从一个具体的请求到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状态,从而根据状态的不同进行需要的拦截操作
如下为一个简单的模拟案例
|
|
然后就需要在配置文件中配置
首先申明该拦截器
注意必须要带上默认拦截器