請求路徑-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應位於兩者之間。