天天看點

Java Struts2 的請求處理流程詳解

一、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來解析。