struts2系統架構及處理流程
· 1.FilterDispatcher是整個Struts2的調度中心,也就是MVC中的C(控制中心),根據ActionMapper的結果來決定是否處理請求,如果ActionMapper指出該URL應該被Struts2處理,那麽它將會執行Action處理,並停止過濾器鏈上還沒有執行的過濾器。
· 2.ActionMapper 會判斷這個請求是否應該被Struts2處理,如果需要Struts2處理,ActionMapper會返回一個對象來描述請求對應的ActionInvocation的信息。
· 3.ActionProxy,它會創建一個ActionInvocation實例,
· 4.ConfigurationManager是xwork配置的管理中心,可以把它看做struts.xml這個配置文件在內存中的對應。
· 5.struts.xml,是開發人員必須光顧的地方。是Stuts2的應用配置文件,負責諸如URL與Action之間映射關系的配置、以及執行後頁面跳轉的Result配置等。
· 6.ActionInvocation:真正調用並執行Action,它擁有一個Action實例和這個Action所依賴的攔截器實例。ActionInvocation會按照指定的順序去執行這些攔截器、Action以及相應的Result。
· Interceptor(攔截器):是Struts2的基石,類似於JavaWeb的Filter,攔截器是一些無狀態的類,攔截器可以自動攔截Action,它們給開發者提供了在Action運行之前或Result運行之後來執行一些功能代碼的機會。
· 7.Action:用來處理請求,封裝數據。
二、struts2處理流程
1.當用戶的發出請求,比如http:localhost:8080/Struts2/helloworld/helloworldAction.action,請求會被Tomcat接收到,Tomcat服務器來選擇處理這個請求的Web應用,那就是由helloworld這個web工程來處理這個請求。
2.Web容器會去讀取helloworld這個工程的web.xml,
StrutsPrepareAndExecuteFilter),根據Filter的配置,找到FilterDispatcher(Struts2的調度中心)
3.然後會獲取FilterDispatcher實例,然後回調doFilter方法,進行真正的處理
PS:FilterDispatcher是任何一個Struts2應用都需要配置的,通常情況下,web.xml文件中還有其他過濾器時,FilterDispatcher是放在濾器鏈的最後;如果在FilterDispatcher前出現了如SiteMesh這種特殊的過濾器,還必須在SiteMesh前引用Struts2的ActionContextCleanUp過濾器
4.這時FilterDispatcher會將請求轉發給ActionMapper。ActionMapper負責識別當前的請求是否需要Struts2做出處理。ActionMapper就類似於公司的保安,來識別是不是當前客戶是不是我公司的人
5.如果需要Struts2處理,ActionMapper會通知FilterDispatcher,需要處理這個請求,FilterDispatcher會停止過濾器鏈以後的部分,(這也就是為什麽,FilterDispatcher應該出現在過濾器鏈的最後的原因)。然後建立一個ActionProxy實例,這個對象作為Action與xwork之間的中間層,會代理Action的運行過程。
6.ActionProxy對象在被創建出來的時候,並不知道要運行哪個Action,它手裏只有從FilterDispatcher中拿到的請求的URL。
而真正知道要運行哪個Action的是ConfigurationManager。因為只有它才能讀取我們的strtus.xml
(在服務器啟動的時候,ConfigurationManager就會把struts.xml中的所有信息讀到內存裏,並緩存,當ActionProxy帶著URL向他詢問要運行哪個Action的時候,就可以直接匹配、查找並回答了)
7.ActionProxy知道自己該幹什麽事之後(運行哪個Action、相關的攔截器以及所有可能使用的result信息),然後馬上建立ActionInvocation對象了,ActionInvocation對象描述了Action運行的整個過程。
註意:Action完整的調用過程都是由ActionInvocation對象負責
8.在execute方法之前,好像URL請求中的參數已經賦值到了Action的屬性上,這就是我們的"雷鋒"—攔截器。
攔截器的運行被分成兩部分,一部分在Action之前運行,一部分在Result之後運行,而且順序是剛好反過來的。也就是在Action執行前的順序,比如是攔截器1、攔截器2、攔截器3,那麽運行Result之後,再次運行攔截器的時候,順序就變成攔截器3、攔截器2、攔截器1了。
這就好比,你要去奶奶家,需要通過 水泊梁山->盤絲洞 -> 索馬裏,到了奶奶家,看奶奶回來的時候,就必須要通過 索馬裏 -> 盤絲洞 -> 水泊梁山。
所以ActionInvocation對象執行的時候需要通過很多復雜的過程,按照指定攔截器的順序依次執行。
9. 到了奶奶家,然後執行Action的execute方法
10. 然後根據execute方法返回的結果(Result),去struts.xml中匹配選擇下一個頁面
11.根據結果(Result)找到頁面後,在頁面上(有很多Struts2提供的模板),可以通過Struts2自帶的標簽庫來訪問需要的數據,並生成最終頁面
註意:這時還沒有給客戶端應答,只是生成了頁面
12.最後,ActionInvocation對象倒序執行攔截器,從奶奶家回來
13.ActionInvocation對象執行完畢後,已經得到響應對象(HttpServletResponse)了,最後按與過濾器(Filter)配置定義相反的順序依次經過過濾器,向客戶端展示出響應的結果
struts2系統架構及處理流程