springMVC傳遞list對象的三種使用方式
前言
springMVC接收List對象以及List對象與其它對象一起傳參數(shù)的使用方法
概念
ajax請求里Content-type2個常用類型
application/x-www-form-urlencoded:傳遞的key/value會經(jīng)過URL轉(zhuǎn)碼,所以如果傳遞的參數(shù)存在中文或者特殊字符需要注意。
默認(rèn)編碼方式。
//例子 //b=曹,a=1 POST HTTP/1.1(CRLF) Host: www.example.com(CRLF) Content-Type: application/x-www-form-urlencoded(CRLF) Cache-Control: no-cache(CRLF) (CRLF) b=%E6%9B%B9&a=1(CRLF) //這里b參數(shù)的值"曹"因為URL轉(zhuǎn)碼變成其他的字符串了
-application/json:application/json用來告訴服務(wù)端消息主體是序列化后的 JSON 字符串,重點是使用JSON.stringify(data)將json對象轉(zhuǎn)化是json字符串。
JSON對象和JSON字符串
在使用@RequestBody注解時,在SpringMVC環(huán)境中,@RequestBody接收的是一個Json對象的字符串,而不是一個Json對象。
然而在ajax請求往往傳的都是Json對象,用 JSON.stringify(data)的方式就能將對象變成字符串。
同時ajax請求的時候也要指定dataType: "json",contentType:"application/json" 這樣就可以輕易的將一個對象或者List傳到Java端。
@RequestBody與contentType:"application/json"必需配合使用,且數(shù)據(jù)是字符串。
dataType與contentType
contentType:指定向后臺傳遞數(shù)據(jù)編碼格式dataType:指定后臺返回數(shù)據(jù)格式
對象復(fù)雜度
傳單個key-value,或基本類型的數(shù)組最簡單,稍微復(fù)雜一點的是傳對象數(shù)組([object]),最復(fù)雜的是對象數(shù)組與key-value一起傳到后臺
dispatchServlet-mvc.xml配置
$("#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", // 指定這個協(xié)議很重要
data:faultList, //只有這一個參數(shù),json格式,后臺解析為實體,后臺可以直接用
success:function(data){
}
});
})或者更簡單的寫法
<mvc:annotation-driven/>
最簡單:單個數(shù)組對象和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", // 指定這個協(xié)議很重要
data:faultList, //只有這一個參數(shù),json格式,后臺解析為實體,后臺可以直接用
success:function(data){
}
});
})重點
contentType:"application/x-www-form-urlencoded",一般使用這個當(dāng)然我們也可以使用application/json(它需要序列化json數(shù)據(jù))
后端
//controller層
@RequestMapping(value = "/test/testInOut")
@ResponseBody
public void testInOut(Integer[] nameIds, Integer age){
System.out.println(nameIds, age) ;
}重點
Integer[] nameIds:接收數(shù)組
稍微復(fù)雜:只接收對象數(shù)組
下面要使用到的pojo類
//POJO對象傳輸對象 RepairFaultList.java
public class RepairFaultList{
private Integer id;
private String faultName;//故障名稱
private String employeeGroup;//所屬工組
//getter setter
}下面還會使用RepairFaultList.java,需要傳遞的結(jié)構(gòu)體。
前端
$("#test").click(function(){
//對象數(shù)組
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", // 指定這個協(xié)議很重要
data:JSON.stringify(faultList), //只有這一個參數(shù),json格式,后臺解析為實體,后臺可以直接用
success:function(data){
}
});
})重點
contentType:"application/json"JSON.stringify(faultList)
這里傳入的是一個數(shù)組,直接使用JSON.stringify(faultList)序列化數(shù)據(jù),不是{"faultList":faultList},相應(yīng)的后端接收數(shù)據(jù)的地方也只有一個參數(shù)。
后端
//controller層
@RequestMapping(value = "/test/testInOut", method = {RequestMethod.POST })
@ResponseBody
public void testInOut( @RequestBody List<RepairFaultList> faultList ){
//此時的faultList是map數(shù)據(jù),并沒有解析為bean // 不建議使用
System.out.println(users) ;
}
//使用如下方法,可以使用bean
@RequestMapping(value = "/test/testInOut", method = RequestMethod.POST)
@ResponseBody
public void testInOut( @RequestBody RepairFaultList[] faultList ){
// 此時的faultList是實體bean
System.out.println(users.getName()) ;
}重點
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格式,內(nèi)部的bean轉(zhuǎn)化為Map格式的鍵值對,需要對map解析
List<RepairFaultList> result = new ArrayList<RepairFaultList>();
for(Map<String,String> map : faultList){
RepairFaultList u = new RepairFaultList();
//一系列g(shù)et set數(shù)據(jù)
}
// 這里就可以使用 result 了
}最復(fù)雜:對象數(shù)組與key-value一起傳
使用@RequestBody與json一起操作,上面說過,application/json用來告訴服務(wù)端消息主體是序列化后的 JSON 字符串。
前端
前端請求
//基本數(shù)據(jù)類型數(shù)組對象
var operatorIds = [1,2,3];
//對象數(shù)組
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), //只有這一個參數(shù),json格式,后臺解析為實體,后臺可以直接用
success:function(data){
}
});
})重點
contentType: application/json,指定數(shù)據(jù)編碼格式JSON.stringify(testData)序列化數(shù)據(jù),字符串
后臺
//POJO對象 創(chuàng)建一個對象由于存放key-value和對象數(shù)組 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";
}
}這樣就可以接收對象數(shù)組和key-value混合的數(shù)據(jù)。
重點
- 創(chuàng)建AppointPrePersonRo類,由于保存接收的數(shù)據(jù)對象
- @RequestBody注解,必需與application/json配合使用
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?Boot2.6.0新特性之默認(rèn)禁止循環(huán)引用
Spring?Boot2.6.0為我們帶來很多好用的新特性/改進(jìn),這篇文章主要給大家介紹了關(guān)于Spring?Boot2.6.0新特性之默認(rèn)禁止循環(huán)引用的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
Java語言實現(xiàn)簡單FTP軟件 FTP上傳下載隊列窗口實現(xiàn)(7)
這篇文章主要為大家詳細(xì)介紹了Java語言實現(xiàn)簡單FTP軟件,F(xiàn)TP上傳下載隊列窗口的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
Value注解支持對象類型ConfigurationProperties功能
這篇文章主要為大家介紹了Value注解支持對象類型ConfigurationProperties功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10

