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 膨脹,難以複用。
原則:建立獨立 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。缺點:需額外類,表單名稱稍長。
原則: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 |
NullPointerException。user.address.city)均支援,需確保對象鏈路非空。