先把总结写在前面。 下面提到的情况都是: 表单提交而不是ajax提交,也就是 content-Type是 application/x-www-form-urlencoded 而不是json类型 , 模拟多个参数名一样, 多行实体提交的情况 1.后台接收,controller的形参不能是接口如List,无法被实例化。同时基本数据类型和String不能直接使用list或ArrayList接收,要用数组 2.各种情况下SpringMvc接收参数情况如下:(将String和基本类型统称为普通类型,其他实体dto成为实体类型) 3.那如果实在要在外层接收list或者数组实体呢? 使用@RequstBody 注解, 使用JSON类型提交表单
提交方式外层普通类型-数组外层普通类型-list外层普通类型-arraylist外层实体类型-数组外层实体类型-list外层实体类型-arraylist使用数组下标[i]null报错空报错报错null直接提交重复参数名是报错空报错报错null 提交方式里层普通类型-数组里层普通类型-list里层实体类型-数组里层实体类型-list使用数组下标[i]是是是是直接提交重复参数名是是空空外层实体如: 测试请求参数 users.name 或 users[0].name
@PostMapping("/test4") public String test4( User[] users){ log.info("users: {}", JSON.toJSONString(users)); return "ok"; } .... @Data public class User { private String name; }外层普通如: 测试请求参数 outArray 或 outArray[0]
@PostMapping("/test1") public String test1( String[] outArray){ log.info("outArray: {}", Arrays.toString(outArray)); return "ok"; }里层实体如: 测试请求参数 innerListObject.name或 innerListObject[0].name
@PostMapping("/test5") public String test5( UserDto userDto){ log.info("userDto: {}", JSON.toJSONString(userDto)); return "ok"; } .... /** * UserDto * * @author zgd * @date 2019/10/25 11:03 */ @Data public class UserDto { private List<User> innerListObject; private User[] innerArrayObject; } .... @Data public class User { private String name; }里层普通如: 测试请求参数 innerListString或 innerListString[0]
@PostMapping("/test5") public String test5( UserDto userDto){ log.info("userDto: {}", JSON.toJSONString(userDto)); return "ok"; } .... /** * UserDto * * @author zgd * @date 2019/10/25 11:03 */ @Data public class UserDto { private List<String> innerListString; private String[] innerArrayString; }如:
<tr> <td> <input type='text' name='username' > </td> <td> <input type='text' name='password' > </td> </tr> <tr> <td> <input type='text' name='username' > </td> <td> <input type='text' name='password' > </td> </tr>我这里使用postman来模拟表单提交.
我对各种情况分别进行了测试,比如:
postman请求参数: 后台成功接收.
试试参数名带下标区分 结果没报错,但是接收到的参数为null
报错
同样报错
从错误信息可以看出, spring框架在绑定参数到Controller的形参的时候,会调用形参的构造方法, 而List接口是不能被实例化的. 将List改为ArrayList,虽然不报错了,但是接收不到参数值,ArrayList为空