• ActionContextCleanUp作用


     转自:https://www.cnblogs.com/sunxucool/archive/2013/06/04/3117193.html

    延长action中属性的生命周期,包括自定义属性,以便在jsp页面中进行访问,让actionContextcleanup过滤器来清除属性,不让action自己清除。

        为了使用WebWork,我们只需要在web.xml配置FilterDispatcher一个过滤器即可,阅读一下FilterDispatcher的JavaDoc和源码,我们可以看到它调用了:

     finally
     {
                ActionContextCleanUp.cleanUp(req);
     } 

    在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>


    ---------------------------------------------------------------------------------------------------------------------

    在Struts 2.1.6之前,ActionContextCleanUp的完整路径是com.opensymphony.webwork.dispatcher.ActionContextCleanUp,现在的路径变成了org.apache.struts2.dispatcher.ActionContextCleanup。

         那么这个类究竟有什么用处呢?是不是一定要用呢?

         下面是这个类内部的注释。

         Special filter designed to work with the FilterDispatcher and allow
    for easier integration with SiteMesh. Normally, ordering your filters to have
    SiteMesh go first, and then FilterDispatcher go second is perfectly fine.
    However, sometimes you may wish to access Struts features, including the
    value stack, from within your SiteMesh decorators. Because FilterDispatcher
    cleans up the ActionContext, your decorator won't have access to the
    data you want.
         By adding this filter, the FilterDispatcher will know to not clean up and
    instead defer cleanup to this filter. The ordering of the filters should then be:
    1.this filter

    2.SiteMesh filter

    3.FilterDispatcher

     

          就是说,一般情况下,如果你要用SiteMesh或者其他过滤器,一般是放在FilterDispatcher或者是现在的StrutsPrepareAndExecuteFilter之前。在调用完所有过滤器的doFilter方法后,核心过滤器FilterDispatcher或者StrutsPrepareAndExecuteFilter会清空ActionContext,如果其他过滤器要一直使用value stack等struts的特性时,如果不用ActionContextCleanUp的话,便得不到想要的值。

     

         ActionContextCleanUp 的作用就是上面用粗体标注出来的那一句。它会在doFilter方法里设置一个计数器counter的初始值为1,有了这个值,后续的核心过滤器就不会清 空ActionContext,而是由之前的过滤器也就是ActionContextCleanUp来清空ActionContext。

  • 相关阅读:
    【题解】Luogu1308 统计单词数
    【题解】Luogu1739 表达式括号匹配
    等待
    封城日记
    【题解】luoguP5717三角形分类
    【题解】LuoguP1059明明的随机数
    我是一个跳表
    【JVM故事】了解JVM的结构,好在面试时吹牛
    【JVM故事】一个Java字节码文件的诞生记
    Java多线程通关——基础知识挑战
  • 原文地址:https://www.cnblogs.com/sharpest/p/6206187.html
Copyright © 2020-2023  润新知