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

Struts 2 權威指南核心差異解析:從 Struts 1/WebWork 遷移的關鍵點

     編輯:Java 相關知識

《Struts 2 權威指南》詳細對比 Struts 2 與前代框架的架構演進。本文提煉六大核心差異,幫助開發者快速掌握遷移要點與最佳實踐。

六大核心差異深度解析

1. 擺脫 FormBean 束縛,降低耦合與學習成本

  • Struts 1:強制使用 `` 標籤,需編寫 `ActionForm` 子類,僅支援基本類型屬性注入,程式碼冗餘嚴重
  • Struts 2:支援原生 HTML 表單標籤,Action 即 POJO,屬性直接注入,無需額外 FormBean,耦合度大幅降低

2. 巢狀屬性注入:`object.property` 語法原生支援

<input name="picture.id" />  <!-- 直接注入 picture 物件的 id 屬性 -->

Struts 1 需手動拆解扁平化屬性,Struts 2 透過 OGNL 表達式原生支援物件圖導航。

3. Action 類零侵入設計

4. 集合類型注入完善:List<T> 與陣列雙支援

WebWork 僅支援陣列注入 (`String[] description`),Struts 2 同時支援:

// List 方式 - 圖片上傳不定數量場景
private List<Picture> pictureList;
// JSP: pictureList[0].description, pictureList[1].description...

// 陣列方式 - 簡單字串列表
private String[] description;
// JSP: 多個同名 description 輸入框

兩種方式均可自動注入與迭代輸出 (``),極大簡化動態表單處理。

5. Boolean 屬性存取器命名規範陷阱

Struts 2 標準要求:`getIsXxx()` / `setIsXxx(boolean)` (屬性名 `isXxx`) 或 `getXxx()` / `setXxx(boolean)` (屬性名 `xxx`)

Eclipse 自動生成:`isXxx()` / `setXxx(boolean)` — 不符合 Struts 2 慣例

解決方案:手動調整 getter/setter 命名,或使用 Lombok `@Getter/@Setter` 配合註解指定存取器名稱。注意 iBatis/MyBatis 對兩種風格均相容。

6. Spring 容器初始化兩種方式對比

實現方式特點
POJO + execute()最輕量,無任何框架依賴,攔截器自動處理參數注入與結果輸出
實現 Action 介面提供 SUCCESS/ERROR/INPUT/LOGIN/NONE 常數,簡化返回值
繼承 ActionSupport最推薦:內建驗證、國際化、Action 介面實現,開發效率最高

ContextLoaderListener 配置 load-on-startup Servlet 配置

總結與建議

Struts 2 保留 WebWork 核心優勢並修正其不足,80% 場景使用 20% 核心功能。遷移關鍵在於:拋棄 FormBean 思維、善用 OGNL 巢狀注入、選擇 `ActionSupport` 基類、注意 Boolean 命名規範。書籍作為系統性參考資料價值較高,實戰中遇到邊界情況再查閱 API 即可。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方式配置要點優缺點
ContextLoaderListenerweb.xml 註冊 listener,預設載入 `WEB-INF/applicationContext.xml`載入時機最早 (Servlet 初始化前),支援 Servlet 2.3+
load-on-startup Servlet配置 `1`兼容舊版 Servlet 容器,但載入順序晚於 Listener