Spring MVC提供了丰富的数据转换的Converter类,供前台与后台交互时进行数据自动转换(包装)
此时可以直接将数据组装成规范的JSON对象传递,前台后台不用做任何处理
controller:
具体Converter类:http://www.cnblogs.com/zivxiaowei/p/3459606.html(MappingJacksonHttpMessageConverter为Spring MVC 4.0之前版本的类)
在具体代码中,只需要在配置文件中添加
<mvc:annotation-driven />
Spring MVC将为我们自动装配基本所有的Converter自动转换类。
使用Ajax 向后台发送请求时,经常会遇到各种参数错误问题。这里主要讲传JSON 形式的参数
1、当传递的对象不包含列表和哈希表属性时
如:
public class User {
private String userName;
private String password;
private String email;
}
此时可以直接将数据组装成规范的JSON对象传递,前台后台不用做任何处理
js代码:
$("#ajaxSubmit2").click(function(){
var user = {
userName: "lily",
password: "345",
email: "345@qq.com"
};
$.ajax({
url: "../methodParam/ajaxSubmit2",
type: 'POST',
dataType: 'json',
data: user,
success: function(data) {
alert(data.userName);
}
});
controller:
@RequestMapping(value = "ajaxSubmit2", method = RequestMethod.POST)
@ResponseBody
public UserDTO ajaxSubmit2(UserDTO user) {
System.out.println(user.getUserName());
return user;
}
此时请求中的参数存放在Form data中
POJO类:
public class Project {
private String name;
private User[] users;
}
JS数据:
var users = [
{
"userName": "tom",
"password": "123",
"email": "123@qq.com"
},
{
"userName": "jack",
"password": "234",
"email": "234@qq.com"
},
{
"userName": "lily",
"password": "345",
"email": "345@qq.com"
}
];
var project = {"project.name": "DMP", "project.users": users};
此时无法用1中的方法进行参数传递,需要将对象转成JSON格式的字符串
js代码:
$.ajax({
url: "../methodParam/ajaxSubmit",
type: 'POST',
contentType: "application/json",
dataType: 'json',
data: JSON.stringify(project),
success: function(data) {
alert(data.name);
}
});
其中contentType和JSON.stringify是必须的,后台根据contentType进行判断用哪种转换器进行数据转换
后台Controller必须添加RequestBody注解
@RequestMapping(value = "ajaxSubmit", method = RequestMethod.POST)
@ResponseBody
public User ajaxSubmit(@RequestBody ProjectDTO project) {
System.out.println(project.getUsers()[0].getUserName());
User user = new User();
user.setName(project.getUsers()[0].getUserName());
return user;
}
此时request中的数据存放在request payload中
注:JSON数组也用此方式
另外,在项目中遇到的不规范的数据格式写法的整理
1、传递user对象
$("#formAjaxSubmit").click(function(){
var data = {};
data['user["userName"]'] = "tomtom";
data['user["password"]'] = "123";
data['user["email"]'] = "123@qq.com";
$.ajax({
url: "../user/formAjaxSubmit",
type: 'POST',
dataType: 'json',
data: data,
success: function(data) {
alert(data);
}
});
});
2、传递project对象
$("#arrayAjaxSubmit").click(function(){
var data = {};
data['users[0].userName'] = "tom";
data['users[0].password'] = "123";
data['users[0].email'] = "123@qq";
data['users[1].userName'] = "lily";
data['users[1].password'] = "234";
data['users[1].email'] = "234@qq";
data['name'] = "DMP";
$.ajax({
url: "../methodParam/arrayAjaxSubmit",
type: 'POST',
dataType: 'json',
data: data,
success: function(data) {
alert(data.userName);
}
});
});
后台不用添加任何注解