SpringMVC的各种参数绑定方式

1. 基本数据类型(以int为例,其他类似):
Controller代码:

  1. @RequestMapping("saysth.do")
  2. public void test(int count) {
  3. }

表单代码:

  1. <form action="saysth.do" method="post">
  2. <input name="count" value="10" type="text"/>
  3. ......
  4. </form>

表单中input的name值和Controller的参数变量名保持一致,就能完成数据绑定,如果不一致可以使用@RequestParam注解。需要注意的是,如果Controller方法参数中定义的是基本数据类型,但是从页面提交过来的数据为null或者”"的话,会出现数据转换的异常。也就是必须保证表单传递过来的数据不能为null或”",所以,在开发过程中,对可能为空的数据,最好将参数数据类型定义成包装类型,具体参见下面的例子。

2. 包装类型(以Integer为例,其他类似):
Controller代码:

  1. @RequestMapping("saysth.do")
  2. public void test(Integer count) {
  3. }

表单代码:

  1. <form action="saysth.do" method="post">
  2. <input name="count" value="10" type="text"/>
  3. ......
  4. </form>

和基本数据类型基本一样,不同之处在于,表单传递过来的数据可以为null或”",以上面代码为例,如果表单中num为”"或者表单中无num这个input,那么,Controller方法参数中的num值则为null。

3. 自定义对象类型:
Model代码:

  1. public class User {
  2. private String firstName;
  3. private String lastName;
  4.  
  5. public String getFirstName() {
  6. return firstName;
  7. }
  8.  
  9. public void setFirstName(String firstName) {
  10. this.firstName = firstName;
  11. }
  12.  
  13. public String getLastName() {
  14. return lastName;
  15. }
  16.  
  17. public void setLastName(String lastName) {
  18. this.lastName = lastName;
  19. }
  20.  
  21. }

Controller代码:

  1. @RequestMapping("saysth.do")
  2. public void test(User user) {
  3. }

表单代码:

  1. <form action="saysth.do" method="post">
  2. <input name="firstName" value="张" type="text"/>
  3. <input name="lastName" value="三" type="text"/>
  4. ......
  5. </form>

非常简单,只需将对象的属性名和input的name值一一匹配即可。

4. 自定义复合对象类型:
Model代码:

  1. public class ContactInfo {
  2. private String tel;
  3. private String address;
  4.  
  5. public String getTel() {
  6. return tel;
  7. }
  8.  
  9. public void setTel(String tel) {
  10. this.tel = tel;
  11. }
  12.  
  13. public String getAddress() {
  14. return address;
  15. }
  16.  
  17. public void setAddress(String address) {
  18. this.address = address;
  19. }
  20.  
  21. }
  22.  
  23. public class User {
  24. private String firstName;
  25. private String lastName;
  26. private ContactInfo contactInfo;
  27.  
  28. public String getFirstName() {
  29. return firstName;
  30. }
  31.  
  32. public void setFirstName(String firstName) {
  33. this.firstName = firstName;
  34. }
  35.  
  36. public String getLastName() {
  37. return lastName;
  38. }
  39.  
  40. public void setLastName(String lastName) {
  41. this.lastName = lastName;
  42. }
  43.  
  44. public ContactInfo getContactInfo() {
  45. return contactInfo;
  46. }
  47.  
  48. public void setContactInfo(ContactInfo contactInfo) {
  49. this.contactInfo = contactInfo;
  50. }
  51.  
  52. }

Controller代码:

  1. @RequestMapping("saysth.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. }

表单代码:

  1. <form action="saysth.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点说的一致,但是,在表单代码中,需要使用“属性名(对象类型的属性).属性名”来命名input的name。

5. List绑定:
List需要绑定在对象上,而不能直接写在Controller方法的参数中。
Model代码:

  1. public class User {
  2. private String firstName;
  3. private String lastName;
  4.  
  5. public String getFirstName() {
  6. return firstName;
  7. }
  8.  
  9. public void setFirstName(String firstName) {
  10. this.firstName = firstName;
  11. }
  12.  
  13. public String getLastName() {
  14. return lastName;
  15. }
  16.  
  17. public void setLastName(String lastName) {
  18. this.lastName = lastName;
  19. }
  20.  
  21. }
  22.  
  23. public class UserListForm {
  24. private List<User> users;
  25.  
  26. public List<User> getUsers() {
  27. return users;
  28. }
  29.  
  30. public void setUsers(List<User> users) {
  31. this.users = users;
  32. }
  33.  
  34. }

Controller代码:

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

表单代码:

  1. <form action="saysth.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,而不是普通自定义对象。所以,在表单中需要指定List的下标。值得一提的是,Spring会创建一个以最大下标值为size的List对象,所以,如果表单中有动态添加行、删除行的情况,就需要特别注意,譬如一个表格,用户在使用过程中经过多次删除行、增加行的操作之后,下标值就会与实际大小不一致,这时候,List中的对象,只有在表单中对应有下标的那些才会有值,否则会为null,看个例子:

表单代码:

  1. <form action="saysth.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。打印结果:

  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代码:

  1. public class User {
  2. private String firstName;
  3. private String lastName;
  4.  
  5. public String getFirstName() {
  6. return firstName;
  7. }
  8.  
  9. public void setFirstName(String firstName) {
  10. this.firstName = firstName;
  11. }
  12.  
  13. public String getLastName() {
  14. return lastName;
  15. }
  16.  
  17. public void setLastName(String lastName) {
  18. this.lastName = lastName;
  19. }
  20.  
  21. }
  22.  
  23. public class UserSetForm {
  24. private Set<User> users = new HashSet<User>();
  25.  
  26. public UserSetForm() {
  27. users.add(new User());
  28. users.add(new User());
  29. users.add(new User());
  30. }
  31.  
  32. public Set<User> getUsers() {
  33. return users;
  34. }
  35.  
  36. public void setUsers(Set<User> users) {
  37. this.users = users;
  38. }
  39.  
  40. }

Controller代码:

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

表单代码:

  1. <form action="saysth.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异常。所以,在使用时有些不便。

7. Map绑定:
Map最为灵活,它也需要绑定在对象上,而不能直接写在Controller方法的参数中。
Model代码:

  1. public class User {
  2. private String firstName;
  3. private String lastName;
  4.  
  5. public String getFirstName() {
  6. return firstName;
  7. }
  8.  
  9. public void setFirstName(String firstName) {
  10. this.firstName = firstName;
  11. }
  12.  
  13. public String getLastName() {
  14. return lastName;
  15. }
  16.  
  17. public void setLastName(String lastName) {
  18. this.lastName = lastName;
  19. }
  20.  
  21. }
  22.  
  23. public class UserMapForm {
  24. private Map<String, User> users;
  25.  
  26. public Map<String, User> getUsers() {
  27. return users;
  28. }
  29.  
  30. public void setUsers(Map<String, User> users) {
  31. this.users = users;
  32. }
  33.  
  34. }

Controller代码:

  1. @RequestMapping("saysth.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. }

表单代码:

  1. <form action="saysth.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>

打印结果:

  1. x: aaa - bbb
  2. y: ccc - ddd
  3. z: eee - fff

[Spring MVC] - SpringMVC的各种参数绑定方式的更多相关文章

  1. SpringMVC的各种参数绑定方式

    1. 基本数据类型(以int为例,其他类似):2. 包装类型(以Integer为例,其他类似):3. 自定义对象类型:4. 自定义复合对象类型:5. List绑定:6. Set绑定:7. Map绑定: ...

  2. [转载]SpringMVC的Model参数绑定方式

    SpringMVC的各种参数绑定方式 http://www.cnblogs.com/HD/p/4107674.html springMVC中复杂嵌套对象.List等集合类型数据绑定 http://ww ...

  3. 161229、SpringMVC的各种参数绑定方式

    1. 基本数据类型(以int为例,其他类似): Controller代码: @RequestMapping("saysth.do") public void test(int co ...

  4. 23SpringMvc_各种参数绑定方式-就是<input那种

    本篇博文转载自http://www.cnblogs.com/HD/p/4107674.html: SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似):Controlle ...

  5. springmvc的初始化参数绑定

    一.springmvc的初始化参数绑定 此种和我们之前说的类型转换非常相似,可以看作是一种类型转换 在初始化参数绑定时  重要的是参数类型 -------------------单日期的绑定 二. 配 ...

  6. SpringMVC介绍及参数绑定

    本节内容: SpringMVC介绍 入门程序 SpringMVC架构 SpringMVC整合MyBatis 参数绑定 SpringMVC和Struts2的区别 一.SpringMVC介绍 1. 什么是 ...

  7. SpringMVC中的参数绑定总结

    众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在这一篇博文中,我将总结一下springm ...

  8. 【SpringMVC学习05】SpringMVC中的参数绑定总结——较乱后期准备加入 同一篇幅他人的参数绑定

    众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在这一篇博文中,我将总结一下springm ...

  9. SpringMVC详解------参数绑定

    SpringMVC详解------参数绑定  转载于:https://blog.csdn.net/swebin/article/details/92795422 目录 1.SpringMVC 参数绑定 ...

随机推荐

  1. iOS中属性与成员变量的区别

    一.类Class中的属性property 在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: @interfa ...

  2. Linux下I/O模型

    Unix下共有五种I/O模型 1. 阻塞式I/O 2. 非阻塞式I/O 3. I/O复用(select和poll) 4. 信号驱动式I/O(SIGIO) 5. 异步I/O(POSIX的aio_系列函数 ...

  3. python访问数据库一

    直接访问mysql,示例如下: # coding:utf-8 import time import MySQLdb # import traceback # import sys conn = MyS ...

  4. NGINX怎样处理惊群的

    写在前面 写NGINX系列的随笔,一来总结学到的东西,二来记录下疑惑的地方,在接下来的学习过程中去解决疑惑. 也希望同样对NGINX感兴趣的朋友能够解答我的疑惑,或者共同探讨研究. 整个NGINX系列 ...

  5. 解决Linux下Tomcat日志目录下的catalina.log日志文件过大的问题

    本文摘自:(http://blog.csdn.net/stevencn76/article/details/6246162) 分类: Java技术专区2011-03-13 12:25 5017人阅读  ...

  6. junit高级篇(参数化、打包测试)-实例代码

    工程目录: 参数化测试,SquareTest.java: import static org.junit.Assert.*; import java.util.Arrays; import java. ...

  7. 使用jQuery Mobile的注意事项(译)

    翻译编辑自:http://www.appnovation.com/blog/7-things-know-about-jquery-mobile-working-it 一.Android和IOS的内置键 ...

  8. NetworkComms V3 之同步收发数据

    NetworkComms网络通信框架序言 NetworkComms通信框架,是一款来自英国的c#语言编写的通信框架,历时6年研发,成熟稳定,性能可靠. NetworkComms v3的核心功能在一定程 ...

  9. Halcon 10.0:Sample 分割边缘拟合圆Circles.hdev

    处理流程:快速二值化(区域)->获取区域边缘->截取边缘->膨胀边缘区域(定位)->定位区域进行边缘检测->边缘分割:线和圆->选择属性为圆的弧->拟合圆 * ...

  10. 一步步调试解决iOS内存泄漏

      虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在.所以了解原理很重要. 这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄 ...