引用出處:cnblogs.com/haimishasha/p/6193235.htmlhtml
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接收請求參數java
struts2內部提供三種請求參數封裝機制dom
1) Action 自己做爲model對象,經過成員setter封裝(使用與成員少的)ide
<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 對象。post
2) 建立獨立model對象,頁面經過ognl表達式封裝this
<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接口,對請求數據進行封裝spa
<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進行初始化指針
結論:三種參數封裝方式,在開發中主要使用第三種code
第一種只適用於請求參數很是少的狀況的封裝,第二種更加靈活,支持一個表單數據封裝到不一樣model對象,第三種封裝方式,只能支持一個model對象。orm