首先了解FilterDispatcher和StrutsPrepareAndExecuteFilterhtml
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的環境web
而後瞭解ActionContextCleanUpapache
通常狀況下,若是你要用SiteMesh或者其餘過濾器,通常是放在FilterDispatcher或者是如今的StrutsPrepareAndExecuteFilter以前。在調用完全部過濾器的doFilter方法後,核心過濾器FilterDispatcher或者StrutsPrepareAndExecuteFilter會清空ActionContext,若是其餘過濾器要一直使用value stack等struts的特性時,若是不用ActionContextCleanUp的話,便得不到想要的值。 ActionContextCleanUp的做用就是上面用粗體標註出來的那一句。它會在doFilter方法裏設置一個計數器counter的初始值爲1,有了這個值,後續的核心過濾器就不會清空ActionContext,而是由以前的過濾器也就是ActionContextCleanUp來清空ActionContext。app
因此咱們引入struts2,須要在struts2中引入StrutsPrepareAndExecuteFilter和ActionContextCleanUp這2個過濾器便可。jsp
<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>