struts2 中的 Filter (转载)

struts2中

ActionContextCleanUp,

StrutsPrepareAndExecuteFilter,

StrutsPrepareFilter,StrutsExecuteFilter,

FilterDispatcher

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

org.apache.struts2.dispatcher

ClassFilterDispatcher

Deprecated.SinceStruts2.1.3,useStrutsPrepareAndExecuteFilterinsteadorStrutsPrepareFilterandStrutsExecuteFilterifneedingusingtheActionContextCleanUpfilterinadditiontothisone

org.apache.struts2.dispatcher

ClassActionContextCleanUp

Deprecated.SinceStruts2.1.3,useStrutsPrepareFilterandStrutsExecuteFiltertouseotherServletfiltersthatneedaccesstotheActionContext

org.apache.struts2.dispatcher.ng.filter

ClassStrutsPrepareAndExecuteFilter

HandlesboththepreparationandexecutionphasesoftheStrutsdispatchingprocess.Thisfilterisbettertousewhenyoudon'thaveanotherfilterthatneedsaccesstoactioncontextinformation,suchasSitemesh.

org.apache.struts2.dispatcher.ng.filter

ClassStrutsPrepareFilter

PreparestherequestforexecutionbyalaterStrutsExecuteFilterfilterinstance.

org.apache.struts2.dispatcher.ng.filter

ClassStrutsExecuteFilter

Executesthediscoveredrequestinformation.ThisfilterrequirestheStrutsPrepareFiltertohavealreadybeenexecutedinthecurrentchain.

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

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的配置:

Xml代码收藏代码

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

其中ActionContextCleanUpfilter

SiteMeshfilter

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的标签。一使用就会报错说什么theStrutsDispatchernotfound

Xml代码收藏代码

<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夹在中间。

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

相关推荐