0. 总结
先把总结写在前面。
下面提到的情况都是: 表单提交而不是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;
}
1. 什么是表单提交多行数据,重复的参数名
如:
<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来模拟表单提交.
2. 其中的一部分测试过程
我对各种情况分别进行了测试,比如:
2.1 Controller普通参数(String或基本类型),数组接收
@PostMapping("/test1")
public String testParamList( String[] outArray){
log.info("outArray: {}", Arrays.toString(outArray));
return "ok";
}
2.1.1 提交重复的参数名
postman请求参数:
后台成功接收.
2.1.1 提交参数名带下标
试试参数名带下标区分
结果没报错,但是接收到的参数为null
2.2 Controller普通参数(String或基本类型),List接收
@PostMapping("/test2")
public String testParamList( List<String> outList){
log.info("outList: {}", JSON.toJSONString(outList));
return "ok";
}
2.2.1 提交重复的参数名
报错
2.2.2 提交重复的参数名
同样报错
2.2.3 分析
从错误信息可以看出, spring框架在绑定参数到Controller的形参的时候,会调用形参的构造方法, 而List接口是不能被实例化的.
将List改为ArrayList,虽然不报错了,但是接收不到参数值,ArrayList为空