.do / .action 可共存同一應用。ActionServlet 接收請求。RequestProcessor (Chain of Responsibility) 處理:填充 Form、驗證、分派 Action。execute() 邏輯。ActionForward 轉向 JSP。FilterDispatcher (Servlet Filter) 接收請求。Interceptor Stack) 前置處理:參數注入、驗證、檔案上傳、I18n、動作準備等。execute() 或自訂)。Result 類型 (dispatcher/redirect/redirectAction/stream/json 等) 渲染視圖。| 面向 | Struts 1 | Struts 2 |
|---|---|---|
| 核心控制器 | Servlet (ActionServlet) | Filter (FilterDispatcher) |
| 擴展名 | .do | .action (可配置) |
| Action 實例 | 單例 (需執行緒安全) | 每請求新建 (天然安全) |
| Action 基類 | 強制 extends Action | POJO,可選 implements Action 或 extends ActionSupport |
| 方法分派 | 固定 execute() (DispatchAction 例外) | 任意 public String 方法,XML/註解指定 |
| 表單資料 | ActionForm (String 欄位) | 直接用領域模型 / DTO,型別自動轉換 |
| 資料傳遞視圖 | Push: request.setAttribute | Pull: 視圖直接存取 Action 屬性/模型 |
| 配置檔 | struts-config.xml (單一) | struts.xml (模組化、可 include、繼承 package) |
| 攔截機制 | RequestProcessor 固定流程 | 攔截器堆疊可插拔、可組合、可自訂 |
| 依賴注入 | 無內建 | 內建 (接口注入/Setter 注入),可整合 Spring |
<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>
<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 重寫與配置轉換。