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來解析。
Struts2請求處理示意圖:
相關文章
- 一個請求在Struts2框架中的處理流程框架
- Mongodb請求處理流程MongoDB
- Nginx請求處理流程你瞭解嗎?Nginx
- SpringMVC請求處理流程SpringMVC
- nginx處理http請求流程NginxHTTP
- springMVC請求流程詳解SpringMVC
- 圖解 Spring:HTTP 請求的處理流程與機制【1】圖解SpringHTTP
- Spring MVC 處理一個請求的流程分析SpringMVC
- Spring MVC框架處理Web請求的基本流程SpringMVC框架Web
- Spring MVC檔案請求處理詳解:MultipartResolverSpringMVC
- java webservice 帶請求頭方式處理JavaWeb
- ASP.Net請求處理機制初步探索之旅(5):ASP.Net MVC請求處理流程ASP.NETMVC
- Tomcat 第四篇:請求處理流程(上)Tomcat
- SpringMVC底層——請求引數處理流程描述SpringMVC
- Tomcat總體架構,啟動流程與處理請求流程Tomcat架構
- Scrapy原始碼閱讀分析_4_請求處理流程原始碼
- 請求資料處理
- wordpress 處理 ajax 請求
- .NET處理HTTP請求HTTP
- 處理REST SOE請求REST
- hive初始化、處理流程詳解Hive
- 通過重建Hosting系統理解HTTP請求在ASP.NET Core管道中的處理流程[中]:管道如何處理請求...HTTPASP.NET
- 請求處理管道個人理解
- springmvc處理ajax請求SpringMVC
- 【Tomcat】Tomat 處理請求的過程(圖解)Tomcat圖解
- java 請求HTTP返回json集合,物件處理方式JavaHTTPJSON物件
- Spring MVC原始碼(二) ----- DispatcherServlet 請求處理流程 面試必問SpringMVC原始碼Servlet面試
- ASP.NET頁面執行機制以及請求處理流程ASP.NET
- Java註解處理器使用詳解Java
- Http請求體詳解HTTP
- yai 請求預處理指令碼AI指令碼
- Go Web如何處理Web請求?GoWeb
- DeferredResult——非同步請求處理非同步
- nginx 如何處理一個請求Nginx
- Laravel請求處理管道理解Laravel
- 自定義處理頁面請求
- 關於在request請求時,處理請求引數的問題
- Spring MVC的請求處理邏輯SpringMVC