表單多行實體數據提交,重複的參數名,測試各種情況看SpringMVC後臺能不能接收

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.nameusers[0].name

 @PostMapping("/test4")
  public String test4( User[] users){
    log.info("users: {}", JSON.toJSONString(users));
    return "ok";
  }
....

@Data
public class User {
  private String name;
}

外層普通如: 測試請求參數 outArrayoutArray[0]

  @PostMapping("/test1")
  public String test1( String[] outArray){
    log.info("outArray: {}", Arrays.toString(outArray));
    return "ok";
  }

裏層實體如: 測試請求參數 innerListObject.nameinnerListObject[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;
}

裏層普通如: 測試請求參數 innerListStringinnerListString[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爲空

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章