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

Struts2 核心架構深度解析:從 Filter 到值棧的完整請求流程

     編輯:Java 綜合教學

Struts2 核心架構深度解析

Struts2 作為經典的 Java Web MVC 框架,其設計理念圍繞「攔截器」與「值棧」兩大核心展開。本文將從控制器架構、核心組件、請求處理流程、配置管理以及優缺點評估五個維度,系統梳理 Struts2 的關鍵技術點。

1. 控制器採用 Filter 而非 Servlet

Struts2 的前端控制器採用 StrutsPrepareAndExecuteFilter(Filter)而非傳統 Servlet。Filter 與 Servlet 同樣能獲取請求、響應、Session 等資源,但生命週期初始化機制不同:Filter 隨 Web 應用啟動而初始化,銷毀隨容器關閉,更輕量且符合「預處理-執行-後處理」的攔截器鏈模型。

2. 攔截器機制解決表述層通用問題

框架內建攔截器堆疊(defaultStack)已覆蓋異常處理、防重複提交、文件上傳下載、類型轉換、國際化等高頻需求。開發者可通過自定義攔截器擴展業務邊界,實現橫切關注點的解耦。

3. ValueStack 與 ModelDriven 雙重加持開發效率

  • ValueStack(值棧):贯穿 Action 生命週期的線程安全容器,結合 OGNL 表達式與 Struts 標簽,可在頁面無縫訪問域對象、請求參數、錯誤信息等資源。
  • ModelDriven:提供基於對象的參數自動注入,省去手動 set/get 繁瑣代碼。

4. 請求級別的線程隔離與資源消耗權衡

每個 HTTP 請求對應一個獨立的 ValueStack、Action 實例及執行方法,保證線程安全,但也意味著高併發下對象創建銷毀開銷大,屬於典型的「以空間換線程安全」設計。

5. 核心請求處理流程圖解

  1. 啟動階段:StrutsPrepareAndExecuteFilter.init() 載入配置、構建 ActionMapper。
  2. 請求攔截:doFilter() 判斷是否 Struts2 請求 → 包裝 Request(MultiPartRequestWrapper 或 StrutsRequestWrapper) → ActionMapper.getMapping() 解析映射 → 靜態資源放行,動態請求進入 Dispatcher.serviceAction()。
  3. Action 執行:
    • 創建/復用 ActionContext 與 ValueStack。
    • 工廠模式創建 ActionProxy(默認 DefaultActionProxy) → 委派 ActionInvocation(默認 DefaultActionInvocation)。
    • ActionInvocation.invoke() 遞歸調用攔截器鏈 → 最後 invokeActionOnly() 執行 Action.execute()。
  4. 結果渲染:通過 Result 類型(dispatcher/redirect/chain/json 等)完成視圖跳轉。

Struts2 請求處理流程圖

ActionInvocation 調用關係圖

6. 配置文件管理最佳實踐

  • struts.xml 主配置 + 模組化拆分(<include>)
  • 主題模板、類型轉換器(Action/全局兩級)、輸入驗證(Action/方法兩級)、國際化資源、自定義攔截器

7. 優缺點客觀評價

優點缺點
內建方案覆蓋 Web 通用場景;源碼命名清晰、易閱讀;標簽庫降低頁面開發門檻XML 配置繁瑣(常達到每 Action 一配置);驗證僅支持屬性級,不支持模型級;Simple 主題含默認樣式干擾 UI 定制

總結

Struts2 以 Filter + 攔截器鏈 + 值棧構建完整表述層解決方案,適合中小型項目快速開發。但在微服務、前後端分離架構下,其重配置、重運行時特性逐漸被 Spring MVC / WebFlux 取代。理解其核心流程仍有助於維護存量系統與掌握 MVC 框架設計精髓。

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