今天使用jquery的ajax意外的發現一個問題,若是ajax請求不指定ContentType的話,它默認的請求類型就是Content-Type: application/x-www-form-urlencoded; charset=UTF-8
,它和form表單的請求方式一致,後臺能夠經過java bean對象來直接映射java
$.post('/demo', {
username: '大哥哥',
}, function (res) {
console.log(res)
})
複製代碼
@RequestMapping("/demo")
@ResponseBody
public String demo(User user) {
System.out.println(user);
return "發噶嘎嘎";
}
複製代碼
輸出結果: jquery
若是User類的結構是這樣的: 能夠很清楚的看到,User類中有一個Classs類的引用,若是ajax請求須要將User對象的參數發送給後臺,並將classs屬性中的屬性也一併傳值給後臺,那麼像上面的寫法就不能知足當前業務邏輯的需求了。ContentType
這個屬性,這樣就不能使用 $.get()
或者$.post()
了,由於它們不能自定義請求參數,解決辦法:$.ajax({
url: '/demo',
method: 'post',
// 指定contentType和JSON.stringify()序列化數據是必需要作的,這很重要
contentType: 'application/json;charset=utf-8',
data: JSON.stringify({
username: '大哥哥',
// classs屬性是Class類在User類中的引用屬性
classs: {
// Class的屬性
classname: '32:10班'
}
}),
success: function (res) {
console.log(res)
}
})
複製代碼
後臺代碼:ajax
@RequestMapping("/demo")
@ResponseBody
// 加上@RequestBody這個參數後,參數欄就只能接收user這一個參數了,spring mvc會將前臺傳過來的全部數據都序列化成User對象,給裏面的屬性附好值
public String demo(@RequestBody User user, HttpServletRequest request) {
System.out.println(user);
System.out.println(request.getHeader("Content-Type"));
return "發噶嘎嘎";
}
複製代碼
輸出結果: spring
注:@RequestBody只能在請求爲json格式的時候才能使用json
須要設置contentType
爲json
格式、將傳遞數據用JSON.stringify()轉成字符串、Spring Mvc須要在參數前加@RequestBody的狀況:數組
傳遞數組的問題在個人上一篇博客中已經講到:數組問題解決mvc
除了以上狀況,就算是後臺須要映射多個對象的時候,也能夠用日常的方法解決
好比:username給User賦值,classname給Classs賦值app
$.post('/demo', {
username: '大哥哥',
classname: '32:10班'
}, function (res) {
console.log(res)
})
複製代碼
後臺代碼:post
@RequestMapping("/demo")
@ResponseBody
public String demo(User user, Classs classs, HttpServletRequest request) {
System.out.println(user);
System.out.println(classs);
System.out.println(request.getHeader("Content-Type"));
return "發噶嘎嘎";
}
複製代碼
輸出結果: ui