springMVC传递list对象三种情况使⽤⽅法
前⾔
springMVC接收List对象以及List对象与其它对象⼀起传参数的使⽤⽅法
概念
1.ajax请求⾥Content-type2个常⽤类型
application/x-www-form-urlencoded:传递的key/value会经过URL转码,所以如果传递的参数存在中⽂或者特殊字符需要注意。
默认编码⽅式。
//例⼦
//b=曹,a=1
POST HTTP/1.1(CRLF)
Host: ample(CRLF)
Content-Type: application/x-www-form-urlencoded(CRLF)
Cache-Control: no-cache(CRLF)
(CRLF)
b=%E6%9B%B9&a=1(CRLF)
//这⾥b参数的值"曹"因为URL转码变成其他的字符串了
-application/json:application/json⽤来告诉服务端消息主体是序列化后的 JSON 字符串,重点是使⽤JSON.stringify(data)将json对象转化是json字符串。
JSON对象和JSON字符串
在使⽤@RequestBody注解时,在SpringMVC环境中,@RequestBody接收的是⼀个Json对象的字符串,⽽不是⼀个Json对象。然⽽在ajax请求往往传的都是Json对象,⽤ JSON.stringify(data)的⽅式就能将对象变成字符串。同时ajax请求的时候也要指定dataType: "json",contentType:"application/json" 这样就可以轻易的将⼀个对象或者List传到Java端。
@RequestBody与contentType:"application/json"必需配合使⽤,且数据是字符串。
dataType与contentType
contentType:指定向后台传递数据编码格式
dataType:指定后台返回数据格式
对象复杂度
传单个key-value,或基本类型的数组最简单,稍微复杂⼀点的是传对象数组([object]),最复杂的是对象数组与key-value⼀起传到后台
bean class="org.springframework.web.hod.annotation.RequestMappingHandlerMapping"></bean>
<bean class="org.springframework.web.hod.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<bean class="org.verter.json.MappingJackson2HttpMessageConverter"></bean>
</property>
</bean>
或者更简单的写法
<mvc:annotation-driven/>
最简单:单个数组对象和key-value就⽐较简单了
前端
$("#test").click(function(){
var testData={"nameIds": [1,2,3], "age": 18}
$.ajax({
type:"POST",
url: basePath + "/test/testInOut",
dataType:"json",
contentType:"application/x-www-form-urlencoded", // 指定这个协议很重要
data:faultList, //只有这⼀个参数,json格式,后台解析为实体,后台可以直接⽤
success:function(data){
}
});
})
重点
contentType:"application/x-www-form-urlencoded",⼀般使⽤这个当然我们也可以使⽤application/json(它需要序列化json数据)后端
//controller层
@RequestMapping(value = "/test/testInOut")
@ResponseBody
public void testInOut(Integer[] nameIds, Integer age){
System.out.println(nameIds, age) ;
}
重点
Integer[] nameIds:接收数组
稍微复杂:只接收对象数组
下⾯要使⽤到的pojo类
//POJO对象传输对象 RepairFaultList.java
public class RepairFaultList{
private Integer id;
private String faultName;//故障名称
private String employeeGroup;//所属⼯组
//getter setter
}
下⾯还会使⽤RepairFaultList.java,需要传递的结构体。
前端
$("#test").click(function(){
//对象数组
var faultList=[];
var data1={id:1,"faultName":"机电有问题","employeeGroup":"机电"};
var data2={id:2,"faultName":"钣⾦有问题","employeeGroup":"钣⾦"};
faultList.push(data1);
faultList.push(data2);
$.ajax({
type:"POST",
url: basePath + "/test/testInOut",
dataType:"json",
contentType:"application/json", // 指定这个协议很重要
data:JSON.stringify(faultList), //只有这⼀个参数,json格式,后台解析为实体,后台可以直接⽤
success:function(data){
json转换对象}
});
})
重点
contentType:"application/json"
JSON.stringify(faultList)
这⾥传⼊的是⼀个数组,直接使⽤JSON.stringify(faultList)序列化数据,不是{"faultList":faultList},相应的后端接收数据的地⽅也只有⼀个参数。
后端
//controller层
@RequestMapping(value = "/test/testInOut", method = {RequestMethod.POST })
@ResponseBody
public void testInOut( @RequestBody List<RepairFaultList> faultList ){
//此时的faultList是map数据,并没有解析为bean // 不建议使⽤
System.out.println(users) ;
}
//使⽤如下⽅法,可以使⽤bean
@RequestMapping(value = "/test/testInOut", method = RequestMethod.POST)
@ResponseBody
public void testInOut( @RequestBody RepairFaultList[] faultList ){
// 此时的faultList是实体bean
System.out.Name()) ;
}
重点
RepairFaultList[]或List<RepairFaultList>
method=RequestMethod.POST,指定post请求⽅式
@RequestBody
注意faultList是随机命名,没要求。
还有种不需要POJO对象的写法,⽐较另类,代码如下
//前端同上
//controller层
@RequestMapping(value = "/test/testInOut", method = RequestMethod.POST)
@ResponseBody
public void testInOut( @RequestBody List<Map<String,String>> faultList ){ // spring MVC只能解析外层的json格式,内部的bean转化为Map格式的键值对,需 List<RepairFaultList> result = new ArrayList<RepairFaultList>();
for(Map<String,String> map : faultList){
RepairFaultList u = new RepairFaultList();
//⼀系列get set数据
}
// 这⾥就可以使⽤ result 了
}
最复杂:对象数组与key-value⼀起传
使⽤@RequestBody与json⼀起操作,上⾯说过,application/json⽤来告诉服务端消息主体是序列化后的 JSON 字符串。
前端
前端请求
//基本数据类型数组对象
var operatorIds = [1,2,3];
//对象数组
var faultList=[];
var data1={id:1,"faultName":"机电有问题","employeeGroup":"机电"};
var data2={id:2,"faultName":"钣⾦有问题","employeeGroup":"钣⾦"};
faultList.push(data1);
faultList.push(data2);
var testData={operatorIds:operatorIds,repairBillId: 110,faultList: faultList};
$.ajax({
type:"POST",
url: basePath + "/test/testInOut",
dataType:"json",
contentType: application/json,
data:JSON.stringify(testData), //只有这⼀个参数,json格式,后台解析为实体,后台可以直接⽤
success:function(data){
}
});
})
重点
contentType: application/json,指定数据编码格式
JSON.stringify(testData)序列化数据,字符串
后台
/
/POJO对象创建⼀个对象由于存放key-value和对象数组 AppointPrePersonRo.java
public class AppointPrePersonRo {
private Integer[] operatorIds;
private List<RepairFaultList> faultList;
private Integer repairBillId;
//getter setter
}
//controller层
@RequestMapping(value = "/test/testInOut")
@ResponseBody
public String testInOut(@RequestBody AppointPrePersonRo appointPrePersonRo) { return"sucess";
}
}
这样就可以接收对象数组和key-value混合的数据。
重点
- 创建AppointPrePersonRo类,由于保存接收的数据对象
- @RequestBody注解,必需与application/json配合使⽤
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论