SpringMvc接收数组的三种方式
1. 第一种方式
页面正常通过Key-Value的形式传值,数组保持原格式,后端使用@RequestParam
注解标注接值的入参,注意@RequestParam
里的value
一定要带上中括号:
controller:
@RequestMapping("/test.htm")
@ResponseBody
public AjaxResp test(@RequestParam("dataList[]") List<String> dataList, String name){
//do something
}
页面js:
var dataList = [1,2,3];
$.get({
url: "/test.htm",
data: {dataList: dataList,name:'jack'},
success: function (data) {
//do something
}
});
报文:
dataList[]: 1
dataList[]: 2
dataList[]: 3
name: jack
这种方式的好处是简单,方便。get
请求和post
请求都可以传值,并且后台接值的参数类型可以是List
集合也可以用String[]
数组。不过这种方式可能报文看起来比较奇怪。
2. 第二种方式
页面正常通过Key-Value的形式传值,数组使用逗号分割的形式的字符串(可以使用toString()
或join()
将数组转成这种格式),后端使用String[]
数组接值。
页面js:
var dataList = "1,2,3";
$.get({
url: "/test.htm",
data: {dataList: dataList,name:'jack'},
success: function (data) {
//do something
}
});
controller:
@RequestMapping("/test.htm")
@ResponseBody
public AjaxResp test(String[] dataList, String name){
//do something
}
报文:
dataList: 1,2,3
name: jack
注意这种方式后端接口得用String[]
数组来接,如果你直接用List
集合会抛下面这个异常:
Could not instantiate bean class [java.util.List]: Specified class is an interface
加上@RequestParam
注解并且设置value
之后就可以用List
集合类型了:
@RequestMapping("/test.htm")
@ResponseBody
public AjaxResp test(@RequestParam("dataList") List<String> dataList, String name){
//do something
}
这种方式同样支持get
和post
请求,并且报文也没那么奇怪,推荐使用。
3. 第三种方式
前台使用json
来传值,后台使用一个数据对象来接值:
public class Dto {
private List<String> dataList;
private String name;
//getters and setters
}
controller,记得加上@RequestBody
,spring
才能帮我们解析json
对象:
@RequestMapping(value = "/test.htm", method = RequestMethod.POST)
@ResponseBody
public AjaxResp test(@RequestBody Dto dto){
//do something
}
页面js:
var payload = {};
payload.dataList = ["1","2","3"];
payload.name="jack";
$.post({
url: "test.htm",
contentType:"application/json",
data: JSON.stringify(payload),
success: function (data) {
//do something
}
});
报文:
{"dataList":["1","2","3"],"name":"jack"}
这种方式比较适合用post
请求传输多个复杂字段时候使用。记得发送请求的时候设置contentType:"application/json"
,表示给的是json
格式的数据。