问题描述:
在学习SpringMVC时,使用jackson对Ajax请求传输json信息进行自动解析。在Controller使用注解@RequestBody获取请求体并封装成user对象。如果使用$.post发起请求会出现bug,使用$.ajax则无异常。
// 发送ajax请求
$.ajax({
// 编写json格式,设置属性和值
url:"user/testAjax",
contentType:"application/json;charset=UTF-8",
data:'{"username":"Tom","password":"123","age":30}',
dataType:"json",
type:"post",
success:function(data){
// data服务器端响应的json的数据,进行解析
alert(data);
alert(data.username);
alert(data.password);
alert(data.age);
}
});
// 发送ajax请求
$.post(
"user/testAjax",
// "servletTest/testAjax",
{username:"hhjiji",password:"123",age:20},
function (result){
alert("haha");
alert(result.username);
alert(result.age);
},
"json"
);
/**
* 模拟异步请求响应
*/
@ResponseBody
@RequestMapping("/testAjax")
public User testAjax(@RequestBody User user){
System.out.println("testAjax方法执行了...");
// 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
System.out.println(user);
// User user = new User();
// 做响应,模拟查询数据库
user.setUsername("Jack");
user.setAge(40);
// 做响应
return user;
}
原因分析:
jackson可以将request请求中的json解析并封装为javaBean。而$.post中的contentType默认为application:x-www-form-urlencoded; charset=UTF-8。它的参数传输格式是“username==Tom&age=20”格式的,所以jackson无法解析并封装。而$.ajax请求中可以设置
contentType:"application/json;charset=UTF-8",
解决方案:
方法1:使用$.Ajax发起请求
方法2:修改jQuery中的源码,.post默认contentType修改为"application/json;charset=UTF-8"(源码一般不要修改)
以上均为小白初学中遇到的坑,特此记录避免下次再踩。。。