Struts 2 是基於 MVC 設計模式的 Web 框架,本質上是一個 Servlet(FilterDispatcher),在 MVC 中擔任控制器角色,負責模型與視圖的數據交互。它融合了 Struts 1 與 WebWork 技術,以攔截器機制處理請求,實現業務邏輯與 Servlet API 解耦。
JSP 同時承擔控制器與視圖職責,邏輯混雜,維護困難。
Servlet 作為控制器分發請求,JSP 專注視圖渲染,JavaBean 封裝業務數據,職責清晰分離。
為解決重複造輪子(參數綁定、類型轉換、驗證、國際化、異常處理等),各類 MVC 框架應運而生。
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.x</version>
</dependency>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<package name="default" extends="struts-default">
<action name="hello" class="com.example.HelloAction" method="execute">
<result name="success">/hello.jsp</result>
</action>
</package>
StrutsPrepareAndExecuteFilter 攔截請求。ActionMapping 匹配 Action 配置。ActionProxy 創建 ActionInvocation。Result 類型(dispatcher、redirect、json 等)渲染視圖。ModelDriven,getModel() 返回領域對象,參數直接綁定到模型屬性。user.address.city。實現 ServletRequestAware、SessionAware、ApplicationAware 接口,框架自動注入 Map/Request 對象,避免直接依賴 Servlet API,利於單元測試。
Struts 2 默認攔截器棧 defaultStack 包含 20+ 個攔截器,完成參數綁定、類型轉換、驗證、文件上傳、國際化等橫切關注點。可自定義攔截器實現權限檢查、日誌、事務等。
scope="prototype")。validate() 代碼。exception 結果映射,友好展示錯誤頁面。Struts 2 雖非當前主流首選,但其攔截器架構、OGNL 表達式、值棧機制對理解現代框架(如 Spring MVC)極有參考價值。