前端傳遞 userName 參數,Action 接收並調用 DAO 校驗,返回 JSON 結果。
Action 定義與參數同名屬性 + Getter/Setter,Struts2 自動注入。
public class CheckUserAction extends ActionSupport {
private String userName;
public String getUserName() { return userName; }
public void setUserName(String userName) { this.userName = userName; }
@Override
public String execute() throws Exception {
User user = new User();
user.setUserName(userName);
UserDAO dao = new UserDAO();
HttpServletResponse response = ServletActionContext.getResponse();
PrintWriter out = response.getWriter();
out.print(dao.checkExists(user) ? "exist" : "available");
return null; // 直接輸出響應,不跳轉視圖
}
}
優點:簡單直接。缺點:參數多時 Action 膨脹,屬性分散。
前端參數名改為 user.userName,Action 直接聲明 User user 屬性,Struts2 自動實例化並注入嵌套屬性。
public class CheckUserAction extends ActionSupport {
private User user;
public User getUser() { return user; }
public void setUser(User user) { this.user = user; }
// execute 中直接使用 user.getUserName()
}
優點:面向對象,參數封裝在模型對象,代碼清晰。注意:前端表單字段名需加前綴 user.。
Action 實現 ModelDriven<User>,手動實例化模型並實現 getModel() 返回。
public class CheckUserAction extends ActionSupport implements ModelDriven<User> {
private User user = new User(); // 必須手動實例化
@Override
public User getModel() { return user; }
@Override
public String execute() throws Exception {
// 直接使用 user 對象
UserDAO dao = new UserDAO();
// ...
return null;
}
// 不需要 getter/setter,但可保留
}
流程:1) 實現接口 2) 實例化模型 3) 實現 getModel() 4) 可選保留 getter/setter。
優點:模型在攔截器階段即可用,支持攔截器預處理。缺點:只能綁定單一模型,較少用。
| 方式 | 前端參數名 | Action 代碼 |
|---|---|---|
| 屬性注入 | userName | private String userName; + getter/setter |
| Domain Model | user.userName | private User user; + getter/setter |
| ModelDriven | userName | implements ModelDriven<User> + getModel() |