延长act
个人浅析:注意struts的执行流程,当从拦截器intercepts中返回以后已经将result等对象中的到的数据交给了response对象,然后直接到达了FilterDispatcher过滤器,然后依次返回到其他过滤器,最后才真正返回response(这里说的是response中的数据)。当请求到达struts框架的时候,request进入一系列过滤器,此时filterdispatcher之上并不受FilterDispatcher过滤器清理功能的影响(因为进入的时候filterDispatcher之上的过滤器代码是在actioncleanup执行之前执行的),但是等到filterDispatcher执行完后边的流程之后又返回到了filterDispatcher,此时才执行actioncleanup,接着返回到上层过滤器,由于已经执行了actioncleanup,所以在返回的时候FilterDispatcher过滤器之上的过滤器代码受到actioncleanup清理动作的影响,无法访问到一些被清理掉的值,而如果配置ActionContextCleanUp过滤器,FilterDispatch过滤器会忽略执行actioncleanup动作,而是将这个清理工作延迟到最初的过滤器ActionContextCleanUp,此时ActionContextCleanUp与FilterDispatcher之间的过滤器不管是进入还是返回,都可以请求到所有的数据。
为了使用WebWork,我们只需要在web.xml配置FilterDispatcher一个过滤器即可,阅读一下FilterDispatcher的JavaDoc和源码,我们可以看到它调用了:
有这里的代码可知,不管有没有在此之前配置actioncleanup过滤器,在filter中清理action中的值也是通过actioncleanup中的方法实现的,而且是静态方法。(这里的cleanup方法是在finally中调用的,也就是说当方法中的其他代码执行完以后才调用的,而在这些代码的中间调用了过滤器之后的对象方法,被调用的方法又去调用它下边的对象的方法,以此类推直到最后一个类的方法被调用并且返回值,接着依次返回到finally所在的方法,并且执行完方法调用之后的代码,最后到达了finally部分,finally完成之后所在的方法会向他的调用者返回值,而此时finally已经调用了cleanup,所以高层的调用者无法获取action中的值,此时就引出了actioncleanup,如果配置了这个过滤器,那么finally部分就不会执行,那么他的高层调用者就可以访问到ActionContext中的值,直到返回到actioncleanup这个过滤器,这就是为什么说actioncleanup能够延长action的声明周期。要理解这里还需要理解面向对象的对象操作的特征)
在ActionContextCleanUp中,有这样的代码:
req.setAttribute(CLEANUP_PRESENT, Boolean.TRUE);
如果FilterDispatcher检测到这个属性,就不会清除ActionContext中的内容了,而由ActionContextCleanUp后续的代码来清除,保证了一系列的Filter访问正确的ActionContext.
文档中提到,如果用到SiteMesh的Filter或者其他类似Filter,那么设置顺序是:
<注意>在配置过滤器的时候,过滤器的执行顺序值根据配置顺序执行的(理解可能有误)