1.strut 過濾器
filterdispatcher是struts2.0.x到2.1.2版本的核心過濾器.! strutsprepareandexecutefilter是自2.1.3開始就替代了filterdispatcher的.! 這樣的改革當然是有好處的.! 為什麼這麼說.? 應該知道如果我們自己定義過濾器的話, 是要放在strtus2的過濾器之前的, 如果放在struts2過濾器之後,你自己的過濾器對action的過濾作用就廢了,不會有效!除非你是通路jsp/html!
那我現在有需求, 必須使用action的環境,而又想在執行action之前拿filter做一些事, 用filterdispatcher是做不到的.! 那麼strutsprepareandexecutefilter可以把他拆分成strutspreparefilter和strutsexecutefilter,可以在這兩個過濾器之間加上我們自己的過濾器.!
示例代碼:
2. web.xml中 servlet和filter的url-pattern映射規則
一,servlet容器對url的比對過程:
當一個請求發送到servlet容器的時候,容器先會将請求的url減去目前應用上下文的路徑作為servlet的映射url,比如我通路的是http://localhost/test/aaa.html,我的應用上下文是test,容器會将http://localhost/test去掉,剩下的/aaa.html部分拿來做servlet的映射比對。這個映射比對過程是有順序的,而且當有一個servlet比對成功以後,就不會去理會剩下的servlet了。
其比對規則和順序如下:
1. 精确路徑比對。例子:比如servleta 的url-pattern為 /test,servletb的url-pattern為 /* ,這個時候,如果我通路的url為http://localhost/test ,這個時候容器就會先進行精确路徑比對,發現/test正好被servleta精确比對,那麼就去調用servleta,也不會去理會其他的servlet了。
3. 擴充比對,如果url最後一段包含擴充,容器将會根據擴充選擇合适的servlet。例子:servleta的url-pattern:*.action
4. 如果前面三條規則都沒有找到一個servlet,容器會根據url選擇對應的請求資源。如果應用定義了一個default servlet,則容器會将請求丢給default servlet。
根據這個規則表,就能很清楚的知道servlet的比對過程,是以定義servlet的時候也要考慮url-pattern的寫法,以免出錯。
對于filter,不會像servlet那樣隻比對一個servlet,因為filter的集合是一個鍊,是以隻會有處理的順序不同,而不會出現隻選擇一個filter。filter的處理順序和filter-mapping在web.xml中定義的順序相同。
二,url-pattern詳解
l. 以”/’開頭和以”/*”結尾的是用來做路徑映射的。
2. 以字首”*.”開頭的是用來做擴充映射的。
3. “/” 是用來定義default servlet映射的。
4. 剩下的都是用來定義詳細映射的。比如: /aa/bb/cc.action
是以”/*.action”這樣一個看起來很正常的比對會錯?因為這個比對即屬于路徑映射,也屬于擴充映射,導緻容器無法判斷。
3.配置不經過strut過濾器直接通路jsp頁面
參考文章:
<a href="http://www.cnblogs.com/mailingfeng/archive/2012/04/05/2432687.html" target="_blank">http://www.cnblogs.com/mailingfeng/archive/2012/04/05/2432687.html</a>