Struts 2 作為經典 Java Web MVC 框架,雖然在 Spring MVC 與現代前後端分離架構下逐漸淡出主流,但其設計思想與攔截器機制仍具備參考價值。本文將從核心概念、優缺點、架構定位三個維度進行系統梳理。
一、Struts 2 是什麼?
- 輕量級 MVC 框架:代碼量少、運行資源佔用低。
- 分層開發支援:Model(業務/資料)、View(JSP/Freemarker)、Controller(Action)職責分離。
- 本質是一個 Servlet:
FilterDispatcher(Struts 2.1.3 後為 StrutsPrepareAndExecuteFilter)攔截所有請求,委派給 Action 處理。
- 控制器角色:在 MVC 中扮演 Controller,負責請求路由、資料封裝、視圖轉發。
二、核心優點
- MVC 徹底分離:開發者專注業務邏輯,視圖與控制解耦。
- 豐富標籤庫:UI 標籤、資料標籤、控制標籤大幅提升 JSP 開發效率。
- 攔截器機制:AOP 風格橫切關注點(登入驗證、日誌、事務、編碼等),可組合成攔截器堆疊。
- 配置驅動:
struts.xml 集中管理 Action、Result、攔截器關係,修改不動代碼。
- 異常處理集中化:在配置映射異常類到結果頁,統一錯誤展示。
- 高擴展性:核心
struts-default.xml 定義預設 Bean、ResultType、攔截器堆疊,皆可覆寫或插件擴展。
- AOP 思想落地:攔截器即切面,細顆粒功能單元可組合復用。
三、主要缺點
- Action 屬性膨脹:為接收表單參數需在 Action 定義大量 getter/setter,導致類別臃腫,且屬性同時作為輸入/輸出雙向流動,易混淆。
- 學習曲線陡峭:攔截器堆疊、OGNL 表達式、值棧機制等概念較多。
- 效能較弱:值棧、OGNL 解析、大量反射調用,高併發下不如 Spring MVC + Jackson。
- 社區活躍度下降:新專案鮮少採用,維護舊系統為主。
四、實務建議
- 新專案:優先選擇 Spring MVC 或 Spring Boot + RESTful API + 前端框架(Vue/React)。
- 維護舊系統:善用攔截器提取公共邏輯,避免 Action 變成「上帝類」;配合 Convention Plugin 減少 XML 配置。
- 遷移策略:可採用 Struts 2 + Spring 整合,逐步將業務遷移至 Spring Service,Action 退化為薄薄的轉發層,再以 Spring MVC 並行切換。
總結
Struts 2 以攔截器實現 AOP、以配置驅動 MVC 流程,曾是 Java Web 開發的標準化里程碑。理解其優缺點,不僅有助於維護存量系統,更能深化對現代框架設計權衡的認知。