Struts2 通過 OGNL 表達式 將請求參數映射到 Action 對象。核心規則:參數名對應 setter 方法(如 user.name → setUser() → user.setName())。
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>
public class User {
private String name;
private int age;
// getter/setter
}
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>
user.nameaction.setUser(new User()) 自動實例化user.setName("zhangsan") 賦值user.address.city.name)會增加 OGNL 解析開銷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>
ModelDrivengetModel() 獲取模型對象user.setName())| 維度 | 屬性驅動 | 領域模型 | 模型驅動 |
|---|---|---|---|
| 參數格式 | name=value | user.name=value | name=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()
validate() 方法或 @Valid (Struts2-Validation 插件)TypeConverter 或全局 conversionError 拦截器Struts2 參數傳遞本質是 OGNL 對象圖導航與賦值。領域模型 最符合領域驅動設計思想,將請求參數自然映射為領域對象,是企業級開發的首選模式。理解三者底層機制,能快速定位「參數收不到」、「類型轉換失敗」等疑難雜癥。