首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Struts 2 框架深度解析:從 MVC 基礎到核心機制

     編輯:Java 綜合教學

Struts 2 框架深度解析:從 MVC 基礎到核心機制

Struts 2 是基於 MVC 設計模式的 Web 框架,本質上是一個 Servlet(FilterDispatcher),在 MVC 中擔任控制器角色,負責模型與視圖的數據交互。它融合了 Struts 1 與 WebWork 技術,以攔截器機制處理請求,實現業務邏輯與 Servlet API 解耦。

一、認識 Web 框架演進

模型 1:JSP + JavaBean

JSP 同時承擔控制器與視圖職責,邏輯混雜,維護困難。

模型 2 / MVC:Servlet + JSP + JavaBean

Servlet 作為控制器分發請求,JSP 專注視圖渲染,JavaBean 封裝業務數據,職責清晰分離。

Web 框架誕生

為解決重複造輪子(參數綁定、類型轉換、驗證、國際化、異常處理等),各類 MVC 框架應運而生。

二、Struts 1 到 Struts 2 的變革

Struts 1 痛點

  • Action 為單例,線程不安全,需小心處理實例變量。
  • 強依賴 Servlet API(HttpServletRequest/Response),測試困難。
  • 表單數據綁定僅支持簡單類型,復雜對象綁定麻煩。
  • 標簽庫功能弱,前端開發體驗差。

Struts 2 核心改進

  • 基於攔截器鏈,Action 為多例(原型模式),天然線程安全。
  • 通過 ValueStack/OGNL 實現強大的數據綁定與表達式語言。
  • 提供豐富的 UI 標簽、主題模板,支援 AJAX、模板引擎。
  • 插件化架構,支持 REST、JSON、Spring、Hibernate 等無縫集成。

三、開發環境搭建與 Hello World

核心依賴

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.5.x</version>
</dependency>

web.xml 配置核心過濾器

<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>

struts.xml 定義 Action 映射

<package name="default" extends="struts-default">
    <action name="hello" class="com.example.HelloAction" method="execute">
        <result name="success">/hello.jsp</result>
    </action>
</package>

四、核心機制深度剖析

1. 請求處理流程

  1. StrutsPrepareAndExecuteFilter 攔截請求。
  2. ActionMapping 匹配 Action 配置。
  3. ActionProxy 創建 ActionInvocation。
  4. 攔截器鏈依次執行(params、modelDriven、validation、workflow 等)。
  5. 調用 Action 方法(execute 或指定 method)。
  6. 根據返回結果字符串,查找 Result 類型(dispatcher、redirect、json 等)渲染視圖。

2. 數據綁定三種方式

  • 屬性驅動:Action 定義同名屬性 + setter,自動綁定請求參數。
  • ModelDriven:實現 ModelDriven,getModel() 返回領域對象,參數直接綁定到模型屬性。
  • 表達式綁定:通過 OGNL 表達式訪問值棧任意深度屬性,如 user.address.city。

3. 訪問 Servlet API 的解耦方式

實現 ServletRequestAware、SessionAware、ApplicationAware 接口,框架自動注入 Map/Request 對象,避免直接依賴 Servlet API,利於單元測試。

4. 攔截器機制

Struts 2 默認攔截器棧 defaultStack 包含 20+ 個攔截器,完成參數綁定、類型轉換、驗證、文件上傳、國際化等橫切關注點。可自定義攔截器實現權限檢查、日誌、事務等。

五、項目開發最佳實踐

  • Action 類採用原型模式(Spring 中配置 scope="prototype")。
  • 業務邏輯下沉到 Service 層,Action 僅負責參數接收、調用服務、返回結果。
  • 校驗邏輯優先使用註解或 XML 驗證框架,減少手工 validate() 代碼。
  • 結果視圖優先使用 JSP + Struts 標簽,或整合 FreeMarker/Velocity/Thymeleaf。
  • 異常處理配置全局 exception 結果映射,友好展示錯誤頁面。

Struts 2 雖非當前主流首選,但其攔截器架構、OGNL 表達式、值棧機制對理解現代框架(如 Spring MVC)極有參考價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved