Struts 作為經典 MVC 框架,雖已非主流選擇,但大量存量系統仍在運行。本文萃取實戰七大核心經驗:擴展原則、異常處理、模組化、JSP 安全、預建 Action、動態表單、視覺化工具,助你高效維護與優化 Struts 應用。
RequestProcessor、ActionServlet、配置類、異常處理器等均可替換ForwardAction、DispatchAction、驗證框架、Tiles 等),避免重複造輪子Struts 1.1+ 內建 ExceptionHandler 機制,在 struts-config.xml 宣告:
<global-exceptions>
<exception
key="error.database"
type="java.sql.SQLException"
handler="com.app.exception.DBExceptionHandler"
path="/error/database.jsp"/>
<exception
key="error.generic"
type="java.lang.Exception"
handler="com.app.exception.GenericExceptionHandler"
path="/error/generic.jsp"/>
</global-exceptions>
handler:自定義 ExceptionHandler 子類,覆寫 execute() 處理邏輯path:導向錯誤頁面key:對應 ApplicationResources.properties 訊息鍵public class DBExceptionHandler extends ExceptionHandler {
@Override
public ActionForward execute(Exception ex, ExceptionConfig cfg,
ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res) {
log.error("Database error", ex);
// 可解析 SQLException 錯誤碼,區分死鎖、連線失敗、約束違反等
return super.execute(ex, cfg, mapping, form, req, res);
}
}
Struts 1.1 引入模組化,解決單一巨大 struts-config.xml 團隊協作衝突:
struts-config-<module>.xml、JSP、Action、Formweb.xml 配置多個 init-param:config/<moduleName>SwitchAction 實現模組間導航webapp/
WEB-INF/
struts-config.xml # 預設模組
struts-config-catalog.xml # 商品目錄模組
struts-config-order.xml # 訂單模組
catalog/ # 模組專屬 JSP
order/
shared/ # 共用資源
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/catalog</param-name>
<param-value>/WEB-INF/struts-config-catalog.xml</param-value>
</init-param>
<init-param>
<param-name>config/order</param-name>
<param-value>/WEB-INF/struts-config-order.xml</param-value>
</init-param>
</servlet>
WEB-INF 非公開目錄,客戶端無法直接請求/WEB-INF/jsp/xxx.jsp 正常運作<action path="/logoff" type="org.apache.struts.actions.ForwardAction"
parameter="/WEB-INF/jsp/logoff.jsp"/>
| Action 類 | 用途 | 配置範例 |
|---|---|---|
ForwardAction | 單純轉發至 JSP | parameter="/WEB-INF/jsp/home.jsp" |
DispatchAction | 單類多方法,按參數分派 | parameter="method" |
MappingDispatchAction | 按 mapping 參數分派 | parameter="action" |
LookupDispatchAction | 按鍵值映射分派(支援國際化) | parameter="method" |
public class CartAction extends DispatchAction {
public ActionForward add(ActionMapping m, ActionForm f,
HttpServletRequest req, HttpServletResponse res) {
// 新增商品邏輯
return m.findForward("success");
}
public ActionForward remove(...) { ... }
public ActionForward clear(...) { ... }
}
<action path="/cart" type="com.app.CartAction"
parameter="method" name="cartForm" scope="request">
<forward name="success" path="/WEB-INF/jsp/cart.jsp"/>
</action>
URL:/cart.do?method=add、/cart.do?method=remove
DynaValidatorForm 整合驗證框架<form-bean name="logonForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
</form-bean>
DynaActionForm form = (DynaActionForm) formBean;
String username = (String) form.get("username");
form.set("password", newPassword);
注意:需強制轉型,編譯期無類型檢查。
大型 struts-config.xml 手工維護易錯,推薦工具:
| 工具 | 性質 | 特色 |
|---|---|---|
| EasyStruts | 開源 Eclipse 外掛 | 圖形化編輯、同步 XML、驗證 |
| Struts Console | 免費獨立工具 | 樹狀結構、屬性編輯器、搜尋 |
| StrutsGUI | 免費 | 輕量、跨平台 |
| Adalon / Camino / JForms | 商業 | 企業級建模、代碼生成、團隊協作 |
新專案不建議採用 Struts 1.x,優先考慮:
存量系統可採「綠絞遷移」:新功能用 Spring MVC,舊功能逐步重構,利用 DispatcherServlet 共存。