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

Struts2 Action 獲取數據三種方式詳解:屬性注入、Domain Model、ModelDriven

     編輯:Java 相關知識

場景:用戶註冊檢查用戶名是否存在

前端傳遞 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 膨脹,屬性分散。

方式二:Domain Model(推薦常用)

前端參數名改為 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.。

方式三:ModelDriven

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 代碼
屬性注入userNameprivate String userName; + getter/setter
Domain Modeluser.userNameprivate User user; + getter/setter
ModelDrivenuserNameimplements ModelDriven<User> + getModel()

建議選型

  1. Domain Model:最通用、符合 OO、參數分組清晰,首選。
  2. 屬性注入:簡單頁面、參數極少時可用。
  3. ModelDriven:需在攔截器中訪問模型時考慮,一般業務無需。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved