Struts2 作為經典的 Java Web MVC 框架,其設計理念圍繞「攔截器」與「值棧」兩大核心展開。本文將從控制器架構、核心組件、請求處理流程、配置管理以及優缺點評估五個維度,系統梳理 Struts2 的關鍵技術點。
Struts2 的前端控制器採用 StrutsPrepareAndExecuteFilter(Filter)而非傳統 Servlet。Filter 與 Servlet 同樣能獲取請求、響應、Session 等資源,但生命週期初始化機制不同:Filter 隨 Web 應用啟動而初始化,銷毀隨容器關閉,更輕量且符合「預處理-執行-後處理」的攔截器鏈模型。
框架內建攔截器堆疊(defaultStack)已覆蓋異常處理、防重複提交、文件上傳下載、類型轉換、國際化等高頻需求。開發者可通過自定義攔截器擴展業務邊界,實現橫切關注點的解耦。
set/get 繁瑣代碼。每個 HTTP 請求對應一個獨立的 ValueStack、Action 實例及執行方法,保證線程安全,但也意味著高併發下對象創建銷毀開銷大,屬於典型的「以空間換線程安全」設計。
StrutsPrepareAndExecuteFilter.init() 載入配置、構建 ActionMapper。doFilter() 判斷是否 Struts2 請求 → 包裝 Request(MultiPartRequestWrapper 或 StrutsRequestWrapper) → ActionMapper.getMapping() 解析映射 → 靜態資源放行,動態請求進入 Dispatcher.serviceAction()。ActionContext 與 ValueStack。ActionProxy(默認 DefaultActionProxy) → 委派 ActionInvocation(默認 DefaultActionInvocation)。ActionInvocation.invoke() 遞歸調用攔截器鏈 → 最後 invokeActionOnly() 執行 Action.execute()。Result 類型(dispatcher/redirect/chain/json 等)完成視圖跳轉。

struts.xml 主配置 + 模組化拆分(<include>)| 優點 | 缺點 |
|---|---|
| 內建方案覆蓋 Web 通用場景;源碼命名清晰、易閱讀;標簽庫降低頁面開發門檻 | XML 配置繁瑣(常達到每 Action 一配置);驗證僅支持屬性級,不支持模型級;Simple 主題含默認樣式干擾 UI 定制 |
Struts2 以 Filter + 攔截器鏈 + 值棧構建完整表述層解決方案,適合中小型項目快速開發。但在微服務、前後端分離架構下,其重配置、重運行時特性逐漸被 Spring MVC / WebFlux 取代。理解其核心流程仍有助於維護存量系統與掌握 MVC 框架設計精髓。