ActionContextCleanUp过滤器

来源:互联网 发布:丽都时时彩源码 编辑:程序博客网 时间:2024/05/21 21:37

延长action中属性的生命周期,包括自定义属性(这里延长的是整个action对象的生命周期,所以对于action当中的所有数据都有延长作用),以便在jsp页面中进行访问(这个说法我表示深深的怀疑),让actionContextcleanup过滤器来清除属性,不让action自己清除。

个人浅析:注意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和源码,我们可以看到它调用了:

 finally
 {
            ActionContextCleanUp.cleanUp(req);
 

有这里的代码可知,不管有没有在此之前配置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,那么设置顺序是:

 ActionContextCleanUp filter
 SiteMesh filter
 FilterDispatcher
 所以最后我们的web.xml应该类似这样:

<注意>在配置过滤器的时候,过滤器的执行顺序值根据配置顺序执行的(理解可能有误)

    <filter>
        <filter-name>ActionContextCleanUp</filter-name>
        <filter-class>com.opensymphony.webwork.dispatcher.ActionContextCleanUp</filter-class>
    </filter>

    <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.webwork.sitemesh.FreeMarkerPageFilter</filter-class>
    </filter>

    <filter>
        <filter-name>webwork</filter-name>
        <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>ActionContextCleanUp</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>webwork</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

0 0
原创粉丝点击