Servlet 是 JavaWeb 的基石,職責單一:接收 Request → 業務處理 → 返回 Response。但實際開發中,Servlet 直觀卻粗糙:
if (action.equals("add")) ...。Struts2 以 Action 類(POJO/JavaBean)替代 Servlet,核心價值:
user.name),內建常用類型轉換器,徹底消除手工 set/get。user_add.action → add()),無需在 web.xml 註冊 Servlet,支持通配符映射。struts.xml 定義 <result> 類型(JSP、Velocity、FreeMarker、JSON、Stream 等),邏輯視圖名與物理資源分離,統一管理,易維護。defaultStack 開箱即用。反思:Struts2 大量使用反射(註解配置更甚),性能不如原生 Servlet;且標籤庫與前端模板引擎(Velocity/FreeMarker)綁定,前後端分離趨勢下顯得笨重。但其「Action 即 JavaBean、攔截器 AOP、配置化視圖」設計思想深刻影響後續框架。
SpringMVC 保留 Struts2 精華,修正痛點:
| 維度 | Struts2 | SpringMVC |
|---|---|---|
| 核心控制器 | Filter(StrutsPrepareAndExecuteFilter) | Servlet(DispatcherServlet) |
| Action/Controller 實例 | 每請求一個實例(原型) | 單例(默認),線程安全需開發者保證 |
| 參數綁定 | 屬性驅動(Action 即表單模型) | 方法參數綁定(@RequestParam、@ModelAttribute、POJO 直接接收) |
| 類型轉換 | OGNL 表達式,功能強但複雜、有安全漏洞史 | ConversionService/Formatter,簡潔可擴展 |
| 視圖解析 | struts.xml 配置 result | ViewResolver 鏈(InternalResourceViewResolver 等),支持 RESTful 內容協商 |
| 攔截機制 | Interceptor(反射實現,功能豐富) | HandlerInterceptor(基於 Servlet API,輕量)+ AOP |
| REST 支持 | 弱(需插件) | 原生支持 @PathVariable、@RequestBody、HttpMessageConverter |
| 場景 | 推薦 | 理由 |
|---|---|---|
| 傳統企業級應用、團隊熟悉 Struts2、需豐富標籤庫 | Struts2 + Spring | 成熟穩定,攔截器功能最強,標籤庫開發效率高 |
| RESTful API、前後端分離、微服務、高併發、性能敏感 | SpringMVC + Spring(或 Spring Boot) | 輕量、原生 Servlet、REST 支持佳、易測試、與 Spring 生態無縫整合 |
| 新項目、追求開發效率、約定優於配置 | Spring Boot + SpringMVC | 自動配置、內嵌容器、生產級監控、雲原生就緒 |
框架非銀彈,但優秀框架的設計思想(IoC、AOP、MVC、攔截器、類型轉換、視圖解析)是通用的架構智慧。理解 Servlet 痛點 → Struts2 解法 → SpringMVC 改良 → Spring 底層支撐,這條演進線索,才是掌握 JavaWeb 開發的真正鑰匙。