JSON對象和JSON字符串
在SpringMVC環境中,@RequestBody接收的是一個Json對象的字符串,而不是一個Json對象。然而在ajax請求往往傳的都是Json對象,用 JSON.stringify(data)的方式就能將對象變成字符串。
同時ajax請求的時候也要指定dataType: "json",contentType:"application/json" 這樣就可以輕易的將一個對象或者List傳到Java端!
Content-Type
服務器為什么會對表單提交和文件上傳做特殊處理,因為表單提交數據是名值對的方式,且Content-Type為application/x-www-form-urlencoded,而文件上傳服務器需要特殊處理,
普通的post請求(Content-Type不是application/x-www-form-urlencoded)數據格式不固定,不一定是名值對的方式,所以服務器無法知道具體的處理方式,所以只能通過獲取原始數據流的方式來進行解析。
jquery在執行post請求時,會設置Content-Type為application/x-www-form-urlencoded,所以服務器能夠正確解析,而使用原生ajax請求時,如果不顯示的設置Content-Type,那么默認是text/plain,這時服務器就不知道怎么解析數據了,所以才只能通過獲取原始數據流的方式來進行解析請求數據。
一、傳數組
var list=[]; list.push('132'); list.push('132'); $.ajax({ url:'stopUsePrice.do?isdebug=true', type:'POST', contentType:"application/json", data:JSON.stringify(list), dataType:'json', success:function(data){ } })
二、對象集合
var model; model={"Id":"555","AuditId":"666"}; var saveDataAry=[]; saveDataAry.push(model); $.ajax({ url:'stopUsePrice.do?isdebug=true', type:'POST', contentType:"application/json", data:JSON.stringify(saveDataAry), dataType:'json', success:function(data){ } })
public class FomfSupperPriceMethodAdModel implements IModel { /** 版本號 */ private static final long serialVersionUID = 1L; /** 主鍵ID */ @JsonProperty("Id") private String id; /** 報價主表ID */ @JsonProperty("AuditId") private String auditId; }
也可以用鍵值對來接收
三、組合參數
var model;
model={"Id":"555","AuditId":"666"};
var saveDataAry=[];
saveDataAry.push(model);
saveDataAry.push(model);
$.ajax({
url:'stopUsePrice.do?isdebug=true',
type:'POST',
contentType:"application/x-www-form-urlencoded; charset=UTF-8",
//這里不是application/json,可以不寫
data:{aa:JSON.stringify(saveDataAry),bb:"bb"},
// 可以傳遞多個參數,但此時的users內容與另外一個參數:aa 的內容一起傳遞,所以后台解析為字符串
// 后台接收的aa內容:[{"Id":"555","AuditId":"666"},{"Id":"555","AuditId":"666"}]
// 后台接收的bb內容:"bb"
//data:JSON.stringify(saveDataAry),
dataType:'json',
success:function(data){
}
})
組合參數優化
var delayDate = $("#delay_date").val(); var delayDateDis=new Date(Date.parse(delayDate.replace(/-/g,"/"))); var ids=[]; ids.push("cee1c898d3384800acee6b5fdd1bad31"); ids.push("cee1c898d3384800acee6b5fdd1bad32"); layer.confirm('是否確定延長報價名稱為【'+ names +'】的報價至 : <br><br>'+delayDate, { btn: ['確定', '取消'] }, function(index, layero){ $.ajax({ url:'delayTime.do?isdebug=true', type:'POST', //contentType:"application/x-www-form-urlencoded; charset=UTF-8", data:{Ids:JSON.stringify(ids),delayDate:delayDateDis}, dataType:'json', success:function(data){ layer.close(index); if(data.StatusCode == 'success'){ alert(data.Data); select_q(); } } }) }, function(index){ layer.close(index); });