ajax請求

今天使用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屬性中的屬性也一併傳值給後臺,那麼像上面的寫法就不能知足當前業務邏輯的需求了。

  • 首先,前臺的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)
    }
})
複製代碼

後臺代碼: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

須要設置contentTypejson格式、將傳遞數據用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

相關文章
相關標籤/搜索