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

Struts2 參數傳遞三大方式詳解:屬性驅動、模型驅動、領域模型

     編輯:Java 相關知識

Struts2 參數接收機制

Struts2 通過 OGNL 表達式 將請求參數映射到 Action 對象。核心規則:參數名對應 setter 方法(如 user.name → setUser() → user.setName())。

方式一:屬性驅動 —— 最原始、最直觀

Action 定義

public class UserAction extends ActionSupport {
    private String name;
    private int age;
    // getter/setter 省略

    public String add() {
        System.out.println("name=" + name + ", age=" + age);
        return SUCCESS;
    }
}

前端傳參

<a href="user/user!add.action?name=zhangsan&age=20">添加</a>

優缺點

  • ✅ 簡單,無需額外對象
  • ❌ 參數多時 Action 膨脹,大量 getter/setter
  • ❌ 參數名與屬性強耦合,重構困難

方式二:領域模型 —— 封裝實體對象,推薦日常使用

實體類

public class User {
    private String name;
    private int age;
    // getter/setter
}

Action 定義

public class UserAction extends ActionSupport {
    private User user; // 必須提供 getter/setter

    public String add() {
        System.out.println("name=" + user.getName() + ", age=" + user.getAge());
        return SUCCESS;
    }
}

前端傳參(關鍵:前綴對象名)

<a href="user/user!add.action?user.name=zhangsan&user.age=20">添加</a>

原理

  1. Struts2 解析參數 user.name
  2. 調用 action.setUser(new User()) 自動實例化
  3. 調用 user.setName("zhangsan") 賦值

優缺點

  • ✅ 參數歸類清晰,符合 OOP,Action 瘦身
  • ✅ 實體可復用(Service/DAO 共用)
  • ✅ 表單字段多時維護性極佳
  • ⚠️ 嵌套層級過深(如 user.address.city.name)會增加 OGNL 解析開銷

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

Action 定義

public class UserAction extends ActionSupport implements ModelDriven<User> {
    private User user = new User(); // 必須手動實例化

    @Override
    public User getModel() {
        return user; // 返回模型對象
    }

    public String add() {
        System.out.println("name=" + user.getName() + ", age=" + user.getAge());
        return SUCCESS;
    }
}

前端傳參(無前綴,同屬性驅動)

<a href="user/user!add.action?name=zhangsan&age=20">添加</a>

原理

  1. Struts2 檢測 Action 實現 ModelDriven
  2. 調用 getModel() 獲取模型對象
  3. 直接對模型對象設置屬性(user.setName())

優缺點

  • ✅ 參數名簡潔,無前綴
  • ❌ 僅支持單一模型對象,多實體場景無力
  • ❌ 需手動 new 模型,易忘導致 NPE
  • ❌ 違背 Struts2 默認「屬性驅動」直覺,團隊認知成本高

三種方式對比總結

維度屬性驅動領域模型模型驅動
參數格式name=valueuser.name=valuename=value
Action 字段多個基本類型實體對象實體對象 (ModelDriven)
實例化責任框架自動框架自動開發者手動
多實體支持差好差
推薦場景極簡參數 (≤3)常規業務 (推薦)單一實體、REST 風格

進階:複雜集合參數綁定

// 前端
<input name="users[0].name" value="A">
<input name="users[1].name" value="B">

// Action
private List<User> users; // 需初始化或框架自動創建
// 獲取 users.get(0).getName()

最佳實踐建議

  1. 90% 場景用領域模型:清晰、擴展、復用三全其美
  2. 極簡接口用屬性驅動:如登錄、簡單查詢
  3. 避免模型驅動:除非團隊統一規範且僅處理單一實體
  4. 參數校驗:配合 validate() 方法或 @Valid (Struts2-Validation 插件)
  5. 類型轉換錯誤處理:自定義 TypeConverter 或全局 conversionError 拦截器

總結

Struts2 參數傳遞本質是 OGNL 對象圖導航與賦值。領域模型 最符合領域驅動設計思想,將請求參數自然映射為領域對象,是企業級開發的首選模式。理解三者底層機制,能快速定位「參數收不到」、「類型轉換失敗」等疑難雜癥。

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