ajax請求

雪沫一隅發表於2019-02-26

今天使用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 "發噶嘎嘎";
}
複製程式碼

輸出結果:

ajax請求
如果User類的結構是這樣的:
ajax請求
ajax請求
可以很清楚的看到,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 "發噶嘎嘎";
}
複製程式碼

輸出結果:

ajax請求

注:@RequestBody只能在請求為json格式的時候才能使用

需要設定contentTypejson格式、將傳遞資料用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 "發噶嘎嘎";
}
複製程式碼

輸出結果:

ajax請求

相關文章