Struts2 框架

一、Struts2是什麼?

Struts2 是 Apache 軟件組織推出的一個相當強大的 Java Web 開源框架,本質上相當於一個 servlet。Struts2 基於 MVC 架構,框架結構清晰。通常作爲控制器(Controller)來建立模型與視圖的數據交互,用於創建企業級 Java web 應用程序,它爲Java Web應用提供了模型-視圖-控制器(zhiModel-View- Controller,簡稱MVC)框架。

Struts 直譯過來就是 「支柱,枝幹」 的意思,它的目的是爲了減少程序開發的時間,項目的創建者認爲 JSP、Servlet 的存在雖然可以幫助用戶解決大部分問題,但是由於它們的編碼對項目的開發帶來了許多的不方便,可重用性也差,所以 Struts 應運而生,幫助用戶在最短的時間內解決這些問題,其作用就像是 「支柱」 一樣。

Struts2 是 Struts 的下一代產品。它在 Struts 和 WebWork 的技術基礎上進行了合併,產生了全新的 Struts2 框架。Struts2 修復了大量錯誤和漏洞,並且體系結構和第一代 Struts 存在巨大差別(因爲其實Struts2 主要是由 WebWork 衍生而來),我們接下來的 Struts 開發課程也以 Struts2 爲基礎。

二、Struts體系結構

在這裏插入圖片描述

橙色是Servlet Filters,過濾器鏈,所有的請求都要經過Filter鏈的處理。
淺藍色是Struts Core,Struts2的核心部分,Struts2中已經做好的功能,在實際開發中不需要動它們。
淺綠色是Interceptors,Struts2的攔截器。Struts2提供了很多默認的攔截器,可以完成日常開發的絕大部分工作;當然,也可以自定義攔截器,用來實現具體業務需要的功能。
淺黃色是User Created,由開發人員創建的,包括struts.xml、Action、Template,是每個使用Struts2來進行開發的人員都必須會的。


各模塊說明
首先看看它們各自的功能,跟着圖上的箭頭一個一個來看:

FilterDispatcher是整個Struts2的調度中心,根據ActionMapper的結果來決定是否處理請求,如果ActionMapper指出該URL應該被Struts2處理,那麼它將會執行Action處理,並停止過濾器鏈上還沒有執行的過濾器。
ActionMapper提供了HTTP請求與action執行之間的映射,簡單點說,ActionMapper會判斷這個請求是否應該被Struts2處理,如果需要Struts2處理,ActionMapper會返回一個對象來描述請求對應的ActionInvocation的信息。
ActionProxy是一個特別的中間層,位於Action和xwork之間,使得我們在將來有機會引入更多的實現方式,比如通過WebService來實現等。
ConfigurationManager是xwork配置的管理中心,通俗的講,可以把它看做struts.xml這個配置文件在內存中的對應。
struts.xml是Stuts2的應用配置文件,負責諸如URL與Action之間映射的配置、以及執行後頁面跳轉的Result配置等。
ActionInvocation:真正調用並執行Action,它擁有一個Action實例和這個Action所依賴的攔截器實例。ActionInvocation會執行這些攔截器、Action以及相應的Result。
Interceptor(攔截器):攔截器是一些無狀態的類,攔截器可以自動攔截Action,它們給開發者提供了在Action運行之前或Result運行之後來執行一些功能代碼的機會。類似於我們熟悉的javax.servlet.Filter。
Action:動作類是Struts2中的動作執行單元。用來處理用戶請求,並封裝業務所需要的數據。
Result:Result就是不同視圖類型的抽象封裝模型,不同的視圖類型會對應不同的Result實現,Struts2中支持多種視圖類型,比如Jsp,FreeMarker等。
Templates:各種視圖類型的頁面模板,比如JSP就是一種模板頁面技術。

Tag Subsystem:Struts2的標籤庫,它抽象了三種不同的視圖技術JSP、velocity、freemarker,可以在不同的視圖技術中,幾乎沒有差別的使用這些標籤。


Struts2請求流程:
1、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求;

2、這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin);

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或者FreeMarker的模版。在表示的過程中可以使用Struts2框架中繼承的標籤。在這個過程中需要涉及到ActionMapper。

三、Struts2 的優點

下面列舉 Struts2 的一些主要優點。

Struts2 是非侵入式設計,即不依賴於Servlet API 和 Struts API.

Struts2 提供了強大的攔截器,利用攔截器可以進行 AOP編程(面向切面的編程),實現如權限攔截等功能。

Struts2 提供了類型轉換器,可以很方便地進行類型轉換,例如將特殊的請求參數轉換成需要的類型。

Struts2 支持多種表現層技術,如 JSP、FreeMarker、Velocity 等。

Struts2 的輸入驗證可以對指定的方法進行驗證。

參考資料: https://www.jianshu.com/p/924c321908d1 https://blog.csdn.net/guodongsoft/article/details/52456443