引用出處:cnblogs.com/haimishasha/p/6193235.html
Struts2中Action接收參數的方法主要有以下三種:
1.使用Action的屬性接收參數(最原始的方式):
a.定義:在Action類中定義屬性,創建get和set方法;
b.接收:通過屬性接收參數,如:userName;
c.發送:使用屬性名傳遞參數,如:user1!add?userName=jim;
2.使用DomainModel接收參數:
a.定義:定義Model類,在Action中定義Model類的對象(不需要new),創建該對象的get和set方法;
b.接收:通過對象的屬性接收參數,如:user.getUserName();
c.發送:使用對象的屬性傳遞參數,如:user2!add?user.userName=mike;
3.使用ModelDriven接收參數(現在用的比較多的方式):
a.定義:Action實現ModelDriven泛型接口,定義Model類的對象(必須new),通過getModel方法返回該對象;
b.接收:通過對象的屬性接收參數,如:user.getUserName();
c.發送:直接使用屬性名傳遞參數,如:user2!add?userName=tom
1.使用Action的屬性接收參數(最原始的方式):
a.定義:在Action類中定義屬性,創建get和set方法;
b.接收:通過屬性接收參數,如:userName;
c.發送:使用屬性名傳遞參數,如:user1!add?userName=jim;
2.使用DomainModel接收參數:
a.定義:定義Model類,在Action中定義Model類的對象(不需要new),創建該對象的get和set方法;
b.接收:通過對象的屬性接收參數,如:user.getUserName();
c.發送:使用對象的屬性傳遞參數,如:user2!add?user.userName=mike;
3.使用ModelDriven接收參數(現在用的比較多的方式):
a.定義:Action實現ModelDriven泛型接口,定義Model類的對象(必須new),通過getModel方法返回該對象;
b.接收:通過對象的屬性接收參數,如:user.getUserName();
c.發送:直接使用屬性名傳遞參數,如:user2!add?userName=tom
一 、Action接收請求參數
struts2內部提供三種請求參數封裝機制
1) Action 本身作為model對象,通過成員setter封裝(使用與成員少的)
<form action="${pageContext.request.contextPath }/regist1.action" method="post"> 用戶名 <input type="text" name="username" /><br/> 密碼<input type="password" name="password"/><br/> 年齡 <input type="text" name="age" /><br/> <input type="submit" value="注冊" /> </form> public class RegistAction1 extends ActionSupport { 提交的有什么參數就設置什么字段,並寫好setter方法 private String username; private String password; private int age; public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } public void setAge(int age) { this.age = age; } }
注:通過以上特性就能清楚,struts2的action是多例的,每個用戶有每個用戶的參數,每個參數封裝到一組javabean中,也就是說每次請求都會創建 struts2的Action 對象。
2) 創建獨立model對象,頁面通過ognl表達式封裝
<form action="${pageContext.request.contextPath }/regist2.action" method="post"> 用戶名 <input type="text" name="user.username" /><br/> 密碼<input type="password" name="user.password"/><br/> 年齡 <input type="text" name="user.age" /><br/> <input type="submit" value="注冊" /> </form> * 頁面中使用ognl寫法 name="user.username" 底層就會執行 Action的setUser() --- > setUsername(); 在action中的寫法 public class RegistAction2 extends ActionSupport { private User user;持有對象 public void setUser(User user) { this.user = user; } // 必須提供get方法 ----- 如果不提供只能封裝一個屬性,下次再封裝第二個屬性的時候又是一個新的user public User getUser() { return this.user; } } 單獨創建一個user的domain public class User { private String username; private String password; private int age; ... }
3)使用ModelDriven接口,對請求數據進行封裝
<form action="${pageContext.request.contextPath }/regist3.action" method="post"> 用戶名 <input type="text" name="username" /><br/> 密碼<input type="password" name="password"/><br/> 年齡 <input type="text" name="age" /><br/> <input type="submit" value="注冊" /> </form> public class RegistAction3 extends ActionSupport implements ModelDriven<User> { private User user = new User(); // 必須手動new,不然就出現空指針異常 @Override public User getModel() { return user; } } 單獨創建一個user的domain public class User { private String username; private String password; private int age; }
原理:發起請求后, struts2 會調用 getModel().setUsername()、 getModel().setPassword()因此必須手動 對model進行初始化
結論:三種參數封裝方式,在開發中主要使用第三種
第一種只適用於請求參數非常少的情況的封裝,第二種更加靈活,支持一個表單數據封裝到不同model對象,第三種封裝方式,只能支持一個model對象。