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

Struts 遷移至 Struts 2 實戰指南(一):架構差異與請求流程

     編輯:Java 相關知識

歷史脈絡

  • 2001 Struts 1 發布,確立 Front Controller + MVC 標準。
  • 2002 WebWork 推出,引入 IoC、攔截器、Pull-MVC 等創新。
  • 2005 WebWork + Struts Ti 合併 → Struts 2 (Struts Action Framework 2.0)。
  • Struts 1/2 並行維護,擴展名 .do / .action 可共存同一應用。

請求處理流程對比

Struts 1

  1. ActionServlet 接收請求。
  2. RequestProcessor (Chain of Responsibility) 處理:填充 Form、驗證、分派 Action。
  3. Action execute() 邏輯。
  4. ActionForward 轉向 JSP。

Struts 2

  1. FilterDispatcher (Servlet Filter) 接收請求。
  2. 攔截器堆疊 (Interceptor Stack) 前置處理:參數注入、驗證、檔案上傳、I18n、動作準備等。
  3. 建立 **新 Action 實例**,呼叫指定方法 (execute() 或自訂)。
  4. 結果處理:Result 類型 (dispatcher/redirect/redirectAction/stream/json 等) 渲染視圖。
  5. 攔截器堆疊後置處理 (清理、日誌等)。
  6. 回應返回。

關鍵架構差異表

面向Struts 1Struts 2
核心控制器Servlet (ActionServlet)Filter (FilterDispatcher)
擴展名.do.action (可配置)
Action 實例單例 (需執行緒安全)每請求新建 (天然安全)
Action 基類強制 extends ActionPOJO,可選 implements Action 或 extends ActionSupport
方法分派固定 execute() (DispatchAction 例外)任意 public String 方法,XML/註解指定
表單資料ActionForm (String 欄位)直接用領域模型 / DTO,型別自動轉換
資料傳遞視圖Push: request.setAttributePull: 視圖直接存取 Action 屬性/模型
配置檔struts-config.xml (單一)struts.xml (模組化、可 include、繼承 package)
攔截機制RequestProcessor 固定流程攔截器堆疊可插拔、可組合、可自訂
依賴注入無內建內建 (接口注入/Setter 注入),可整合 Spring

web.xml 配置對比

Struts 1

<servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
  <init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value></init-param>
  <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>

Struts 2

<filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

預設配置檔:classpath 下 struts.xml。可用 struts.properties 覆蓋預設屬性 (如 struts.action.extension=action)。

共存遷移策略

因擴展名不同 (.do vs .action),兩框架可**無縫共存**:
- 舊功能維持 .do。
- 新功能開發用 .action。
- 漸進式遷移,風險最低。

單元測試優勢

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

BlogAction action = new BlogAction();
action.setBlogService(mockService);
action.setBlogId(1);
action.prepare();
assertEquals("success", action.update());
verify(mockService).update(action.getModel());

Struts 1 需 StrutsTestCase / MockStrutsTestCase 模擬容器,複雜度高得多。

結語

理解架構差異是遷移成功的前提。Struts 2 以 Filter、攔截器、POJO Action、Pull-MVC、模組化配置全面現代化,並保留與 Struts 1 共存能力。下篇將實戰演示 Action 重寫與配置轉換。

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