赞
踩
情况:在利用ajax传值时,阿红遇到的情况如下,在设置jsp的ajax请求方式为:
<script> $("#btn1").click(function (){ let url = "${pageContext.request.contextPath}/user/getAjaxInfo"; $.ajax({ type:'post', dataType:'json', url:url, data:{ "id":23, "username":"王五" }, contentType:'application/json;charset=utf-8', success: function (resp) { alert(JSON.stringify(resp)); } }) }) </script>
利用springMVC来接收参数:
@ResponseBody
@RequestMapping("/getAjaxInfo")
public String ajax( @RequestParam("id") int id ,@RequestParam("username") String username){
StringBuffer str = new StringBuffer();
str.append(" id="+id).append("username="+username);
System.out.println("------------"+str.toString());
return str.toString();
}
后台出现错误:
利用浏览器查看请求信息:
出现问题的原因:
出现这个请求无效说明请求没有进入后台服务器里,也就是我们值没有传到后台中。在我百思不得其解,是了几遍有几遍,问题还是没有解决。
问题分析:
dataType:'json',
contentType:'application/json;charset=utf-8',
contentType: "application/json”,首先明确一点,这也是一种文本类型(和text/json一样),表示json格式的字符串,如果ajax中设置为该类型,则发送的json对象必须要使用JSON.stringify进行序列化成字符串才能和设定的这个类型匹配。
而自己在后台接收参数直接用@RequestParam来接收,
@RequestParam("id") int id ,@RequestParam("username") String username
传递过来的并不是简单参数,而是一个json对象。所以我们必须要使用@RequestBody来注解来接收。
@RequestBody作用:主要用来解析前端传递给后端的json字符串中的数据的
但我们想拿到每个参数的对应值,此时可以采用Map<String,String>接收
@RequestMapping(value = "/Login",method = {RequestMethod.POST})
public @ResponseBody Boolean Login(@RequestBody Map<String,String> map) {
//此时map.get("id" 23)就是前端的id
System.out.println(map.get("id"));
//map.get("username" wangwu)就是前端的username
System.out.println(map.get( "username"));
或者利用application/x-www-form-urlencoded的默认值(从前台删除即可)
后台接收:
@ResponseBody
@RequestMapping("/getAjaxInfo")
public String ajax( @RequestParam("id") int id ,@RequestParam("username") String username){
StringBuffer str = new StringBuffer();
str.append(" id="+id).append("username="+username);
System.out.println("------------"+str.toString());
return str.toString();
}
2.application/x-www-form-urlencoded 和 application/json 两种类型的数据在后端如何接收并解析?
application/x-www-form-urlencoded 这种类型的参数提交方式有get和post两种,这两种方式的区别是前者把编码后的user=username&pass=password这种形式的参数放在url上进行提交,后者是放在请求报文的请求体部分进行发送,只是发送数据时数据放的位置不一样。服务端收到 user=username&pass=password 这种形式的参数后,原生的Servlet使用request.getParameter(“user”)的这种形式即可获取参数,spring mvc 中 框架可自动根据参数名进行匹配,即表单元素的name属性和接收参数的名称一样时即可自动匹配,如果不一样,还可以使用@RequestParam的方式匹配。
application/json 字符串数据原生的Servlet中可以使用request.getParameterMap()来获取,但需注意,这种只能获取Get方式传入的数据。post传入的需要使用输入流的方式来读取。在spring mvc中通过@RequestBody来解析并绑定json字符串参数到方法入参。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。