表单多行实体数据提交,重复的参数名,测试各种情况看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为空

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