【struts2】Struts2的运行流程
1)前提條件
在講解流程之前,假設我們已經建立了的一個名為strutsDeepen的web工程,該工程僅僅實現了簡單的用戶登陸與歡迎界面。具體的實現為:
- 在web.xml中配置了Struts2的過濾器
- 寫了一個Action類,名稱為loginAction
- 在struts.xml中配置了這個Action類
- 寫了兩個頁面,一個是登錄頁面,一個是歡迎頁面
只做了這么點事情,就可以在Struts2的幫助下順利完成功能調用,那么Struts2內部是怎么運行的呢?逐步來根據系統架構圖進行分析。
2)運行流程
- 當用戶提交登錄請求后,請求的URL為:“/strutsDeepen/loginAction.action”,請求會被Tomcat服務器接收到,Tomcat服務器會根據請求URL中的web上下文,也就是“/strutsDeepen”,來選擇處理這個請求的Web應用,那就是由strutsDeepen這個web工程來處理這個請求。
- Web容器會去讀取strutsDeepen這個工程的web.xml,在web.xml中進行匹配,發現后綴為“.action”的請求,由struts2這個過濾器來進行處理,根據Filter的配置,找到實際的類為FilterDispatcher。
-
Web容器會獲取FilterDispatcher這個類的實例,然后回調doFilter方法,進行真正的處理。FilterDispatcher作為前端控制器,是整個Struts2的調度中心。
注意:在架構圖上,可以看到有三個過濾器層次,分別是ActionContextCleanUp、SiteMesh等其他過濾器和FilterDispatcher。這三個層次中,ActionContextCleanUp和FilterDispatcher是Struts2的過濾器,而SiteMeshSiteMesh等其他過濾器不是。
FilterDispatcher是任何一個Struts2應用都需要配置的,一般出現在過濾器鏈的最后;如果在FilterDispatcher前出現了如SiteMesh這種特殊的過濾器,還必須在SiteMesh前引用Struts2的ActionContextCleanUp過濾器。
在前面的strutsDeepen中,并沒有出現SiteMesh這種特殊的過濾器,所以只需要引用FilterDispatcher就可以了。
- FilterDispatcher將請求轉發給ActionMapper。ActionMapper負責識別當前的請求是否需要Struts2做出處理。
- ActionMapper告訴FilterDispatcher,需要處理這個請求,FilterDispatcher會停止過濾器鏈以后的部分,所以通常情況下:FilterDispatcher應該出現在過濾器鏈的最后。然后建立一個ActionProxy對象,這個對象作為Action與xwork之間的中間層,會代理Action的運行過程。
- ActionProxy對象剛被創建出來的時候,并不知道要運行哪個Action,它手里只有從FilterDispatcher中拿到的請求的URL。這時候,它去向ConfigurationManager詢問到底要運行哪個Action。某個特定的URL由哪個Action響應由誰負責,定義在什么地方呢?沒錯,在struts.xml里面。而ConfigurationManager就是負責讀取并管理struts.xml的,可以簡單的理解為ConfigurationManager是struts.xml在內存中的映像。在服務器啟動的時候,ConfigurationManager會一次性的把struts.xml中的所有信息讀到內存里,并緩存起來,以保證ActionProxy拿著來訪的URL向他詢問要運行哪個Action的時候,就可以直接匹配、查找并回答了。
-
ActionProxy拿到了運行哪個Action、相關的攔截器以及所有可能使用的result信息,就可以著手建立ActionInvocation對象了,ActionInvocation對象描述了Action運行的整個過程。
注意:Action運行絕不僅僅只是運行Action的execute方法這么簡單,還包括其他部分,完整的調用過程由ActionInvocation對象負責。
- 回憶一下,strutsDeepen中Action的execute方法運行的時候,是不是它的屬性就已經有了請求中的參數呢?這說明,在execute方法之前,有人偷偷的幫我們做了這件事,把請求中的參數賦值到了Action的屬性上,這個“有人”就是剛剛說的攔截器。攔截器的運行被分成兩部分,一部分在Action之前運行,一部分在Result之后運行,而且順序是剛好反過來的。也就是在Action執行前的順序,比如是攔截器1、攔截器2、攔截器3,那么運行Result之后,再次運行攔截器的時候,順序就變成攔截器3、攔截器2、攔截器1了。
總之ActionInvocation對象執行的時候比較復雜,會做很多事:
- 首先,按照攔截器的引用順序依次執行各個攔截器的前置部分;
- 然后,執行Action的execute方法;
- 然后,根據execute方法返回的結果,也就是Result,在struts.xml中匹配選擇下一個頁面;
- 找到頁面后,由于現在的頁面一般都是模板頁面,在頁面上,可以通過Struts2自帶的標簽庫來訪問需要的數據,并生成最終頁面;
- 最后,ActionInvocation對象再按照攔截器的引用順序的倒序依次執行各個攔截器的后置部分。
- ActionInvocation對象執行完畢后,實際上就已經得到響應對象了,也就是HttpServletResponse對象,最后按與過濾器器配置定義相反的順序依次經過過濾器,向用戶展示出響應的結果。
參考資料:http://www.iteye.com/topic/1124526
總結
以上是生活随笔為你收集整理的【struts2】Struts2的运行流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lync与Exchange 2013 U
- 下一篇: 创建新的swap文件