Java Struts2 的請求處理流程詳解

偶my耶的部落格發表於2015-03-31

一、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的處理流程

相關文章