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

Struts 框架核心:Model 組件深度解析與最佳實踐

     編輯:Java 程式設計入門

Struts 架構中的 Model 角色

Model 是處理業務邏輯、封裝資料狀態的核心組件。Struts 採用 ActionForm(表單資料封裝)+ Action(控制流程)+ JavaBean/EJB(業務實體)三層 Model 結構。

JavaBean 作用域與生命週期

作用域生命週期可見範圍Servlet API 對應
page單一 JSP 請求當前頁面service 方法區域變數
request單一請求(含 forward/include)當前請求鏈Request 屬性
session用戶會話期間同用戶所有請求Session 屬性
applicationWeb 應用生命週期所有用戶、所有頁面ServletContext 屬性
// Servlet 存入 request 範圍
MyBean bean = new MyBean();
request.setAttribute("bean", bean);

// JSP 取出使用
<jsp:useBean id="bean" scope="request" class="com.example.MyBean"/>

ActionForm Bean 詳細機制

框架自動化流程

  1. 檢查指定作用域(request/session)是否存在對應 ActionForm 實例
  2. 不存在則自動實例化並放入作用域
  3. 依請求參數名稱匹配屬性,自動呼叫 setter 注入值
  4. 將填充完成的 ActionForm 傳遞給 Action.execute()

設計原則

  • 一個 ActionForm 對應一個邏輯表單(可跨越多個 JSP 頁面,如精靈式流程)
  • 同一表單的不同頁面提交至同一 Action
  • ActionForm 僅含屬性 getter/setter、reset()、validate(),不含業務邏輯
  • 簡單驗證可在 validate() 執行,複雜業務驗證移至 Action 或 Service 層

ActionForm 關鍵方法

public class UserForm extends ActionForm {
    private String username;
    private String email;

    // 標準 getter/setter
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }

    // 重置表單預設值
    public void reset(ActionMapping mapping, HttpServletRequest request) {
        this.username = "";
        this.email = "";
    }

    // 表單驗證
    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
        ActionErrors errors = new ActionErrors();
        if (username == null || username.trim().length() == 0) {
            errors.add("username", new ActionMessage("error.username.required"));
        }
        if (email != null && !email.matches(".+@.+\\..+")) {
            errors.add("email", new ActionMessage("error.email.invalid"));
        }
        return errors;
    }
}

struts-config.xml 設定

<form-bean name="userForm" type="com.example.UserForm"/>
<action path="/saveUser" type="com.example.SaveUserAction"
        name="userForm" scope="request" validate="true" input="/userForm.jsp">
    <forward name="success" path="/success.jsp"/>
</action>

系統狀態 Bean 與業務邏輯 Bean

系統狀態 Bean

代表應用運行時狀態,如購物車、用戶會話資訊、庫存快照。小型系統可直接保持完整狀態;大型系統通常對應資料庫實體,按需載入/釋放。Entity EJB 亦屬此類。

業務邏輯 Bean

封裝核心業務規則、運算、工作流。Struts Action 僅作為薄委派層,將請求轉交給業務 Bean:

public class OrderService {
    public Order createOrder(Cart cart, User user) {
        // 1. 業務驗證
        // 2. 庫存檢查
        // 3. 計算價格、稅費
        // 4. 持久化訂單
        // 5. 發送確認通知
        return order;
    }
}

Model 組件設計最佳實踐

  1. 單一職責:ActionForm 只負責資料承載與格式驗證;業務邏輯歸屬 Service Bean
  2. 作用域最小化:優先用 request 作用域,避免 session 污染
  3. 不可變傳輸:業務層回傳不可變 DTO 或領域物件,避免視圖層意外修改
  4. 驗證分層:格式驗證(必填、長度、格式)在 ActionForm/Validator;業務規則驗證在 Service
  5. 異常處理:業務層拋出具體業務異常,Action 捕獲轉向友善錯誤頁
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved