Struts 提供豐富擴展點:ActionServlet、RequestProcessor、配置類、異常處理器等均可替換。但**擴展有成本**——增加複雜度、測試負擔、升級風險。原則:
基於成熟框架開發,可大幅減少基礎代碼量、縮短週期、降低缺陷率。
Struts 1.1 引入 ExceptionHandler 機制,將錯誤流程從代碼移至配置,符合 J2EE「配置代替硬編碼」最佳實踐。
拋出異常 → 自動創建 ActionError → 存入指定 scope → 轉發到配置 path (如 /error.jsp)。
public class CustomizedExceptionHandler extends ExceptionHandler {
@Override
public ActionForward execute(Exception ex, ExceptionConfig cfg,
ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res)
throws ServletException {
// 1. 檢查異常類型 (含嵌套異常 ex.getCause())
// 2. 生成國際化錯誤消息
// 3. 記錄日誌 / 發送告警
// 4. 返回 ActionForward (可動態決定轉向頁面)
return mapping.findForward("failure");
}
}
<global-exceptions>
<exception
type="java.lang.Exception"
handler="com.app.CustomizedExceptionHandler"
key="global.error"
path="/error.jsp"
scope="request"/>
<exception
type="com.app.SecurityException"
handler="com.app.SecurityExceptionHandler"
key="security.error"
path="/login.jsp"
scope="request"/>
</global-exceptions>
type:匹配異常類,**支持父類鏈向上查找** (先匹配具體類,再匹配父類)。handler:自定義處理器全限定名,覆蓋默認。<action> 內部配置局部異常處理,優先級高於全局。構建異常處理層次結構:安全異常 → 登錄頁;業務異常 → 業務錯誤頁;系統異常 → 通用錯誤頁。
Struts 1.1 引入**應用模塊** (早期稱 Sub-Application),解決大團隊單 struts-config.xml 衝突痛點。
/app /catalog (商品目錄模塊) → 獨立 struts-config.xml、JSP、Action /customer (客戶模塊) /orders (訂單模塊) /admin (後台模塊)
每模塊獨立配置、獨立目錄、獨立命名空間,物理隔離消除合併衝突。
struts-config-.xml 。web.xml 配置多 controller 初始化參數 (config/)。org.apache.struts.actions.SwitchAction 實現模塊間跳轉。默認模塊 (無前綴) 保持向後兼容,舊應用無需修改即可運行。
| 心法 | 核心價值 | 避坑提醒 |
|---|---|---|
| 擴展節制 | 降低複雜度,保持可升級性 | 先查文檔/源碼,再動手 |
| 聲明式異常 | 業務與錯誤流程分離,國際化友好 | 善用異常鏈匹配,構建分層處理 |
| 模塊化架構 | 並行開發零衝突,部署靈活 | 模塊劃分遵循業務邊界,而非技術層 |
(本文為上篇,下篇將覆蓋:表單驗證最佳實踐、Tiles 佈局複用、國際化策略、性能調優清單。)