Struts 是基於 Model 2 實現的經典 MVC 框架,Model 2 是 MVC 在無狀態 HTTP 環境下的 Web 適配變體。本文系統梳理 Struts 核心執行流程、MVC 映射關係,並重點講解 Struts 1.1 引入的多模塊、動態 ActionForm、聲明式異常處理三大里程碑特性。
圖 1 展示典型 Java MVC 與 J2EE 技術映射:
圖 1 MVC 與 J2EE 技術對應
Struts 具體實現(圖 2):
圖 2 Struts MVC 實現
ActionServlet(總控制器)啟動時讀取 struts-config.xml,初始化各模塊 ModuleConfig,截獲所有 *.do 請求ActionConfig 找對應 Action,若有 ActionForm 則實例化、填充屬性、放入 request/session,可選調用 validate() 驗證,失敗則返回輸入頁Action.execute()活動圖 3 更直觀描述中間過程:
圖 3 Struts 接受並返回響應的中間過程
Struts 1.0 單一 struts-config.xml 導致多人修改衝突。1.1 提供兩級方案:
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml, /WEB-INF/book-struts-config.xml</param-value>
</init-param>
優點:按模塊劃分文件,減少衝突。缺點:初始化時仍合併為一個 ModuleConfig,不同文件定義同名 <exception> 等會衝突。
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/book</param-name> <!-- 模塊前綴 /book -->
<param-value>/WEB-INF/book-struts-config.xml</param-value>
</init-param>
每個模塊擁有獨立 ModuleConfig、命名空間,徹底隔離配置衝突。訪問 URL 如 /book/loginAction.do。
傳統 ActionForm 需為每個表單寫 Java 類。DynaActionForm 僅在配置文件聲明屬性,框架動態創建實例(底層用 Map 存儲)。
<form-bean name="bookForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="bookId" type="java.lang.String"/>
<form-property name="isbn" type="java.lang.String"/>
<form-property name="bookName" type="java.lang.String"/>
<form-property name="author" type="java.lang.String"/>
</form-bean>
使用時:String name = (String) form.get("bookName")。需校驗時改用 DynaValidatorForm,配合 validation.xml + validator-rules.xml 實現聲明式驗證。
在 struts-config.xml 定義異常映射:
<global-exceptions>
<exception key="sqlexception" type="java.sql.SQLException" path="/sqlFail.htm"/>
</global-exceptions>
Action 中直接 throws SQLException,框架自動捕獲並轉向 /sqlFail.htm。優點:異常處理集中化、可配置、Action 代碼專注業務邏輯。
| 特性 | 解決問題 | 核心機制 |
|---|---|---|
| 多模塊 | 大型團隊配置文件衝突 | 獨立 ModuleConfig + URL 前綴隔離 |
| DynaActionForm | 大量表單導致 ActionForm 類爆炸 | 配置元數據 + Map 動態實例 |
| 聲明式異常 | Action 中重複 try-catch、異常頁面硬編碼 | 全局異常映射表 + 框架自動攔截轉發 |
Struts 1.1 這三大特性標誌著框架從「小項目適用」邁向「企業級大型應用」的成熟階段,配合 JBuilder 2005 等 IDE 的可視化支持,極大提升了開發效率與代碼可維護性。