《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 類零侵入設計
| 實現方式 | 特點 |
| POJO + execute() | 最輕量,無任何框架依賴,攔截器自動處理參數注入與結果輸出 |
| 實現 Action 介面 | 提供 SUCCESS/ERROR/INPUT/LOGIN/NONE 常數,簡化返回值 |
| 繼承 ActionSupport | 最推薦:內建驗證、國際化、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 容器初始化兩種方式對比
| 方式 | 配置要點 | 優缺點 |
| ContextLoaderListener | web.xml 註冊 listener,預設載入 `WEB-INF/applicationContext.xml` | 載入時機最早 (Servlet 初始化前),支援 Servlet 2.3+ |
| load-on-startup Servlet | 配置 `1` | 兼容舊版 Servlet 容器,但載入順序晚於 Listener |

總結與建議
Struts 2 保留 WebWork 核心優勢並修正其不足,80% 場景使用 20% 核心功能。遷移關鍵在於:拋棄 FormBean 思維、善用 OGNL 巢狀注入、選擇 `ActionSupport` 基類、注意 Boolean 命名規範。書籍作為系統性參考資料價值較高,實戰中遇到邊界情況再查閱 API 即可。
- 上一篇文章: Struts 分頁無參數傳遞時直接使用 html:link 簡化實現
- 下一篇文章: Struts 2 國際化 (i18n) 實戰指南:從配置到頁面動態切換
Copyright ©
程式碼之家 All Rights Reserved