零、前言
最近在搞个JavaWeb的项目,用到了ajax,涉记到json数据的传递的后台处理,发现自己不是很会,网上找了些资料,在此做个记录,供以后参考。
一、简单的项目搭建(基于SSM)
以一个简单的登录页面开始,通过ajax传递json到后台,后台进行数据处理,获取参数
-
java Bean类
public class Account { private String userId; private String userName; private String password; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
-
使用ajax向后台传递数据
说明:我个人的jsp页面里的form表单基于layui,故其数据封装在data.field中$.ajax({ url:'/Goods/login.do', method:'post', data:data.field, success:function(result){ if(result){ console.log("登录成功!"); //页面跳转到主页 //window.location.href="/Goods/jsp/main.jsp?user=USER"; }else{ layer.msg("用户名或密码错误,请重新输入!"); } }, error:function(){ layer.msg("出错!"); } });
-
后台controller接受数据,处理数据
@RequestMapping("/login") @ResponseBody public boolean login(Account acc){ String userName = acc.getUserName(); String password = acc.getPassword(); return service.getAccount(userName, password); }
二、前台数据的传递以及后台获取的方式
1.简单的数据格式
几种简单的ajax传递数据的方式如下:
//1. 直接在url中传递
$.ajax({
url:'/Goods/login.do?userName=' + data.field.userName + '&password=' + data.field.password,
method:'post',
success:function(result){
if(result){
console.log("登录成功!");
//页面跳转到主页
//window.location.href="/Goods/jsp/main.jsp?user=USER";
}else{
layer.msg("用户名或密码错误,请重新输入!");
}
},
error:function(){
layer.msg("出错!");
}
});
//2. form表单序列化
var formData = $("#loginForm").serialize();
console.log(formData); //userName=admin&password=123
$.ajax({
url:'/Goods/login.do',
method:'post',
data:formData,
success:function(result){
if(result){
console.log("登录成功!");
//页面跳转到主页
//window.location.href="/Goods/jsp/main.jsp?user=USER";
}else{
layer.msg("用户名或密码错误,请重新输入!");
}
},
error:function(){
layer.msg("出错!");
}
});
//3. 手动拼接数据
$.ajax({
url:'/Goods/login.do',
method:'post',
data:'userName=' + data.field.userName + '&password=' + data.field.password,
//即data:'userName=admin&password=123', 就是将formData的值引起来
success:function(result){
if(result){
console.log("登录成功!");
//页面跳转到主页
//window.location.href="/Goods/jsp/main.jsp?user=USER";
}else{
layer.msg("用户名或密码错误,请重新输入!");
}
},
error:function(){
layer.msg("出错!");
}
});
//4. JavaScript对象
$.ajax({
url:'/Goods/login.do',
method:'post',
data:data.field,
success:function(result){
if(result){
console.log("登录成功!");
//页面跳转到主页
//window.location.href="/Goods/jsp/main.jsp?user=USER";
}else{
layer.msg("用户名或密码错误,请重新输入!");
}
},
error:function(){
layer.msg("出错!");
}
});
与上面四种方式相对应的后台处理方式有两种(任选其一即可),如下所示:
//1. 通过java Bean获取
@RequestMapping("/login")
@ResponseBody
public boolean login(Account acc){
String userName = acc.getUserName();
String password = acc.getPassword();
System.out.println(userName);
System.out.println(password);
return service.getAccount(userName, password);
}
//2. 自己通过HttpServletRequest请求获取
@RequestMapping("/login")
@ResponseBody
public boolean login(HttpServletRequest req){
String userName = req.getParameter("userName");
String password = req.getParameter("password");
System.out.println(userName);
System.out.println(password);
return service.getAccount(userName, password);
}
其中:
- @RequestMapping表示的是映射路径
- @ResponseBody将返回的数据直接写入response body中,传递给前台,若不加,则返回值表示跳转路径(String类型),页面报500错误,后台报【不知道返回值的类型】错误
- service.getAccount(userName, password)是service层的方法,验证用户名和密码是否匹配,属于SSM的内容,与此次所讲内容无关,只需知道其返回的是布尔值即可
结果如下:
2. 复杂的数据格式
此种方式一般采用JSON串传递数据。
几种传递JSON串的方式:
-
将目标json串作为值传递
//1. 将数据打包成一个目标json串,然后将目标json串作为值传递, 如普通数据格式的方式三 $.ajax({ url:'/Goods/login.do', method:'post', data:'data'=JSON.stringify(data.field), success:function(result){ if(result){ console.log("登录成功!"); //页面跳转到主页 //window.location.href="/Goods/jsp/main.jsp?user=USER"; }else{ layer.msg("用户名或密码错误,请重新输入!"); } }, error:function(){ layer.msg("出错!"); } }); //2. 将目标json串作为JSON串的value传递 $.ajax({ url:'/Goods/login.do', method:'post', data:{'data':JSON.stringify(data.field)}, success:function(result){ if(result){ console.log("登录成功!"); //页面掉转到主页 //window.location.href="/Goods/jsp/main.jsp?user=USER"; }else{ layer.msg("用户名或密码错误,请重新输入!"); } }, error:function(){ layer.msg("出错!"); } });
这两种方式的功能相同,但区别并不大,就看个人理解及喜好吧!
对于下面三种后台处理方式(选一个实现即可),实际上这三种方式区别也不多,原理都差不多,在这里写出来供参考吧!/** * 前台JSON串的处理方式一: */ @RequestMapping("/login") @ResponseBody public boolean login(HttpServletRequest request){ //1. 获取请求中名为data的值 String data = request.getParameter("data"); //2. 将字符串转换为JSON串 JSONObject json = JSONObject.fromObject(data); //3. 获取JSON中各个属性的值 String userName = json.getString("userName"); String password = json.getString("password"); //4. 验证登录 return service.getAccount(userName, password); } /** * 前台JSON串的处理方式二: * * 对于简单类型(java的基础数据类型(int、boolean等)、包装类型(Integer, Boolean等)、String、Date等) * 默认采用@RequestParam注解处理,故此处的@RequestParam注解可以省略,如下所示 * * @RequestParam注解只能处理Content-Type的值为application/x-www-form-urlencoded的内容 */ @RequestMapping("/login") @ResponseBody public Object login(@RequestParam String data){ //1.将字符串转换为JSON串 JSONObject dataObject = JSONObject.fromObject(data); //2. 将JSON串转换为Java Bean类对象 Account acc= (Account)dataObject.toBean(dataObject, Account.class); //3. 获取值 String userName = acc.getUserName(); String password = acc.getPassword(); //4. 验证登录 return service.getAccount(userName, password); } /** * 前台JSON串的处理方式三: * * 此种方式与方式一基本一样,少了一行从request中获取数据的代码, * 原因是@RequestParam会自动从request中获取形参(data)的值 */ @RequestMapping("/login") @ResponseBody public boolean login(String data){ //1. 将字符串转换为JSON串(JSON对象) JSONObject json = JSONObject.fromObject(data); //2. 获取JSON中各个属性的值 String userName = json.getString("userName"); String password = json.getString("password"); //3. 验证登录 return service.getAccount(userName, password); }
-
直接传递目标json串
说明:
1. 上面的传递方式(简单的、复杂的数据传递)都采用的是键/值对的方式,但基于 SpringMVC的@ResquestBody注解,可以直接传递json串
2. @ResquestBody要求把所有参数作为json解析,url中不能包含key=value的写法,故可以轻易的将对象传到后端$.ajax({ url:'/Goods/login.do', method:'post', data:JSON.stringify(data.field), contentType:'application/json;charset=utf-8', //使用此方式必须制定contentType的值 success:function(result){ if(result){ console.log("登录成功!"); //页面跳转到主页 //window.location.href="/Goods/jsp/main.jsp?user=USER"; }else{ layer.msg("用户名或密码错误,请重新输入!"); } }, error:function(){ layer.msg("出错!"); } }); /** * 前台JSON串的处理方式四: * * 通过@RequestBody注解处理request中的json串,将其绑定到相应的Bean上(转换为Java Bean类) */ @RequestMapping("/login") @ResponseBody public boolean login(@RequestBody Account acc) { String userName = acc.getUserName(); String password = acc.getPassword(); return service.getAccount(userName, password); }
三、总结
说了这么多,写了这么多,仅供大家伙参考,具体采用哪种方式根据自己实际需求来,各取所需,按照自己心中的那个标准来。
希望这篇文章能真正帮助到你!
若对于上文中的@ResponseBody、@RequestBody、@RequestParam注解还不太理解,可以参考我的另一篇文章:
https://blog.csdn.net/czm_ob/article/details/103843518