Ajax请求

今天使用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格式的时候才能使用

需要设置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 "发噶嘎嘎";
}

输出结果:

原文地址:https://www.cnblogs.com/dagger9527/p/11836607.html