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