Struts2的體系與Struts1體系的差别非常大,因為Struts2使用了WebWork的設計核心,而不是Struts1的設計核心。Struts2中大量使用攔截器來處理使用者的請求,進而允許使用者的業務邏輯控制器與Servlet API分離。
Struts2架構的大概工作機制:
從圖可以看出,一個請求在 Struts2 架構中的處理大概分為以下幾個步驟:
1、用戶端初始化一個指向 Servlet 容器(例如 Tomcat)的請求;
2、這個請求經過一系列的過濾器(Filter)(過濾器中有一個ActionContextCleanUp 可選過濾器,這個過濾器對于 Struts2 和其他架構的內建很有幫助);
3、接着 FilterDispatcher 被調用,FilterDispatcher 詢問 ActionMapper 來決定這個請求是否需要調用某個 Action;
4、如果 ActionMapper 決定需要調用某個 Action,FilterDispatcher 把請求的處理交給ActionProxy;
5、ActionProxy 通過 Configuration Manager 詢問架構的配置檔案,找到需要調用的 Action 類;
6、ActionProxy 建立一個 ActionInvocation 的執行個體。
7、ActionInvocation 執行個體使用指令模式來調用,在調用 Action 的過程前後,涉及到相關攔截器(Intercepter)的調用。
8、一旦 Action 執行完畢,ActionInvocation 負責根據 struts.xml 中的配置找到對應的傳回結果傳回結果通常是(但不總是,也可能是另外的一個 Action 鍊)一個需要被表示的 JSP 或者 FreeMarke的模版。在表示的過程中可以使用 Struts2 架構中繼承的标簽。在這個過程中需要涉及到 ActionMapper
FilterDispatcher是運作在Web應用中的,負責攔截所有的使用者請求,當使用者的請求中有以.action結尾的,就會轉到Struts2架構處理。最後根據具體的action的名來在struts.xml中調用哪一個Action。Struts2真正用于處理使用者請求的Action執行個體,并不是使用者實作的業務控制器,而是Action代理。因為使用者實作的業務控制器完全與Servlet API解耦,是以它并不能處理使用者的請求參數,而Struts提供了一系列攔截器,該系列攔截器負責将HttpServletRequest參數解析出來,傳入到最後的使用者定義的業務控制器中。這一系列過程其實就是典型的AOP(面向切面程式設計)
本文轉自 zhao_xiao_long 51CTO部落格,原文連結:http://blog.51cto.com/computerdragon/1166343