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

Struts2 框架核心架構深度解析:MVC 實現、攔截器機制與優缺點權衡

     編輯:Java 綜合教學

Struts2 框架核心架構深度解析

Struts2 作為經典的 Java Web MVC 框架,雖然在 Spring MVC 與 Spring Boot 浩蕩浪潮中逐漸淡出主流視野,但其設計思想仍具備極高的學習價值。本文從架構原理、核心組件、優缺點對比三個維度,為你深度剖析這個「輕量級」框架的內幕。

核心架構定位

本質:一個基於 MVC 設計模式的 Web 應用框架,本質上相當於一個 Filter(Struts2 核心控制器 StrutsPrepareAndExecuteFilter)

角色:在 MVC 中擔任 Controller(控制器),負責接收請求、調度模型、選擇視圖

特點:輕量級(代碼量少、資源佔用低)、支持分層開發、控制數據流向

請求處理流程圖解

用戶請求 (.action)
    ↓
StrutsPrepareAndExecuteFilter (核心過濾器)
    ↓
ActionMapping 匹配 → ActionProxy → ActionInvocation
    ↓
攔截器鏈 依次執行 (pre-processing)
    ↓
Action.execute() 業務邏輯執行
    ↓
攔截器鏈 逆序執行 (post-processing)
    ↓
Result 視圖渲染 (JSP/Freemarker/Velocity/JSON等)
    ↓
響應返回用戶

核心組件詳解

1. Action - 業務處理核心

  • POJO 形式,無需實現接口或繼承類(可選實現 Action 接口或繼承 ActionSupport)
  • 通過 struts.xml 配置映射關係:<action name="login" class="com.demo.LoginAction">
  • 支持動態方法調用:login!register.action 調用 register() 方法
  • 模型驅動:實現 ModelDriven<T> 簡化表單數據綁定

2. 攔截器 - 橫切關注點處理器

Struts2 的靈魂所在,實現 AOP 思想。默認攔截器棧 defaultStack 包含 20+ 個攔截器:

攔截器功能
params請求參數自動注入 Action 屬性
validation數據校驗支持
workflow控制流程跳轉(如校驗失敗返回 input)
fileUpload文件上傳處理
i18n國際化支持
servletConfig提供 Servlet API 訪問
prepare預處理接口 Preparable 支持

自定義攔截器:實現 Interceptor 接口,在 struts.xml 中註冊並加入攔截器棧。

3. 結果類型 - 視圖渲染多樣化

  • dispatcher (默認):JSP 頁面跳轉
  • redirect:重定向
  • redirectAction:重定向到另一 Action
  • json:JSON 數據返回(需 json-plugin)
  • stream:文件下載/圖片輸出
  • freemarker/velocity:模板引擎渲染

4. OGNL 表達式語言 - 數據訪問利器

  • 統一訪問 Action 屬性、請求/會話/應用上下文:#request.key、#session.user
  • 支持集合操作:list[0].property、map.key
  • 支持方法調用:user.getFullName()
  • 值棧機制:ValueStack 存放 Action 實例及上下文對象,OGNL 從中查找數據

優缺點深度對比

✅ 核心優勢

1. 純粹的 MVC 分層

Action 是 POJO,業務邏輯與框架解耦,易於單元測試,程序員專注業務實現。

2. 強大的攔截器機制

實現 AOP,橫切關注點(權限、日誌、事務、編碼)集中管理,defaultStack 開箱即用。

3. 豐富的標簽庫

UI 標簽(form、select、iterator)、數據標簽(property、if/else)、控制標簽極大提升開發效率。

4. 配置驅動開發

struts.xml 集中管理 URL 映射、結果視圖、攔截器棧、異常處理,系統關係一目了然。

5. 高擴展性與插件化

核心 struts-default.xml 定義默認 Bean/結果類型/攔截器棧,均可通過配置覆蓋或插件擴展。

6. 異常處理機制

配置文件聲明式異常映射:<exception-mapping exception="java.sql.SQLException" result="db-error" />

❌ 明顯短板

1. 參數綁定混亂

Action 屬性同時用於接收請求參數和輸出數據到視圖,屬性膨脹導致類臃腫,職責不清。

2. OGNL 表達式性能隱患

複雜表達式解析開銷大,曾爆出多個安全漏洞(如 S2-045、S2-057),需持續升級修補。

3. 值棧機制理解門檻高

值棧、OGNL、上下文映射關係複雜,新手易踩坑(如同名屬性遮蔽、集合索引越界)。

4. 對 RESTful 風格支持弱

基於 *.action 後綴映射,REST 風格 URL 需額外配置,不如 Spring MVC 自然。

5. 社區活躍度下降

Spring MVC/Boo已成主流,Struts2 新版本迭代緩慢,招聘需求銳減,文檔資源相對匱乏。

遷移建議與現狀

  • 存量項目維護:升級至 Struts 2.5.x(最新 2.5.30+),及時修補安全漏洞,梳理攔截器棧精簡配置
  • 新項目選型:強烈建議使用 Spring MVC + Spring Boot,生態完善、性能更優、人才易招
  • 學習價值:理解 Filter 模式控制器、攔截器鏈/AOP 實現、配置驅動思想,對掌握 Spring MVC 源碼大有裨益

Struts2 承載了 Java Web 發展的輝煌歷程,其設計精髓(Front Controller、Interceptor Chain、配置驅動)深深影響了後續框架。了解它,是向經典致敬,更是為了更好地駕馭現代框架。

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