標籤:
一、Struts2的處理流程:
- 用戶端產生一個HttpServletRequest的請求,該請求被提交到一系列的標準過濾器(Filter)組建鏈中(如ActionContextCleanUp:它主要是清理當前線程的ActionContext、Dispatcher,FilterDispatcher主要是通過ActionMapper來決定需要調用那個Action,FilterDispatcher是控制器的核心,也是MVC中控制層的核心組建)。
- 核心控制器組建FilterDispatcher根據ActionMapper中的設定獲得是否需要調用某個Action組建來處理這個HttpServletRequest請求,如果ActionMapper決定調用某個Action組建,FilterDispatcher核心控制器組建就會把請求的處理權委託給ActionProxy組建
- ActionProxy組建通過Configuration Manager組建獲得Struts2架構的設定檔struts.xml,最後找到需要調用的目標Action組建類,然後ActionProxy組建就建立出一個實現了命令模式的ActionInvocation類的對象執行個體類的對象執行個體(這個過程包括調用Anction組建本身之前調用多個的攔截器組建的before()方法 )同時ActionInvocation組建通過代理模式調用目標Action組建。但是在調用之前ActionInvocation組建會根據設定檔中的設定項目載入與目標Action組建相關的所有攔截器組建(Interceptor)。
- 一旦Action組建執行完畢,ActionInvocation組建將根據開發人員在Struts2.xml設定檔中定義的各個設定項目獲得對象的返回結果--為這個Action組建的結果碼(一個像SUCCESS,INPUT)然後根據該返回的結果調用目標JSP頁面以實現顯示輸出。
- 最後各個攔截器組建會被再次執行(但是順序和開始時相反,並調用after()方法),然後請求最終被返回給系統的部署檔案中配置的其他過濾器,如果已經設定了ActionContextCleanUp過濾器,那麼FilterDispatcher就不會清理在ThreadLocal對象中儲存的ActionContext資訊。如果沒有設定ActionContextCleanUp過濾器,FilterDispatcher就會清除掉所有的ThreadLocal對象。
更加清晰的來說就是:
1.用戶端初始化一個指向servlet容器的請求。
2.請求經過一系列的過濾器(ActionContextCleanUp、SiteMesh)
3.FilterDispatcher被調用,並詢問ActionMapper來決定這個請求是否需要調用某個Action
4.ActionMapper決定要調用那一個Action,FilterDispatcher把請求交給ActionProxy。
5. ActionProxy通過Configurate Manager詢問Struts設定檔,找到要調用的Action類
6. ActionProxy建立一個ActionInvocation執行個體
7. ActionInvocation執行個體使用命令模式來調用,回調Action的exeute方法
8. 一旦Action執行完畢,ActionInvocation負責根據Struts.xml的配置返回結果。
二、比較重要的類的介紹:
ActionMapper其實是HttpServletRequest和Action調用請求的一個映射,他屏蔽了Action對於Request等Java servlet類的依賴。Struts2中它的預設實作類別是DefaultAtionMapper,ActionMapper很大的用處可以根據自己的需要來設計url格式,它自己也有Restful的具體實現。
ActionProxy和ActionInvocation:
Action的一個代理,由ActionProxyFactory建立,它本身不包括Action執行個體,預設實現DefaultActionProxy是由ActionInvocation持有Action執行個體。ActionProxy作用是如何取得Action,無論是本地還是遠程。而ActionInvocation的作用是如何執行Action,攔截器的功能就是咱ActionInvocation中實現的。
ConfigurateProvider和Configuration
ConfigurationProvider就是Struts2中設定檔的解析器,Struts2中的設定檔主要是實現XmlConfigurationProvider及其子類StrutsXmlConfigurationProvider來解析。
Struts2請求處理:
java架構篇---Struts2的處理流程