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. 安装VS2013的离线MSDN帮助文档

    作为vs的初学者,安装帮助文档有利于快速掌握.net的基本语法,对于摸索学习的同学帮助很大. VS2013和VS2012的帮助文档目前为止还是一样 下面是下载地址    http://www.micr ...

  2. ASP.NET-FineUI开发实践-8

    上回模拟的是下拉grid,这回我把下拉grid和表格自动补全放一起了,实在是好做,但是也有很多要注意的,现在分享下,大家学习. 接上回 传送门  1. 有个tbxMyBox1_TriggerClick ...

  3. zookeeper笔记

    zookeeper用于分布式配置管理,读写锁等等..后续补充.

  4. php单例模式深入讲解

    避免多次初始化数据库连接DAO 需要多次初始化数据库连接的场景 场景1: 首先PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的 一个类A需要调用多个类 ...

  5. Asp.Net WebApi Action命名中已‘Get’开头问题

    ApiController 中的Action 命名已‘Get’开头,Post方法提交失败 场景: 1.action命名使用Get开头 /// <summary> /// 获取用户的未读消息 ...

  6. 什么是DNN,Dotnetnuke介绍和功能简介

    1. What is DNN? DNN是DotNetNuke(DotNet)的简写.它是在IBUYSPY(IBUYSPY是微软用来推广ASP.NET而推出的范例程序)的基础上发展起来的,是一个免费的. ...

  7. iOS判断当前控制器是否正在显示

    +(BOOL)isCurrentViewControllerVisible:(UIViewController *)viewController { return (viewController.is ...

  8. preventDefault() 方法 取消掉与事件关联的默认动作

    前几天写的 响应键盘的图片切换 中, 键盘总是让浏览器滚动,为了取消掉默认的事件,使用了 preventDefault() 方法 定义和用法 preventDefault() 方法取消事件的默认动作. ...

  9. 1.tomcat部署项目的几种方式和weblogic部署方式及一点通讯

      第一种部署方式: 直接使用myeclipse 找到server服务 添加要部署的项目Add Deployment ,然后选中某个项目,首选Exploded Archive(development ...

  10. oracle 中 group by 加强

    group by rollup(a,b) = group by a,b + group by a + group by null SQL> select deptno,job,sum(sal) ...