傳智播客-struts2(2)-請求路徑與filter處理機制

請求路徑-action名稱搜索順序
1、獲得請求路徑的URI,例如url是:http://server/struts2/path1/path2/path3/test.action

 

2、首先尋找namespace爲/path1/path2/path3的package,如果不存在這個package則執行步驟3;如果存在這個package,則在這個package中尋找名字爲test的action,當在該package下尋找不到action 時就會直接跑到默認namaspace的package裏面去尋找action(默認的命名空間爲空字符串“”),如果在默認namaspace的package裏面還尋找不到該action,頁面提示找不到action。

 

3、尋找namespace爲/path1/path2的package,如果不存在這個package,則轉至步驟4;如果存在這個package,則在這個package中尋找名字爲test的action,當在該package中尋找不到action 時就會直接跑到默認namaspace的package裏面去找名字爲test的action,在默認namaspace的package裏面還尋找不到該action,頁面提示找不到action。

 

4、尋找namespace爲/path1的package,如果不存在這個package則執行步驟5;如果存在這個package,則在這個package中尋找名字爲test的action,當在該package中尋找不到action 時就會直接跑到默認namaspace的package裏面去找名字爲test的action ,在默認namaspace的package裏面還尋找不到該action,頁面提示找不到action。

 

5、尋找namespace爲/的package,如果存在這個package,則在這個package中尋找名字爲test的action,當在package中尋找不到action或者不存在這個package時,都會去默認namaspace的package裏面尋找action,如果還是找不到,頁面提示找不到action。

 

6、如果某package的namespace=“”,則該package被視爲默認namespace的package。

 

filter處理機制
web.xml中:
<filter>
 <filter-name>struts2</filter-name>
 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
 <filter-name>struts2</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

從該文件可以看出struts2框架中,StrutsPrepareAndExecuteFilter是核心控制器。它負責攔截由<url-pattern>/*</url-pattern>指定的所有用戶請求,當用戶請求到達時,該Filter會過濾用戶的請求。當請求轉入Struts 2框架處理時會先經過一系列的攔截器,然後再到Action。與Struts1不同,Struts2對用戶的每一次請求都會創建一個Action,所以Struts2中的Action是線程安全的。

 

StrutsPrepareAndExecuteFilter是對struts2較早版本的核心控制器FilterDispatcher(文檔建議,從struts2.1.3起不再使用該類)的替代,結合了StrutsPrepareFilter與StrutsExecuteFilter的功能。

 

在struts2中,請求--other filters--StrutsPrepareAndExecuteFilter--other filters--響應。可以看出:
1、StrutsPrepareAndExecuteFilter是放在處理“請求”的其他filters之後的;
2、StrutsPrepareAndExecuteFilter處理之後對結果數據和信息不會直接放行。
因爲StrutsPrepareAndExecuteFilter直接放行的話,“響應”是在(例如)tomcat容器中直接解析路徑所得結果,如果前面的filters定義路徑時用到了struts2自己的機制,那麼tomcat解析路徑時就會出錯。

 

如果其他的Filter要訪問Struts的特性,這時候不要使用StrutsPrepareAndExecuteFilter ,而是使用StrutsPrepareFilter與StrutsExecuteFilter,並讓其他的Filter應位於兩者之間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章