struts2中

ActionContextCleanUp,

StrutsPrepareAndExecuteFilter,

StrutsPrepareFilter,StrutsExecuteFilter,

FilterDispatcherd

刚看了文档中的描述(说的很清楚了,还是文档好啊):

org.apache.struts2.dispatcher

Class FilterDispatcher

Deprecated. Since Struts 2.1.3, use StrutsPrepareAndExecuteFilter instead or StrutsPrepareFilter and StrutsExecuteFilter if needing using theActionContextCleanUp filter in addition to this one

org.apache.struts2.dispatcher 
Class ActionContextCleanUp

Deprecated. Since Struts 2.1.3, use StrutsPrepareFilter and StrutsExecuteFilter to use other Servlet filters that need access to the ActionContext

org.apache.struts2.dispatcher.ng.filter 
Class StrutsPrepareAndExecuteFilter

Handles both the preparation and execution phases of the Struts dispatching process. This filter is better to use when you don't have another filter that needs access to action context information, such as Sitemesh.

org.apache.struts2.dispatcher.ng.filter 
Class StrutsPrepareFilter

Prepares the request for execution by a later StrutsExecuteFilter filter instance.

org.apache.struts2.dispatcher.ng.filter 
Class StrutsExecuteFilter

Executes the discovered request information. This filter requires the StrutsPrepareFilter to have already been executed in the current chain.

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

FilterDispatcher是struts2.0.x到2.1.2版本的核心过滤器.
StrutsPrepareAndExecuteFilter是自2.1.3开始就替代了FilterDispatcher的.

StrutsPrepareAndExecuteFilter是StrutsPrepareFilter和StrutsExecuteFilter的组合,那什么时候用StrutsPrepareFilter和StrutsExecuteFilter的组合来替代StrutsPrepareAndExecuteFilter呢?下面会讲到。

这样的改革当然是有好处的.
为什么这么说.? 应该知道如果我们自己定义过滤器的话, 是要放在strtus2的过滤器之前的, 如果放在struts2过滤器之后,你自己的过滤器对action的过滤作用就废了,不会有效!除非你是访问jsp/html! 
那我现在有需求, 我必须使用Action的环境,而又想在执行action之前拿filter做一些事, 用FilterDispatcher是做不到的.! 
那么StrutsPrepareAndExecuteFilter可以把他拆分成StrutsPrepareFilter和StrutsExecuteFilter,可以在这两个过滤器之间加上我们自己的过滤器.! 
给你打个比喻, 现在有病人要做手术, 现在struts2要做两件事, 搭病床(环境),执行手术.! 那么打麻药的工作呢.? 不可能要病人站着打吧, 所以必须有病床的环境,打完麻药之后再动手术.! 这个比喻非常形象了.!

ActionContextCleanUp也是自2.1.3开始由StrutsPrepareFilter和StrutsExecuteFilter的组合替代。

看个例子:

在2.1.3之前用sitemesh的web.xml的配置:

  1. <filter>
  2. <filter-name>ActionContextCleanUp</filter-name>
  3. <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
  4. </filter>
  5. <filter>
  6. <filter-name>sitemesh</filter-name>
  7. <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
  8. </filter>
  9. <filter>
  10. <filter-name>struts2</filter-name>
  11. <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>ActionContextCleanUp</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>
  17. <filter-mapping>
  18. <filter-name>sitemesh</filter-name>
  19. <url-pattern>/*</url-pattern>
  20. </filter-mapping>
  21. <filter-mapping>
  22. <filter-name>struts2</filter-name>
  23. <url-pattern>/*</url-pattern>
  24. </filter-mapping>
<filter>   <filter-name>ActionContextCleanUp</filter-name>   <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class></filter><filter>   <filter-name>sitemesh</filter-name>   <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class></filter><filter>   <filter-name>struts2</filter-name>   <filter-class>org.apache.struts2.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>struts2</filter-name>   <url-pattern>/*</url-pattern></filter-mapping>

其中ActionContextCleanUp filter
 SiteMesh filter
 FilterDispatcher的顺序不能改变。

ActionContextCleanUp的作用是延长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。

自Struts2是2.1.3版本开始,死活不得行,总是报错。原来新版本中已经不能再采用这种方式了。
【从struts2.1.3开始ActionContextCleanUp 和 FilterDispatcher过滤器,已经不建议使用了。
   将使用StrutsPrepareFilter和StrutsExecuteFilter拦截器替代】
而从Struts2.1.3开始应该改为以下配置才能集成起来,要不然你的装饰器页面或者被装饰页面
里面将不能使用Struts2的标签。一使用就会报错说什么the Struts Dispatcher not found

  1. <filter>
  2. <filter-name>StrutsPrepareFilter</filter-name>
  3. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
  4. </filter>
  5. <filter>
  6. <filter-name>sitemesh</filter-name>
  7. <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
  8. </filter>
  9. <filter>
  10. <filter-name>StrutsExecuteFilter</filter-name>
  11. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>StrutsPrepareFilter</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>
  17. <filter-mapping>
  18. <filter-name>sitemesh</filter-name>
  19. <url-pattern>/*</url-pattern>
  20. </filter-mapping>
  21. <filter-mapping>
  22. <filter-name>StrutsExecuteFilter</filter-name>
  23. <url-pattern>/*</url-pattern>
  24. </filter-mapping>
<filter>   <filter-name>StrutsPrepareFilter</filter-name>   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class></filter><filter>   <filter-name>sitemesh</filter-name>   <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class></filter><filter>   <filter-name>StrutsExecuteFilter</filter-name>   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class></filter><filter-mapping>   <filter-name>StrutsPrepareFilter</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>StrutsExecuteFilter</filter-name>   <url-pattern>/*</url-pattern></filter-mapping>

按StrutsPrepareFilter,sitemesh,StrutsExecuteFilter的顺序配置过滤器,sitemesh夹在中间。

通过以上配置能正确使用。

struts2.1.3之后使用自定义Filter的更多相关文章

  1. Struts2 源码分析——过滤器(Filter)

    章节简言 上一章笔者试着建一个Hello world的例子.是一个空白的struts2例子.明白了运行struts2至少需要用到哪一些Jar包.而这一章笔者将根据前面章节(Struts2 源码分析—— ...

  2. Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url

    Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url 1.1. 原理流程1 2. Invoke1 3. StrutsX2 1.1. 原理流程 读取struts配 ...

  3. Asp.net mvc自定义Filter简单使用

    自定义Filter的基本思路是继承基类ActionFilterAttribute,并根据实际需要重写OnActionExecuting,OnActionExecuted,OnResultExecuti ...

  4. Jinja2模版语言自定义filter的使用

    Jinja2模版语言,自带有一些filter,能够在前端的模版中控制数据按照相应的方式显示.比如以下两种filter,分别能在前端控制数字的近似精度显示和根据字符串长度补齐: round(value, ...

  5. HBase笔记--自定义filter

    自定义filter需要继承的类:FilterBase 类里面的方法调用顺序   方法名 作用 1 boolean filterRowKey(Cell cell) 根据row key过滤row.如果需要 ...

  6. Spring MVC 项目搭建 -6- spring security 使用自定义Filter实现验证扩展资源验证,使用数据库进行配置

    Spring MVC 项目搭建 -6- spring security使用自定义Filter实现验证扩展url验证,使用数据库进行配置 实现的主要流程 1.创建一个Filter 继承 Abstract ...

  7. Spring-Security 自定义Filter完成验证码校验

    Spring-Security的功能主要是由一堆Filter构成过滤器链来实现,每个Filter都会完成自己的一部分工作.我今天要做的是对UsernamePasswordAuthenticationF ...

  8. DirectX:在graph自动连线中加入自定义filter(graph中遍历filter)

    为客户提供的视频播放的filter的测试程序中,采用正向手动连接的方式(http://blog.csdn.net/mao0514/article/details/40535791),由于不同的视频压缩 ...

  9. Spring Security 入门(1-6-2)Spring Security - 内置的filter顺序、自定义filter、http元素和对应的filterChain

    Spring Security 的底层是通过一系列的 Filter 来管理的,每个 Filter 都有其自身的功能,而且各个 Filter 在功能上还有关联关系,所以它们的顺序也是非常重要的. 1.S ...

随机推荐

  1. LINQ Enumerable 续 II

    Enumerable.TakeWhile和Enumerable.SkpWhile Enumerable.TakeWhile和Enumerable.SkpWhile将通过判断条件,来获取和跳过序列. T ...

  2. bootsrtap (-)

    1.text-muted:提示,使用浅灰色(#999).text-primary:主要,使用蓝色(#428bca).text-success:成功,使用浅绿色(#3c763d).text-info:通 ...

  3. osgi与webservice

    osgi简介: http://osgia.com/ http://blog.csdn.net/xiaokui008/article/details/9662933 http://wdhdd889.it ...

  4. 基于PHP和mysql的自动生成表单

    开发背景:公司要求管理系统能够由管理员在前台页面管理系统表单,能够对表单进行增删改查基本操作,表单的各个字段都可以被修改.删除,可以添加新的字段,并且不影响系统正常运行,前台表单展示要由系统自动处理, ...

  5. php设计模式 1单例模式

    之前很长时间之前就学习过设计模式,但是因为在实践中很少应用,所以忽略了,但现在却意识到设计模式很重要的,程序设计简介高效冗余性代码少. 今天开始把前几天学习的几个设计模式整理一下,首先当然是单例模式. ...

  6. Linux_cloudera-scm-agent: unrecognized service

  7. Java基础学习第二天

    ================每日必读==================== 写代码: 1.明确需求.我需要实现什么需求? 2.分析思路.我需要怎么实现需求? 3.确定步骤.我的每一部分思路需要使 ...

  8. SQL Server 2012数据库还原所遇到的问题

    在SQL Server2005及以下版本做数据库备份还原时,需要首先建立数据库,然后才能进行数据库还原操作:而在SQL Server2005以上版本做数据库还原时,不需要建立数据库,可以直接进行数据库 ...

  9. PHP中的常量

    常量与变量不一样,一旦被定义就可以全局访问. 例如: <?php define('CONST_NAME','shiyingyan'); define('RESULT_OK',1); define ...

  10. 标签 Attribute

    在一个类上面放一个标签,可以用来表示一些特定规则,比如某个对象的某个属性不想被json化,那么我们在它头上放个标签就行了,或是做ORM时指定某个Class对应的table名字等. 最后标签是通过反射来 ...