今天使用jquery的ajax意外的發現一個問題,如果ajax請求不指定ContentType的話,它預設的請求型別就是Content-Type: application/x-www-form-urlencoded; charset=UTF-8
,它和form表單的請求方式一致,後臺可以通過java bean物件來直接對映
$.post('/demo', {
username: '大哥哥',
}, function (res) {
console.log(res)
})
複製程式碼
@RequestMapping("/demo")
@ResponseBody
public String demo(User user) {
System.out.println(user);
return "發噶嘎嘎";
}
複製程式碼
輸出結果:
如果User類的結構是這樣的: 可以很清楚的看到,User類中有一個Classs類的引用,如果ajax請求需要將User物件的引數傳送給後臺,並將classs屬性中的屬性也一併傳值給後臺,那麼像上面的寫法就不能滿足當前業務邏輯的需求了。- 首先,前臺的ajax請求需要指定
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)
}
})
複製程式碼
後臺程式碼:
@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 "發噶嘎嘎";
}
複製程式碼
輸出結果:
注:@RequestBody只能在請求為json格式的時候才能使用
需要設定contentType
為json
格式、將傳遞資料用JSON.stringify()轉成字串、Spring Mvc需要在引數前加@RequestBody的情況:
- 只要需要傳遞一個物件,並將這個物件中的物件也傳值到後臺去
- 傳遞的是一個陣列
傳遞陣列的問題在我的上一篇部落格中已經講到:陣列問題解決
除了以上情況,就算是後臺需要對映多個物件的時候,也可以用平常的方法解決
比如:username給User賦值,classname給Classs賦值
$.post('/demo', {
username: '大哥哥',
classname: '32:10班'
}, function (res) {
console.log(res)
})
複製程式碼
後臺程式碼:
@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 "發噶嘎嘎";
}
複製程式碼
輸出結果: