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

JSP 向 Struts 2 傳值三大模式:屬性驅動、模型驅動與 Value Object 封裝

     編輯:Java 綜合教學

JSP 向 Struts 2 傳值三大模式:屬性驅動、模型驅動與 Value Object 封裝

Struts 2 通過 OGNL 表達式將請求參數自動注入 Action。本文總結三種主流傳值模式,適用於不同業務複雜度場景。

一、模式一:屬性驅動——最直觀、適合簡單表單

原則:Action 定義與表單 name 同名的屬性及 Getter/Setter。

// JSP
<form action="login.action" method="post">
    用戶名: <input type="text" name="username"/><br/>
    密碼: <input type="password" name="password"/><br/>
    <input type="submit" value="登陸"/>
</form>

// Action
public class LoginAction extends ActionSupport {
    private String username;
    private String password;
    // getter/setter 省略
    public String execute() { return SUCCESS; }
}

優點:簡單直接。缺點:字段多時 Action 膨脹,難以複用。

二、模式二:Value Object (VO) 封裝——適合字段較多、結構固定

原則:建立獨立 VO 類,Action 持有 VO 實例,表單名稱用 vo屬性.字段 格式。

// VO 類
public class UserVO {
    private String username;
    private String password;
    // getter/setter
}

// JSP
<input type="text" name="user.username"/>
<input type="password" name="user.password"/>

// Action
public class LoginAction extends ActionSupport {
    private UserVO user = new UserVO(); // 必須初始化
    public UserVO getUser() { return user; }
    public void setUser(UserVO user) { this.user = user; }
}

優點:參數對象化、易於校驗、可複用 VO。缺點:需額外類,表單名稱稍長。

三、模式三:模型驅動 — 實現 ModelDriven 接口

原則:Action 實現 ModelDriven<T>,返回模型實例,表單名稱直接用字段名(無前綴)。

// JSP(同模式一,無 user. 前綴)
<input type="text" name="username"/>
<input type="password" name="password"/>

// Action
public class LoginAction extends ActionSupport implements ModelDriven<UserVO> {
    private UserVO user = new UserVO(); // 必須初始化

    @Override
    public UserVO getModel() {
        return user; // 返回模型實例,OGNL 直接注入其屬性
    }
    // 無需 getUser/setUser
}

優點:表單名稱最簡潔、Action 代碼最少、完全面向模型。缺點:只能綁定單一模型,多模型場景受限。

四、選型建議

場景推薦模式
字段 ≤ 5、一次性表單、無複用需求屬性驅動
字段多、需跨 Action 複用、需獨立校驗邏輯VO 封裝
單一核心模型、追求代碼極簡、REST 風格ModelDriven

五、注意事項

  • VO/模型對象**必須在聲明時或構造器中初始化**,否則 OGNL 找不到屬性拋 NullPointerException。
  • 模式二與三可混用:Action 同時持有 VO 屬性並實現 ModelDriven,視表單名稱前綴決定注入目標。
  • 複雜巢狀對象(如 user.address.city)均支援,需確保對象鏈路非空。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved