MVC 實現功能模塊與顯示模塊分離,提升可維護性、可擴展性、可移植性、組件復用性。
| 模型 | 架構 | 缺點 |
|---|---|---|
| JSP Model 1 | JSP 獨攬請求處理、業務邏輯、頁面渲染 | Java 代碼與 HTML 混雜,職責不清,難以維護,頁面導航硬編碼 |
| JSP Model 2 | Servlet (Controller) + JSP (View) + JavaBean (Model) | 易產生多個 Controller,頁面導航分散在 Servlet 代碼中,缺乏統一配置 |
ActionServlet 統一入口,生命週期由容器管理。struts-config.xml 中 <forward> 集中管理頁面跳轉,修改無需改代碼。execute() 方法接收映射後的 Form、Mapping、Request、Response,返回 ActionForward。ActionForm (含 validate()) + DynaActionForm (動態屬性)。MessageResources + <bean:message>。<global-exceptions> / Action 級 <exception>。用戶請求 (*.do)
↓
ActionServlet (Front Controller)
↓
RequestProcessor (模板方法模式)
├─ 1. 識別 ActionMapping (根據 path)
├─ 2. 創建/獲取 ActionForm → 自動填充請求參數
├─ 3. Form.validate() → 有錯誤則返回 input 頁面
├─ 4. 實例化/獲取 Action (單例模式)
├─ 5. Action.execute(mapping, form, request, response)
│ ├─ 委託 BusinessDelegate / Service
│ ├─ 處理業務異常 (拋出供框架捕獲)
│ └─ 返回 ActionForward (邏輯視圖名)
└─ 6. 根據 Forward 轉發/重定向到 JSP/Tiles/Action
validate() 返回 ActionErrors,框架自動回顯錯誤。reset() 清空表單,支援向導式多步驟。struts-config.xml 聲明屬性,無需寫 Java 類,適合快速原型。DispatchAction:根據參數 method=xxx 分發到 xxx() 方法 (CRUD 合一)。LookupDispatchAction:根據提交按鈕 name (國際化鍵值) 分發,更安全。MappingDispatchAction:根據 <action> 的 parameter 屬性分發。邏輯名稱 (success, failure) 映射物理路徑,支援全局與局部覆蓋,redirect="true" 可強制重定向 (防表單重復提交)。
Struts 將 Model 2 落地為可配置、可擴展、工具化的框架,確立了 Java Web 框架的基因:前端控制器、攔截器鏈、聲明式導航、表單綁定、標籤庫。雖已退出歷史舞臺,其設計思想深刻影響 Spring MVC、WebWork/Struts2、JSF 等後繼者。