SpringMVC數據綁定

轉帖地址:http://www.iteye.com/topic/973918
下面挑選一些常用的數據類型,舉例說明它們的綁定方式 

1. 基本數據類型(以int爲例,其他類似): 
    Controller代碼: 
Java代碼  收藏代碼
  1. @RequestMapping("test.do")  
  2. public void test(int num) {  
  3.       
  4. }  

    JSP表單代碼: 
Java代碼  收藏代碼
  1. <form action="test.do" method="post">  
  2.    <input name="num" value="10" type="text"/>  
  3.    ......  
  4. </form>  

表單中input的name值和Controller的參數變量名保持一致,就能完成基本數據類型的數據綁定,如果不一致可以使用@RequestParam標註實現。值得一提的是,如果Controller方法參數中定義的是基本數據類型,但是從jsp提交過來的數據爲null或者""的話,會出現數據轉換的異常。也就是說,必須保證表單傳遞過來的數據不能爲null或"",所以,在開發過程中,對可能爲空的數據,最好將參數數據類型定義成包裝類型,具體參見下面的第二條。 

2. 包裝類型(以Integer爲例,其他類似): 
    Controller代碼: 
Java代碼  收藏代碼
  1. @RequestMapping("test.do")  
  2. public void test(Integer num) {  
  3.       
  4. }  

    JSP表單代碼: 
Java代碼  收藏代碼
  1. <form action="test.do" method="post">  
  2.    <input name="num" value="10" type="text"/>  
  3.    ......  
  4. </form>  

和基本數據類型基本一樣,不同之處在於,JSP表單傳遞過來的數據可以爲null或"",以上面代碼爲例,如果jsp中num爲""或者表單中無num這個input,那麼,Controller方法參數中的num值則爲null。 

3. 自定義對象類型: 
    Model代碼: 
Java代碼  收藏代碼
  1. public class User {  
  2.   
  3.     private String firstName;  
  4.   
  5.     private String lastName;  
  6.   
  7.     public String getFirstName() {  
  8.         return firstName;  
  9.     }  
  10.   
  11.     public void setFirstName(String firstName) {  
  12.         this.firstName = firstName;  
  13.     }  
  14.   
  15.     public String getLastName() {  
  16.         return lastName;  
  17.     }  
  18.   
  19.     public void setLastName(String lastName) {  
  20.         this.lastName = lastName;  
  21.     }  
  22.   
  23. }  

    Controller代碼: 
Java代碼  收藏代碼
  1. @RequestMapping("test.do")  
  2. public void test(User user) {  
  3.       
  4. }  

    JSP表單代碼: 
Java代碼  收藏代碼
  1. <form action="test.do" method="post">  
  2.    <input name="firstName" value="張" type="text"/>  
  3.    <input name="lastName" value="三" type="text"/>  
  4.    ......  
  5. </form>  

非常簡單,只需將對象的屬性名和input的name值一一對應即可。 

4. 自定義複合對象類型: 
    Model代碼: 
Java代碼  收藏代碼
  1. public class ContactInfo {  
  2.   
  3.     private String tel;  
  4.   
  5.     private String address;  
  6.   
  7.     public String getTel() {  
  8.         return tel;  
  9.     }  
  10.   
  11.     public void setTel(String tel) {  
  12.         this.tel = tel;  
  13.     }  
  14.   
  15.     public String getAddress() {  
  16.         return address;  
  17.     }  
  18.   
  19.     public void setAddress(String address) {  
  20.         this.address = address;  
  21.     }  
  22.   
  23. }  
  24.   
  25. public class User {  
  26.   
  27.     private String firstName;  
  28.   
  29.     private String lastName;  
  30.   
  31.     private ContactInfo contactInfo;  
  32.   
  33.     public String getFirstName() {  
  34.         return firstName;  
  35.     }  
  36.   
  37.     public void setFirstName(String firstName) {  
  38.         this.firstName = firstName;  
  39.     }  
  40.   
  41.     public String getLastName() {  
  42.         return lastName;  
  43.     }  
  44.   
  45.     public void setLastName(String lastName) {  
  46.         this.lastName = lastName;  
  47.     }  
  48.   
  49.     public ContactInfo getContactInfo() {  
  50.         return contactInfo;  
  51.     }  
  52.   
  53.     public void setContactInfo(ContactInfo contactInfo) {  
  54.         this.contactInfo = contactInfo;  
  55.     }  
  56.   
  57. }  

    Controller代碼: 
Java代碼  收藏代碼
  1. @RequestMapping("test.do")  
  2. public void test(User user) {  
  3.     System.out.println(user.getFirstName());  
  4.     System.out.println(user.getLastName());  
  5.     System.out.println(user.getContactInfo().getTel());  
  6.     System.out.println(user.getContactInfo().getAddress());  
  7. }  

    JSP表單代碼: 
Java代碼  收藏代碼
  1. <form action="test.do" method="post">  
  2.    <input name="firstName" value="張" /><br>  
  3.    <input name="lastName" value="三" /><br>  
  4.    <input name="contactInfo.tel" value="13809908909" /><br>  
  5.    <input name="contactInfo.address" value="北京海淀" /><br>  
  6.    <input type="submit" value="Save" />  
  7. </form>  

User對象中有ContactInfo屬性,Controller中的代碼和第3點說的一致,但是,在jsp代碼中,需要使用“屬性名(對象類型的屬性).屬性名”來命名input的name。 

5. List綁定: 
    List需要綁定在對象上,而不能直接寫在Controller方法的參數中。 
    Model代碼: 
Java代碼  收藏代碼
  1. public class User {  
  2.   
  3.     private String firstName;  
  4.   
  5.     private String lastName;  
  6.   
  7.     public String getFirstName() {  
  8.         return firstName;  
  9.     }  
  10.   
  11.     public void setFirstName(String firstName) {  
  12.         this.firstName = firstName;  
  13.     }  
  14.   
  15.     public String getLastName() {  
  16.         return lastName;  
  17.     }  
  18.   
  19.     public void setLastName(String lastName) {  
  20.         this.lastName = lastName;  
  21.     }  
  22.   
  23. }  
  24.   
  25.        public class UserListForm {  
  26.   
  27.     private List<User> users;  
  28.   
  29.     public List<User> getUsers() {  
  30.         return users;  
  31.     }  
  32.   
  33.     public void setUsers(List<User> users) {  
  34.         this.users = users;  
  35.     }  
  36.   
  37. }  

    Controller代碼: 
Java代碼  收藏代碼
  1. @RequestMapping("test.do")  
  2. public void test(UserListForm userForm) {  
  3.     for (User user : userForm.getUsers()) {  
  4.         System.out.println(user.getFirstName() + " - " + user.getLastName());  
  5.     }  
  6. }  

    JSP表單代碼: 
Java代碼  收藏代碼
  1. <form action="test.do" method="post">  
  2.    <table>  
  3.       <thead>  
  4.          <tr>  
  5.             <th>First Name</th>  
  6.             <th>Last Name</th>  
  7.          </tr>  
  8.       </thead>  
  9.       <tfoot>  
  10.          <tr>  
  11.             <td colspan="2"><input type="submit" value="Save" /></td>  
  12.          </tr>  
  13.       </tfoot>  
  14.       <tbody>  
  15.          <tr>  
  16.             <td><input name="users[0].firstName" value="aaa" /></td>  
  17.             <td><input name="users[0].lastName" value="bbb" /></td>  
  18.          </tr>  
  19.          <tr>  
  20.             <td><input name="users[1].firstName" value="ccc" /></td>  
  21.             <td><input name="users[1].lastName" value="ddd" /></td>  
  22.          </tr>  
  23.          <tr>  
  24.             <td><input name="users[2].firstName" value="eee" /></td>  
  25.             <td><input name="users[2].lastName" value="fff" /></td>  
  26.          </tr>  
  27.       </tbody>  
  28.    </table>  
  29. </form>  

其實,這和第4點User對象中的contantInfo數據的綁定有點類似,但是這裏的UserListForm對象裏面的屬性被定義成List,而不是普通自定義對象。所以,在JSP中需要指定List的下標。值得一提的是,Spring會創建一個以最大下標值爲size的List對象,所以,如果JSP表單中有動態添加行、刪除行的情況,就需要特別注意,譬如一個表格,用戶在使用過程中經過多次刪除行、增加行的操作之後,下標值就會與實際大小不一致,這時候,List中的對象,只有在jsp表單中對應有下標的那些纔會有值,否則會爲null,看個例子: 
    JSP表單代碼: 
Java代碼  收藏代碼
  1. <form action="test.do" method="post">  
  2.    <table>  
  3.       <thead>  
  4.          <tr>  
  5.             <th>First Name</th>  
  6.             <th>Last Name</th>  
  7.          </tr>  
  8.       </thead>  
  9.       <tfoot>  
  10.          <tr>  
  11.             <td colspan="2"><input type="submit" value="Save" /></td>  
  12.          </tr>  
  13.       </tfoot>  
  14.       <tbody>  
  15.          <tr>  
  16.             <td><input name="users[0].firstName" value="aaa" /></td>  
  17.             <td><input name="users[0].lastName" value="bbb" /></td>  
  18.          </tr>  
  19.          <tr>  
  20.             <td><input name="users[1].firstName" value="ccc" /></td>  
  21.             <td><input name="users[1].lastName" value="ddd" /></td>  
  22.          </tr>  
  23.          <tr>  
  24.             <td><input name="users[20].firstName" value="eee" /></td>  
  25.             <td><input name="users[20].lastName" value="fff" /></td>  
  26.          </tr>  
  27.       </tbody>  
  28.    </table>  
  29. </form>  

這個時候,Controller中的userForm.getUsers()獲取到List的size爲21,而且這21個User對象都不會爲null,但是,第2到第19的User對象中的firstName和lastName都爲null。打印結果: 
Java代碼  收藏代碼
  1. aaa - bbb  
  2. ccc - ddd  
  3. null - null  
  4. null - null  
  5. null - null  
  6. null - null  
  7. null - null  
  8. null - null  
  9. null - null  
  10. null - null  
  11. null - null  
  12. null - null  
  13. null - null  
  14. null - null  
  15. null - null  
  16. null - null  
  17. null - null  
  18. null - null  
  19. null - null  
  20. null - null  
  21. eee - fff  


6. Set綁定: 
    Set和List類似,也需要綁定在對象上,而不能直接寫在Controller方法的參數中。但是,綁定Set數據時,必須先在Set對象中add相應的數量的模型對象。 
    Model代碼: 
Java代碼  收藏代碼
  1. public class User {  
  2.   
  3.     private String firstName;  
  4.   
  5.     private String lastName;  
  6.   
  7.     public String getFirstName() {  
  8.         return firstName;  
  9.     }  
  10.   
  11.     public void setFirstName(String firstName) {  
  12.         this.firstName = firstName;  
  13.     }  
  14.   
  15.     public String getLastName() {  
  16.         return lastName;  
  17.     }  
  18.   
  19.     public void setLastName(String lastName) {  
  20.         this.lastName = lastName;  
  21.     }  
  22.   
  23. }  
  24.   
  25. public class UserSetForm {  
  26.   
  27.     private Set<User> users = new HashSet<User>();  
  28.       
  29.     public UserSetForm(){  
  30.         users.add(new User());  
  31.         users.add(new User());  
  32.         users.add(new User());  
  33.     }  
  34.   
  35.     public Set<User> getUsers() {  
  36.         return users;  
  37.     }  
  38.   
  39.     public void setUsers(Set<User> users) {  
  40.         this.users = users;  
  41.     }  
  42.   
  43. }  

    Controller代碼: 
Java代碼  收藏代碼
  1. @RequestMapping("test.do")  
  2. public void test(UserSetForm userForm) {  
  3.     for (User user : userForm.getUsers()) {  
  4.         System.out.println(user.getFirstName() + " - " + user.getLastName());  
  5.     }  
  6. }  

    JSP表單代碼: 
Java代碼  收藏代碼
  1. <form action="test.do" method="post">  
  2.    <table>  
  3.       <thead>  
  4.          <tr>  
  5.             <th>First Name</th>  
  6.             <th>Last Name</th>  
  7.          </tr>  
  8.       </thead>  
  9.       <tfoot>  
  10.          <tr>  
  11.             <td colspan="2"><input type="submit" value="Save" /></td>  
  12.          </tr>  
  13.       </tfoot>  
  14.       <tbody>  
  15.          <tr>  
  16.             <td><input name="users[0].firstName" value="aaa" /></td>  
  17.             <td><input name="users[0].lastName" value="bbb" /></td>  
  18.          </tr>  
  19.          <tr>  
  20.             <td><input name="users[1].firstName" value="ccc" /></td>  
  21.             <td><input name="users[1].lastName" value="ddd" /></td>  
  22.          </tr>  
  23.          <tr>  
  24.             <td><input name="users[2].firstName" value="eee" /></td>  
  25.             <td><input name="users[2].lastName" value="fff" /></td>  
  26.          </tr>  
  27.       </tbody>  
  28.    </table>  
  29. </form>  

基本和List綁定類似。 
需要特別提醒的是,如果最大下標值大於Set的size,則會拋出org.springframework.beans.InvalidPropertyException異常。所以,在使用時有些不便。暫時沒找到解決方法,如果有網友知道,請回帖共享你的做法。 

5. Map綁定: 
    Map最爲靈活,它也需要綁定在對象上,而不能直接寫在Controller方法的參數中。 
    Model代碼: 
Java代碼  收藏代碼
  1. public class User {  
  2.   
  3.     private String firstName;  
  4.   
  5.     private String lastName;  
  6.   
  7.     public String getFirstName() {  
  8.         return firstName;  
  9.     }  
  10.   
  11.     public void setFirstName(String firstName) {  
  12.         this.firstName = firstName;  
  13.     }  
  14.   
  15.     public String getLastName() {  
  16.         return lastName;  
  17.     }  
  18.   
  19.     public void setLastName(String lastName) {  
  20.         this.lastName = lastName;  
  21.     }  
  22.   
  23. }  
  24.   
  25. public class UserMapForm {  
  26.   
  27.     private Map<String, User> users;  
  28.   
  29.     public Map<String, User> getUsers() {  
  30.         return users;  
  31.     }  
  32.   
  33.     public void setUsers(Map<String, User> users) {  
  34.         this.users = users;  
  35.     }  
  36.   
  37. }  

    Controller代碼: 
Java代碼  收藏代碼
  1. @RequestMapping("test.do")  
  2. public void test(UserMapForm userForm) {  
  3.     for (Map.Entry<String, User> entry : userForm.getUsers().entrySet()) {  
  4.         System.out.println(entry.getKey() + ": " + entry.getValue().getFirstName() + " - " +  
  5.                                  entry.getValue().getLastName());  
  6.     }  
  7. }  

    JSP表單代碼: 
Java代碼  收藏代碼
  1. <form action="test.do" method="post">  
  2.    <table>  
  3.       <thead>  
  4.          <tr>  
  5.             <th>First Name</th>  
  6.             <th>Last Name</th>  
  7.          </tr>  
  8.       </thead>  
  9.       <tfoot>  
  10.          <tr>  
  11.             <td colspan="2"><input type="submit" value="Save" /></td>  
  12.          </tr>  
  13.       </tfoot>  
  14.       <tbody>  
  15.          <tr>  
  16.             <td><input name="users['x'].firstName" value="aaa" /></td>  
  17.             <td><input name="users['x'].lastName" value="bbb" /></td>  
  18.          </tr>  
  19.          <tr>  
  20.             <td><input name="users['y'].firstName" value="ccc" /></td>  
  21.             <td><input name="users['y'].lastName" value="ddd" /></td>  
  22.          </tr>  
  23.          <tr>  
  24.             <td><input name="users['z'].firstName" value="eee" /></td>  
  25.             <td><input name="users['z'].lastName" value="fff" /></td>  
  26.          </tr>  
  27.       </tbody>  
  28.    </table>  
  29. </form>  

打印結果: 
Java代碼  收藏代碼
  1. x: aaa - bbb  
  2. y: ccc - ddd  
  3. z: eee - fff  
發佈了28 篇原創文章 · 獲贊 9 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章