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

Struts 2 vs Struts 1 核心差異全景對比:從架構到實戰的十大關鍵點

     編輯:Java 綜合教學

前言

Struts 2 並非 Struts 1 的簡單升級,而是融合了 WebWork 精華、重寫核心架構的全新框架。雖然保留了 Struts 的設計思想,但在 Action 模型、線程策略、Servlet 解耦、測試性、數據綁定、表達式語言、類型轉換、驗證、攔截器等十大維度實現了質的飛躍。本文系統梳理這些差異,助力遷移決策與技術選型。

十大核心差異深度對比

1. Action 類模型:抽象類 → 接口 / POJO

維度Struts 1Struts 2
編程風格抽象類繼承(Action、DispatchAction)接口實現(Action)或純 POJO
強制性必須繼承基類可選;任何含 execute() 的類均可
依賴注入不支持原生支持(Setter/構造器/接口注入)

影響:Struts 2 Action 更輕量、可測試、易於單元測試與 Spring 整合。

2. 線程模式:單例共享 → 請求級實例

  • Struts 1:Action 為單例,多線程共享實例 → 必須手動保證線程安全(避免實例變量、同步鎖)。
  • Struts 2:每請求創建新 Action 實例 → 天然線程安全,無實例變量衝突風險。

3. Servlet API 依賴:強耦合 → 可選訪問

場景Struts 1Struts 2
execute 簽名execute(mapping, form, request, response)execute() 無參;需時通過 ServletActionContext 獲取
單元測試需模擬 Servlet 容器(如 StrutsTestCase)直接實例化 Action,注入屬性即可測試
Session 訪問通過 request.getSession()ActionContext.getContext().getSession()(Map 風格)

4. 測試性:容器依賴 → 純單元測試

Struts 2 Action 為 POJO,無容器依賴,JUnit 測試極簡:

@Test
public void testLogin() {
    LoginAction action = new LoginAction();
    action.setUsername("admin");
    action.setPassword("123456");
    action.setUserService(mockUserService); // 注入 Mock
    String result = action.execute();
    assertEquals("success", result);
}

5. 數據捕獲:ActionForm → Action 屬性直接綁定

  • Struts 1:需定義繼承 ActionForm 的表單 Bean,常導致大量冗余類(DTO↔Form 雙維護)。
  • Struts 2:Action 直接聲明屬性(含嵌套對象、List、Map),參數自動綁定;仍兼容 ActionForm 模式平滑遷移。

6. 表達式語言:JSTL EL → OGNL(功能超集)

OGNL 支持:

  • 集合/數組索引訪問:users[0].name
  • 屬性鏈導航:order.customer.address.city
  • 方法調用:user.getFullName()
  • 投影/選擇:users.{? #this.age > 18}
  • 類型轉換內建支持

7. 值綁定到視圖:JSP 作用域 → ValueStack(值棧)

  • Struts 1:將對象放入 request/session/application 作用域,JSP 通過 <jsp:useBean> 或 EL 訪問。
  • Struts 2:ValueStack 作為線程局部棧,攔截器將 Action 壓入棧頂,標籤通過 OGNL 直接訪問棧中對象屬性,無需綁定到作用域,支持同名不同類型屬性的覆蓋與復用。

8. 類型轉換:手動/Commons-BeanUtils → OGLN 統一轉換器

Struts 2 內建常用類型轉換器(基本類型、日期、集合、枚舉等),並支持自定義 TypeConverter 註解或配置文件聲明,實現「一次配置、全局生效」。

9. 數據驗證:手動 validate / Commons Validator → XWork 驗證框架

特性Struts 1Struts 2 (XWork)
聲明式驗證XML 配置(Commons Validator)XML/註解/Action 方法/訪問器模式
嵌套對象驗證不支持支持(visitor 驗證器遞歸驗證子屬性)
字段級/屬性級僅字段級同時支持
國際化錯誤消息需手動配置內建 i18n 支持

10. Action 執行控制:模塊級 RequestProcessor → 攔截器棧

  • Struts 1:每模塊一個 RequestProcessor,所有 Action 共享同一生命週期。
  • Struts 2:攔截器棧 為每個 Action 定制生命週期(參數準備、驗證、事務、文件上傳、JSON 序列化等),棧可復用、可組合、可按 Action 精細控制。

遷移建議與最佳實踐

  1. 漸進式遷移:Struts 2 提供 Struts1Plugin 兼容舊 Action,可逐模塊遷移。
  2. 拋棄 ActionForm:直接在 Action 中聲明屬性,配合 ModelDriven 接口處理複雜表單。
  3. 善用攔截器:將通用邏輯(權限、日誌、事務)抽取為攔截器,配置在 struts.xml 或註解中。
  4. 拥抱 OGNL:在 JSP/FTL 中大膽使用 OGNL 表達式,減少後端數據預處理代碼。
  5. 單元測試覆蓋:利用 POJO 特性,為核心 Action 編寫高覆蓋率單元測試。

總結

Struts 2 在保留 Struts MVC 核心思想的基礎上,通過「接口編程、依賴注入、攔截器鏈、OGNL、ValueStack」五大支柱,構建了更靈活、可測試、高性能的 Web 框架。理解這十大差異,不僅是遷移指南,更是掌握現代 Java Web 框架設計精髓的窗口。

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