欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ajax请求

程序员文章站 2022-07-12 18:57:50
...

今天使用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 "发噶嘎嘎";
}
复制代码

输出结果: