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爲空