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

Struts 2 核心架構解析:從 Struts 1 遷移的關鍵差異與優勢

     編輯:Java 相關知識

經歷多年 Struts 1.x(從 1.1 到 1.3)的實戰洗禮後,面對 Struts 2 的全新架構,開發者必須重新審視其核心設計理念。Struts 2 並非 Struts 1 的簡單升級,而是源自 WebWork 框架,這意味著原有 Struts 1 的開發經驗幾乎無法直接轉移,開發者需以全新視角學習。

核心控制器與執行機制的根本變革

Struts 1 採用 ActionServlet 作為核心控制器,採單例模式運行,所有請求共享同一個 Action 實例,這在多線程環境下帶來線程安全隱憂。Struts 2 則採用 FilterDispatcher(後續版本為 StrutsPrepareAndExecuteFilter)作為核心過濾器,採用請求範圍的實例策略:每個請求都會生成新的 Action 實例,徹底消除了線程安全顧慮,並支援運行時動態生成 Action 代理,極大提升了靈活性。

Action 設計:從強耦合到純粹 POJO

Struts 1 強制 Action 繼承抽象類,深度綁定 Servlet API,導致單元測試極其困難,往往依賴 StrutsTestCase 等模擬容器工具。Struts 2 徹底脫離 Servlet API,Action 僅需實現 ActionSupport 介面,甚至可以是一個純粹的 POJO(Plain Old Java Object)。這種非侵入式設計使得 Action 類可在獨立於容器的環境下輕鬆進行單元測試,測試效率大幅提升。

資料綁定與類型轉換的簡化

Struts 1 依賴 ActionForm 接收表單資料,其本質仍是 Servlet API 的封裝,非標準 JavaBean。Struts 2 直接在 Action 屬性中接收請求參數,支援將資料自動封裝到獨立的 POJO 中,並內建強大的類型轉換機制(基於 OGNL 表達式語言),處理集合、索引屬性及巢狀物件輕而易舉。雖然 Struts 1.3 也嘗試支援 POJO,但配置繁瑣,體驗遠不如 Struts 2 原生支援。

OGNL 表達式語言與值棧

Struts 2 引入 OGNL(Object-Graph Navigation Language)作為預設表達式語言,核心是值棧機制。值棧不僅存放 Action 實例,還包含請求、Session、Application 等上下文物件,OGNL 可穿梭於值棧各層級存取屬性、呼叫方法、操作集合與 Map,極大簡化了視圖層的資料存取邏輯。

配置管理:約定優於配置與熱重載

Struts 1 單一 struts-config.xml 配置龐雜。Struts 2 採用模組化配置:核心 struts.xml 搭配 struts.properties。後者提供兩大開發利器:

  • struts.devMode = true:開啟開發模式,提供詳細錯誤報告與配置檢查。
  • struts.configuration.xml.reload = true:配置檔熱重載,修改 struts.xml 即時生效,無需重啟應用伺服器,開發效率質變。

Action 回傳值與視圖解耦

Struts 1 的 execute() 方法參數繁多,回傳 ActionForward 強綁定框架。Struts 2 的 execute() 無參數,回傳純字串(邏輯視圖名),Action 完全不知視圖實現細節,真正實現 POJO 化,復用性大增,這也是《POJO In Action》一書名由來。

視圖技術的多元化支援

Struts 1 受限於時代,僅支援 JSP。Struts 2 原生整合 FreeMarker、Velocity、XSLT、PDF、JasperReports 等多種視圖技術,開發者可根據業務場景靈活選擇,甚至自定義視圖實現。

標籤庫與 AJAX 整合

Struts 2 提供功能豐富的標籤庫,統一使用 s 前綴(如 <s:form>、<s:iterator>),支援 UI 元件化與主題模板。更順應 Web 2.0 潮流,內建 AJAX 標籤與 Dojo 整合,並提供聲明式驗證框架,支援客戶端/伺服器端同步驗證,大幅減少樣板代碼。

總結

Struts 2 以 WebWork 為核心,通過 Filter 過濾器、POJO Action、OGNL 值棧、熱重載配置、邏輯視圖名等創新設計,徹底解決了 Struts 1 的線程安全、測試困難、強耦合、配置繁瑣等痛點。對於新專案,Struts 2 是更現代、更敏捷的選擇;遷移既有 Struts 1 專案則需評估改寫成本,但長遠收益顯著。

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