由資深技術顧問 Ian Roughley 撰寫,本系列文章將透過一個實際的 Struts 應用遷移案例,深入淺出地展示 Struts 2 的核心特性與優勢。Roughley 擁有超過十年的架構設計與敏捷開發經驗,專注於務實且結果導向的技術方案。
Struts 1.x 於 2001 年問世,確立了前端控制器與 MVC 模式在 Java Web 開發的標準地位。隨著 WebWork 框架(2002 年發布)引入攔截器鏈、依賴注入等創新機制,Struts 社群在 2005 年決定將 Struts Ti 與 WebWork 合併,正式推出 Struts 2(原稱 Struts Action Framework 2.0)。值得注意的是,Struts 1.x 與 WebWork 並未停止維護,兩者仍持續修復錯誤與增強功能。
Struts 2 仍採用前端控制器模式,但引入了 Pull-MVC 架構——視圖層直接從 Action 實例拉取資料,無需像 Struts 1 那樣將資料放入 request/session scope。完整請求週期包含六個階段:

Struts 1 在 web.xml 中配置 ActionServlet,而 Struts 2 改用 FilterDispatcher(Struts 2.5+ 為 StrutsPrepareAndExecuteFilter):
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
預設 Action 副檔名為 .action(可在 struts.properties 修改),與 Struts 1 的 .do 不衝突,支援新舊系統共存漸進式遷移。
Struts 1 Action 必須繼承基類、實作執行緒安全的 execute()、透過參數取得 Servlet API。Struts 2 Action 則是純 POJO:
public class UserAction {
private UserService userService; // 依賴注入
private HttpServletRequest request; // 透過 ServletRequestAware 注入
public String execute() {
// 業務邏輯
return "success";
}
public void setUserService(UserService userService) { this.userService = userService; }
public void setServletRequest(HttpServletRequest request) { this.request = request; }
}
優勢顯而易見:
@Action 或 XML 配置)Action.SUCCESS 常數返回Struts 2 以攔截器堆疊取代 Struts 1 的 RequestProcessor 鏈。預設堆疊 defaultStack 包含參數準備、模型驅動、驗證、工作流、檔案上傳等 20+ 攔截器,可依需求組合或自訂。
掌握 Struts 2 的 Pull-MVC 架構、Filter 配置、POJO Action 與攔截器機制,即具備遷移既有應用的核心知識。下一篇將實戰示範 Action 遷移細節、struts.xml 配置技巧、UI 標籤庫與主題客製化,助你平滑升級至現代化 Web 框架。