現狀總結
老專案大量存在,新專案幾乎不再採用 Struts2。
歷史定位
- Struts 1 (2000~2008):早期 MVC 標杆,ActionForm 表單綁定、攔截器鏈、OGNL 表達式語言為特色。
- Struts 2 (2006~2015):WebWork 併入,動作類無需繼承、攔截器更靈活、支援 REST、AJAX、約定優於配置。
為何新專案棄用?
- 安全漏洞頻發: OGNL 表達式注入 (S2-045, S2-046, S2-057 等) 歷年來持續爆出高危 RCE,升級維護成本高。
- 架構老舊: 依賴 Servlet API、大量攔截器、ThreadLocal 上下文,難以適應 Reactive、微服務、雲原生架構。
- 生態停滯: 最後版本 2.5.30 (2021),社群活躍度極低,文件、第三方整合、IDE 支援逐漸減少。
- Spring MVC 全面超越: 註解驅動、REST 原生、Spring 生態無縫整合、效能更好、測試友善、文件豐富。
遷移建議
- 漸進式遷移: 新增模組用 Spring MVC (或 Spring Boot),舊 Struts2 模組共存 (配置 `DispatcherServlet` + `StrutsPrepareAndExecuteFilter` 共處),逐步重寫。
- 關鍵差異對照:
| 特性 | Struts2 | Spring MVC |
| Action/Controller | POJO + execute() | @Controller + @RequestMapping |
| 資料綁定 | 屬性驅動 / ModelDriven | @RequestParam / @RequestBody / @ModelAttribute |
| 驗證 | validate() / XML / 註解 | JSR-380 @Valid + BindingResult |
| 視圖解析 | struts.xml + result type | ViewResolver (Thymeleaf/JSP/FreeMarker) |
| 攔截器 | interceptor stack | HandlerInterceptor / Filter / AOP |
結論:維護舊系統用 Struts2,新系統毫無理由選 Struts2,直接上 Spring Boot + Spring MVC。