ModelDriven 是 Struts2 提供的一種模型驅動機制,讓 Action 直接操作領域模型對象,省去大量 setter/getter 代碼,實現表單數據自動封裝。
ModelDriven<T> 接口getModel() 返回模型實例ModelDrivenInterceptor 在 paramsPrepareParamsStack 中執行,將請求參數自動注入模型對象public class UserAction extends ActionSupport implements ModelDriven<User> {
private User user = new User(); // 模型實例
@Override
public User getModel() { return user; }
public String register() {
// 直接使用 user 對象,屬性已自動填充
userService.save(user);
return SUCCESS;
}
}
// 領域模型
public class User {
private String username;
private String password;
private String email;
// getter/setter 省略
}
支持巢狀屬性:user.address.city 對應表單字段名 user.address.city,OGNL 會自動遍歷對象圖。
public class UserAction extends ActionSupport
implements ModelDriven<User>, Validateable {
// ...
@Override
public void validate() {
if (user.getUsername() == null || user.getUsername().length() < 3) {
addFieldError("user.username", "用戶名至少3位");
}
}
}
一個 Action 只能綁定一個模型。若需多模型,可:
Preparable 手動封裝| 現象 | 原因 | 解決 |
|---|---|---|
| 屬性為 null | 模型未實例化 | 聲明處 new 或 prepare() 中初始化 |
| 集合/數組不填充 | OGNL 類型轉換失敗 | 配置 TypeConverter 或使用 List/Map |
| 驗證不生效 | 未實現 Validateable | 實現接口並重寫 validate() |
Preparable 初始化關聯對象(如下拉選項)ModelDriven 將「數據傳輸」與「業務邏輯」解耦,是 Struts2 開發效率的關鍵槓桿。掌握其攔截器鏈位置與 OGNL 表達式規則,能避開 90% 的封裝坑點。