一个坑,如果前端传过来的元素的索引是跳跃的,如user[0],user[20],后台会生成一个size=21的集合List
如果传入的是List,那么一定要用对象把这个list封装起来才能传入,直接
list(List<User> userlist)这样写是传不过来的
本章主要介绍List、Set、Map结构的数据绑定以及坑
知识点1:List的数据绑定
案例:后台抽象一个Student对象,有一个name属性和一个Email属性,提交信息时候,需要把学生1和学生2的name和Email同时绑定到后台,List就应用到这种场景,SpringMVC对于集合绑定,需要专门创建一个类提供一个集合,并且集合的泛型为User,如图二,也就是Controller的方法里使用提供集合的类作为参数,如图3,这里访问的是下一级,也就是使用提供集合类的属性users传入参数,list.do?users[0].name=Tom&users[1].name=Lucy,如果url中下标直接写20,则这个数组的长度为21,也就是数组中有很多空对象,请求的索引一定是连续的,否则浪费内存资源,如最后一张图。
老师的方式,请求参数为item[n]:name=xx&item[m]:name=xxx,也可以传递json字符串
一、封装list的类
import lombok.Data; import java.util.List; @Data public class FromAdminList { List<Admin> admins; }
二、使用封装了list的类接受
/** * [ { "username": "John", "password": "Doe", "age":"11" }, { "username": "Anna", "password": "Smith", "age":"11" }, { "username": "Peter", "password": "Jones", "age":"11" } ] * @param admins */ @PostMapping("admins") public void listTypeObj(FromAdminList admins){ System.out.println(admins); }
另一种方式,使用@RequestBody,请求参数为json字符串格式,前提是有json的转换器
一、向list类型参数加上注解@RequestBody
/** [ { "username": "John", "password": "Doe", "age":"11" }, { "username": "Anna", "password": "Smith", "age":"11" }, { "username": "Peter", "password": "Jones", "age":"11" } ] * @param admins */ @PostMapping("adminlist") public void listTypeObj(@RequestBody List<Admin> admins){ System.out.println(admins); }
对于基本类型,string都有效
/** * [ "adb", "xixi", "多久啊送到家" ] * @param info */ @PostMapping("strs") public void listTypeStr(@RequestBody List<String> info){ System.out.println(info); } /** [ 1, 2, 3 ] * @param info */ @PostMapping("Ints") public void listTypeBase(@RequestBody List<Integer> info){ }
Controll中List参数不能直接传值,需要一个包裹类,类中有需要传的List作为属性和对应的get,set方法。 传值时用users[0].name = Tom users[1].name = Luce 一定不要跳跃传值,如users[0].name = Tom&users[20].name = Lucy 这样中间的1~19也会占用资源属性值为空。
list暂时没有看明白 ,先做个记号
List类型的传参,使用某个类进行封装,以xxx.xxList[x]类似方式进行数据绑定,注意索引按顺序分别填写参数,否则容易创建空值的对象到List中。
list数据绑定示例