web.xml/servlet过滤器之引入struts2

原创
2015/10/23 16:35
阅读数 380

首先了解FilterDispatcher和StrutsPrepareAndExecuteFilter

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的作用是延长action中属性的生命周期
自定义自己的filter: 在web.xml中要把我们自己定义的过滤器放在StrutsPrepareFilter和StrutsExecuteFilter之间。
这样我们自己定义的过滤器就能像在action中使用Action的环境

然后了解ActionContextCleanUp

一般情况下,如果你要用SiteMesh或者其他过滤器,一般是放在FilterDispatcher或者是现在的StrutsPrepareAndExecuteFilter之前。在调用完所有过滤器的doFilter方法后,核心过滤器FilterDispatcher或者StrutsPrepareAndExecuteFilter会清空ActionContext,如果其他过滤器要一直使用value stack等struts的特性时,如果不用ActionContextCleanUp的话,便得不到想要的值。 ActionContextCleanUp的作用就是上面用粗体标注出来的那一句。它会在doFilter方法里设置一个计数器counter的初始值为1,有了这个值,后续的核心过滤器就不会清空ActionContext,而是由之前的过滤器也就是ActionContextCleanUp来清空ActionContext。

所以我们引入struts2,需要在struts2中引入StrutsPrepareAndExecuteFilter和ActionContextCleanUp这2个过滤器即可。

<filter>
	<filter-name>struts-cleanup</filter-name>
	<filter-class>
		org.apache.struts2.dispatcher.ActionContextCleanUp
	</filter-class>
</filter>
<filter-mapping>
	<filter-name>struts-cleanup</filter-name>
	<url-pattern>/*</url-pattern>
	<dispatcher>REQUEST</dispatcher>
	<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter>
	<filter-name>struts2</filter-name>  
	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
</filter>
<!-- stusts过滤action,如果全部过滤则webservice无法发布 --> 
<filter-mapping>
	<filter-name>struts2</filter-name>
	<url-pattern>*.action</url-pattern>
</filter-mapping>
<!-- stusts过滤jsp,否则页面报错 --> 
<filter-mapping>   
	<filter-name>struts2</filter-name>   
	<url-pattern>*.jsp</url-pattern>   
</filter-mapping> 
<filter-mapping>   
	<filter-name>struts2</filter-name>   
	<url-pattern>/jsp/*</url-pattern>   
</filter-mapping>

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
1 收藏
0
分享
返回顶部
顶部