springMVC傳遞list對(duì)象的三種使用方式
前言
springMVC接收List對(duì)象以及List對(duì)象與其它對(duì)象一起傳參數(shù)的使用方法
概念
ajax請(qǐng)求里Content-type2個(gè)常用類型
application/x-www-form-urlencoded
:傳遞的key/value
會(huì)經(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ù)的值"曹"因?yàn)閁RL轉(zhuǎn)碼變成其他的字符串了
-application/json
:application/json用來告訴服務(wù)端消息主體是序列化后的 JSON 字符串,重點(diǎn)是使用JSON.stringify(data)將json對(duì)象轉(zhuǎn)化是json字符串。
JSON對(duì)象和JSON字符串
在使用@RequestBody
注解時(shí),在SpringMVC環(huán)境中,@RequestBody
接收的是一個(gè)Json對(duì)象的字符串,而不是一個(gè)Json對(duì)象。
然而在ajax請(qǐng)求往往傳的都是Json對(duì)象,用 JSON.stringify(data)
的方式就能將對(duì)象變成字符串。
同時(shí)ajax請(qǐng)求的時(shí)候也要指定dataType: "json",contentType:"application/json"
這樣就可以輕易的將一個(gè)對(duì)象或者List傳到Java端。
@RequestBody與contentType:"application/json"必需配合使用,且數(shù)據(jù)是字符串。
dataType與contentType
contentType
:指定向后臺(tái)傳遞數(shù)據(jù)編碼格式dataType
:指定后臺(tái)返回?cái)?shù)據(jù)格式
對(duì)象復(fù)雜度
傳單個(gè)key-value,或基本類型的數(shù)組最簡單,稍微復(fù)雜一點(diǎn)的是傳對(duì)象數(shù)組([object]
),最復(fù)雜的是對(duì)象數(shù)組與key-value一起傳到后臺(tái)
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", // 指定這個(gè)協(xié)議很重要 data:faultList, //只有這一個(gè)參數(shù),json格式,后臺(tái)解析為實(shí)體,后臺(tái)可以直接用 success:function(data){ } }); })
或者更簡單的寫法
<mvc:annotation-driven/>
最簡單:單個(gè)數(shù)組對(duì)象和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", // 指定這個(gè)協(xié)議很重要 data:faultList, //只有這一個(gè)參數(shù),json格式,后臺(tái)解析為實(shí)體,后臺(tái)可以直接用 success:function(data){ } }); })
重點(diǎn)
contentType:"application/x-www-form-urlencoded"
,一般使用這個(gè)當(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) ; }
重點(diǎn)
Integer[] nameIds
:接收數(shù)組
稍微復(fù)雜:只接收對(duì)象數(shù)組
下面要使用到的pojo類
//POJO對(duì)象傳輸對(duì)象 RepairFaultList.java public class RepairFaultList{ private Integer id; private String faultName;//故障名稱 private String employeeGroup;//所屬工組 //getter setter }
下面還會(huì)使用RepairFaultList.java
,需要傳遞的結(jié)構(gòu)體。
前端
$("#test").click(function(){ //對(duì)象數(shù)組 var faultList=[]; var data1={id:1,"faultName":"機(jī)電有問題","employeeGroup":"機(jī)電"}; var data2={id:2,"faultName":"鈑金有問題","employeeGroup":"鈑金"}; faultList.push(data1); faultList.push(data2); $.ajax({ type:"POST", url: basePath + "/test/testInOut", dataType:"json", contentType:"application/json", // 指定這個(gè)協(xié)議很重要 data:JSON.stringify(faultList), //只有這一個(gè)參數(shù),json格式,后臺(tái)解析為實(shí)體,后臺(tái)可以直接用 success:function(data){ } }); })
重點(diǎn)
contentType:"application/json"
JSON.stringify(faultList)
這里傳入的是一個(gè)數(shù)組,直接使用JSON.stringify(faultList)
序列化數(shù)據(jù),不是{"faultList":faultList}
,相應(yīng)的后端接收數(shù)據(jù)的地方也只有一個(gè)參數(shù)。
后端
//controller層 @RequestMapping(value = "/test/testInOut", method = {RequestMethod.POST }) @ResponseBody public void testInOut( @RequestBody List<RepairFaultList> faultList ){ //此時(shí)的faultList是map數(shù)據(jù),并沒有解析為bean // 不建議使用 System.out.println(users) ; } //使用如下方法,可以使用bean @RequestMapping(value = "/test/testInOut", method = RequestMethod.POST) @ResponseBody public void testInOut( @RequestBody RepairFaultList[] faultList ){ // 此時(shí)的faultList是實(shí)體bean System.out.println(users.getName()) ; }
重點(diǎn)
RepairFaultList[]或List<RepairFaultList>
method=RequestMethod.POST
,指定post請(qǐng)求方式@RequestBody
注意faultList是隨機(jī)命名,沒要求。
還有種不需要POJO對(duì)象的寫法,比較另類,代碼如下
//前端同上 //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格式的鍵值對(duì),需要對(duì)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ù)雜:對(duì)象數(shù)組與key-value一起傳
使用@RequestBody與json
一起操作,上面說過,application/json
用來告訴服務(wù)端消息主體是序列化后的 JSON 字符串。
前端
前端請(qǐng)求
//基本數(shù)據(jù)類型數(shù)組對(duì)象 var operatorIds = [1,2,3]; //對(duì)象數(shù)組 var faultList=[]; var data1={id:1,"faultName":"機(jī)電有問題","employeeGroup":"機(jī)電"}; 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), //只有這一個(gè)參數(shù),json格式,后臺(tái)解析為實(shí)體,后臺(tái)可以直接用 success:function(data){ } }); })
重點(diǎn)
contentType: application/json
,指定數(shù)據(jù)編碼格式JSON.stringify(testData)
序列化數(shù)據(jù),字符串
后臺(tái)
//POJO對(duì)象 創(chuàng)建一個(gè)對(duì)象由于存放key-value和對(duì)象數(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"; } }
這樣就可以接收對(duì)象數(shù)組和key-value混合的數(shù)據(jù)。
重點(diǎn)
- 創(chuàng)建AppointPrePersonRo
類,由于保存接收的數(shù)據(jù)對(duì)象
- @RequestBody
注解,必需與application/json
配合使用
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring boot + LayIM + t-io 實(shí)現(xiàn)文件上傳、 監(jiān)聽用戶狀態(tài)的實(shí)例代碼
這篇文章主要介紹了Spring boot + LayIM + t-io 實(shí)現(xiàn)文件上傳、 監(jiān)聽用戶狀態(tài)的實(shí)例代碼,需要的朋友可以參考下2017-12-12Spring MVC Controller傳遞枚舉值的實(shí)例
這篇文章主要介紹了Spring MVC Controller傳遞枚舉值的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09實(shí)例解析使用Java實(shí)現(xiàn)基本的音頻播放器的編寫要點(diǎn)
這篇文章主要介紹了使用Java實(shí)現(xiàn)基本的音頻播放器的代碼要點(diǎn)實(shí)例分享,包括音頻文件的循環(huán)播放等功能實(shí)現(xiàn)的關(guān)鍵點(diǎn),需要的朋友可以參考下2016-01-01詳解 Corba開發(fā)之Java實(shí)現(xiàn)Service與Client
這篇文章主要介紹了詳解 Corba開發(fā)之Java實(shí)現(xiàn)Service與Client的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10Java語言基于無向有權(quán)圖實(shí)現(xiàn)克魯斯卡爾算法代碼示例
這篇文章主要介紹了Java語言基于無向有權(quán)圖實(shí)現(xiàn)克魯斯卡爾算法代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11java實(shí)現(xiàn)哈夫曼壓縮的實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)哈夫曼壓縮的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-07-07