首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Jakarta Struts 實戰精華:七大核心經驗與最佳實踐總結

     編輯:Java 相關知識

Struts 作為經典 MVC 框架,雖已非主流選擇,但大量存量系統仍在運行。本文萃取實戰七大核心經驗:擴展原則、異常處理、模組化、JSP 安全、預建 Action、動態表單、視覺化工具,助你高效維護與優化 Struts 應用。

1. 僅在必要時擴展框架

  • Struts 提供豐富擴展點:RequestProcessor、ActionServlet、配置類、異常處理器等均可替換
  • 原則:先確認內建功能能否滿足(ForwardAction、DispatchAction、驗證框架、Tiles 等),避免重複造輪子
  • 擴展代碼增加複雜度與維護成本,必須有明確 ROI

2. 使用宣告式異常處理

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);
    }
}

3. 採用應用模組化

Struts 1.1 引入模組化,解決單一巨大 struts-config.xml 團隊協作衝突:

  • 每模組獨立 struts-config-<module>.xml、JSP、Action、Form
  • web.xml 配置多個 init-param:config/<moduleName>
  • 使用 SwitchAction 實現模組間導航

目錄結構範例

webapp/
  WEB-INF/
    struts-config.xml          # 預設模組
    struts-config-catalog.xml  # 商品目錄模組
    struts-config-order.xml    # 訂單模組
  catalog/                     # 模組專屬 JSP
  order/
  shared/                      # 共用資源

web.xml 配置

<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>

4. 將 JSP 放入 WEB-INF 保護源碼

  • WEB-INF 非公開目錄,客戶端無法直接請求
  • Action 轉發至 /WEB-INF/jsp/xxx.jsp 正常運作
  • 強制所有頁面經由 Action 進入,符合 MVC 原則
  • 注意:WebLogic 早期版本不支援,需驗證容器相容性

struts-config.xml 範例

<action path="/logoff" type="org.apache.struts.actions.ForwardAction"
        parameter="/WEB-INF/jsp/logoff.jsp"/>

5. 善用預建 Action 類減少樣板代碼

Action 類用途配置範例
ForwardAction單純轉發至 JSPparameter="/WEB-INF/jsp/home.jsp"
DispatchAction單類多方法,按參數分派parameter="method"
MappingDispatchAction按 mapping 參數分派parameter="action"
LookupDispatchAction按鍵值映射分派(支援國際化)parameter="method"

DispatchAction 實戰

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

6. 採用動態 ActionForm (DynaActionForm)

  • 免建立具體 Form Bean 類,直接在 XML 定義屬性
  • 搭配 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>

Action 中存取

DynaActionForm form = (DynaActionForm) formBean;
String username = (String) form.get("username");
form.set("password", newPassword);

注意:需強制轉型,編譯期無類型檢查。

7. 使用視覺化配置工具

大型 struts-config.xml 手工維護易錯,推薦工具:

工具性質特色
EasyStruts開源 Eclipse 外掛圖形化編輯、同步 XML、驗證
Struts Console免費獨立工具樹狀結構、屬性編輯器、搜尋
StrutsGUI免費輕量、跨平台
Adalon / Camino / JForms商業企業級建模、代碼生成、團隊協作

現代化遷移建議

新專案不建議採用 Struts 1.x,優先考慮:

  • Spring MVC:註解驅動、REST 原生支援、生態完整
  • Spring Boot:自動配置、內嵌容器、生產級監控
  • Struts 2:若必須延續 Struts 風格,採用 WebWork 核心的 Struts 2

存量系統可採「綠絞遷移」:新功能用 Spring MVC,舊功能逐步重構,利用 DispatcherServlet 共存。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved