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

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

SpringMVC的各种参数绑定方式的更多相关文章

  1. [Spring MVC] - SpringMVC的各种参数绑定方式

    SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似):Controller代码: @RequestMapping("saysth.do") publi ...

  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. 如何从oc中去获取一个私有的变量.....

    运行时 的用法 1.定义的一个类,里面有一个私有变量mt_,并且在初始化值为"HaHa Ha ".@interface Mobj : NSObject {@privateNSStr ...

  2. 【转】为什么我要用 Node.js? 案例逐一介绍

    原文转自:http://blog.jobbole.com/53736/ 介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样, ...

  3. wcf之OperationContextScope

    作用:使用消息头向服务发送额外的信息. 1.客户端代码如下: namespace Client { class Program { static void Main(string[] args) { ...

  4. Windows统一平台: 开发小技巧

    Windows统一平台: 开发小技巧 技巧一: 在手机端拓展你应用的显示区域.(WP8.1中也适用) 对于Windows Phone系统的手机, 手机屏幕最上方为系统状态栏(System Tray), ...

  5. 作业6 分析项目的NABCD和项目的产品Backlog

    项目scrum:邵家文 NABCD模型分析 N(Need 需求)根据采访用户下面可以得出用户的基本需求:1.小孩说:我想要做适合自己能力的四则运算2.小孩说:我想这个四则运算软件里面的题目越做越提高自 ...

  6. 转:SSL协议详解

    http://kb.cnblogs.com/page/162080/ 背景介绍    最近在看<密码学与网络安全>相关的书籍,这篇文章主要详细介绍一下著名的网络安全协议SSL. 在开始SS ...

  7. cookie 和 session 机制

    cookie机制 Cookie实际上是Web服务端与客户端(典型的是浏览器)交互时彼此传递的一部分内容,内容可以是任意的,但要在允许的长度范围之内.客户端会将它保存在本地机器上(如IE便会保存在本地的 ...

  8. SPAdes

    用后感: 拼个小基因组还好,对于很大的基因组,文库很多的,还是不要用了.服务器768G内存,都不够用.... 主页: http://bioinf.spbau.ru/spades 说明书: http:/ ...

  9. gpg --verify之"Can't check signature: No public key"

    自从XcodeGhost之后下载软件之后也会先验证一下md5sum,现在发现后面还有gpg签名,于是也开始学习一下. gpg的文件在centos6.4上是默认安装的,其安装使用可以参照ruanyife ...

  10. 小三角图标如何用CSS写

    上三角▲     1 width: 0; 2 height: 0; 3 line-height: 0; 4 font-size: 0; 5 border-width: 10px; 6 border-s ...