天天看点

springMVC4(12)复杂对象和集合类型入参绑定1. 复杂对象参数绑定2. 数组参数绑定集合类型参数绑定

对于普通的对象参数绑定,我们只需要对象成员变量名与请求参数名一一对应即可完成绑定。

而求对于组合对象,我们可以使用级联的方式来绑定方法参数。见下面实例:

我们先定义两个pojo类:user,article其中atricle是user的成员属性:

下面是我们的测试前端表单:

下面是我们的控制层方法:

我们在前端表单输入参数如下所示:

springMVC4(12)复杂对象和集合类型入参绑定1. 复杂对象参数绑定2. 数组参数绑定集合类型参数绑定

点击提交后,页面输出:

springMVC4(12)复杂对象和集合类型入参绑定1. 复杂对象参数绑定2. 数组参数绑定集合类型参数绑定

或者我们也可直接通过访问如下链接得到相同结果:

<a href="http://localhost:8080/springmvc/saveuser?username=username&amp;password=password&amp;article.title=title&amp;article.content=content">http://localhost:8080/springmvc/saveuser?username=username&amp;password=password&amp;article.title=title&amp;article.content=content</a>

从上可知,对于user的成员属性article,如果我们绑定其对应的参数,可以通过级联article.title,article.content来完成。 在这里,如果我在控制器的方法入参中,同时定义多个user,或者有多个不同的类实例对象。只要它们的成员属性名和参数名相同,都会完成绑定

数组参数分为普通类型数组和复杂对象数组两种,但由于没有复杂对象数组的构造方法,springmvc只能绑定普通类型数组。

普通类型数组是指integer、stirng、long等基本数据类型的包装类,下面通过实例来看如何完成绑定工作:

控制器方法:

前端表单定义:

提交如下数据:

springMVC4(12)复杂对象和集合类型入参绑定1. 复杂对象参数绑定2. 数组参数绑定集合类型参数绑定

此时游览器输出:

springMVC4(12)复杂对象和集合类型入参绑定1. 复杂对象参数绑定2. 数组参数绑定集合类型参数绑定

对于list、set、map等的参数绑定,如果我们尝试直接绑定,是会失败的,必须将其作为一个具体类对象的成员属性,这个时候我们也可称这个具体类对象为一个包装类。先看下面失败实例:

我们的请求url和输出结果如下图所示:

springMVC4(12)复杂对象和集合类型入参绑定1. 复杂对象参数绑定2. 数组参数绑定集合类型参数绑定

它的输出结果为空json数组,说明我们的绑定失败了。

这里遇到的一个主要问题是,如果我们绑定set类型参数时,必须先为set添加预定大小的容器,否则会报错。而且也不支持基本数据类型包装类的set绑定,**如果需要完成这一转换,需要我们自定义转换器来实现。 下面我们通过一个完整的综合例子来展示集合类型的参数绑定:

我们的控制层方法极为简单:

我们输入如下图所示的参数:

springMVC4(12)复杂对象和集合类型入参绑定1. 复杂对象参数绑定2. 数组参数绑定集合类型参数绑定

点击提交按钮,获得输出数据:

springMVC4(12)复杂对象和集合类型入参绑定1. 复杂对象参数绑定2. 数组参数绑定集合类型参数绑定

或者我们也可以通过游览器地址访问:

<a href="http://localhost:8080/springmvc/getall?username=username1&amp;password=password1&amp;numlist%5b0%5d=11&amp;numlist%5b1%5d=22&amp;articlelist%5b0%5d.title=title1&amp;articlelist%5b0%5d.content=content1&amp;articlelist%5b1%5d.title=title2&amp;articlelist%5b1%5d.content=content2&amp;articleset%5b0%5d.title=title3&amp;articleset%5b0%5d.content=cotent3&amp;articleset%5b1%5d.title=title4&amp;articleset%5b1%5d.content=cotent4&amp;nummap%5b%27num1%27%5d=55&amp;nummap%5b%27num2%27%5d=66&amp;articlemap%5b%27article1%27%5d.title=title5&amp;articlemap%5b%27article1%27%5d.content=content5&amp;articlemap%5b%27article2%27%5d.title=title6&amp;articlemap%5b%27article2%27%5d.content=content6">http://localhost:8080/springmvc/getall?username=username1&amp;password=password1&amp;numlist[0]=11&amp;numlist[1]=22&amp;articlelist[0].title=title1&amp;articlelist[0].content=content1&amp;articlelist[1].title=title2&amp;articlelist[1].content=content2&amp;articleset[0].title=title3&amp;articleset[0].content=cotent3&amp;articleset[1].title=title4&amp;articleset[1].content=cotent4&amp;nummap[%27num1%27]=55&amp;nummap[%27num2%27]=66&amp;articlemap[%27article1%27].title=title5&amp;articlemap[%27article1%27].content=content5&amp;articlemap[%27article2%27].title=title6&amp;articlemap[%27article2%27].content=content6</a>

从上面我们可以看到,使用绑定list和set入参都是以成员属性名[索引](.级联成员属性名)的形式完成绑定,使用map的话则以成员属性名[键名](.级联成员属性名)的形式完成绑定