参考博文地址:http://blog.youkuaiyun.com/LostSh/article/details/68923874
前几天做项目的时候,遇到了一个ajax传递参数不成功的问题,现在记录下来。
问题描述:
想向后台传递一个user对象,我是这么写的,直接传了一个json对象过去,但是后台并没有接受到传递的值。
js代码:
$.ajax({
url : ctx + "/system/user/springMVC",
type : "post",
data : {
'user':{
'name':'userName'
}
},
dataType : "json",
success : function(result) {
if (result) {
$.messager.alert("温馨提示", result.message);
}
}
});
controller层代码:
@RequestMapping(value = "springMVC",method = RequestMethod.POST)
@ResponseBody
public void springMVC(User user) {
System.out.println(user.getName());
}
结果发现后台并没有接收到user传递过来的值,请教了一下别人 ,把外面包裹的user给去掉就行了,即:$.ajax({
url : ctx + "/system/user/springMVC",
type : "post",
data : {
'name':'userName'
},
dataType : "json",
success : function(result) {
if (result) {
$.messager.alert("温馨提示", result.message);
}
}
});
果然在后台获取到了name的值,进一步请教,为什么我那种方式不行,答曰:因为spring进行参数绑定的时候,如果是基础类型、包装类、以及String,那么它会默认把同名的参数直接赋值,如果是POJO类型的话,就会去找它的set方法,在我这个例子中,代码中并没有 setUser这个方法,所以spring无法给它赋值,但是user中
却有setName这个方法,所以能成功接收这个参数。
还有一个问题,之前我想向后台传递一个user列表,在网上查了一下得知不能直接传,需要使用一个类包装起来,类似于:
public class UserVo {
private List<User> userList;
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
}
接收的时候使用 UserVo进行接收,例如:
@RequestMapping(value = "springMVC",method = RequestMethod.POST)
@ResponseBody
public void springMVC(UserVo userVo) {
}
但是我不想再新建一个类来传递,后来发现可以使用@requestBody这个注解来进行列表数据的传递。
@requestBody接收的是json类型的字符串,所以我们传递对象时,可以先使用JSON.stringify(data)方法将JSON对象转化为JSON字符串。其次 contentType需要改为:"application/json"。例如:
$.ajax({
url : ctx + "/system/user/springMVC",
type : "post",
data : JSON.stringify(userList),
dataType : "json",
contentType : "application/json",
success : function(result) {
if (result) {
$.messager.alert("温馨提示", result.message);
}
}
});
@RequestMapping(value = "springMVC",method = RequestMethod.POST)
@ResponseBody
public void springMVC(@RequestBody List<User> userList) {
for(User user : userList){
System.out.println(user.getName());
}
}
结果:成功获取到数据。