前端发送post请求,使用ajax发送json字符串,使用ajax以post方式发送json数据只能发送json字符串才能被控制器用Map接收,如果发送json对象,就会导致请求数据变成这样:),
这样的数据是没办法被SpringMVC解析的。而发送json字符串,请求数据就变成了json格式的数据,就可以被解析了。
<a href="javascript:void(0);" onclick="postSend()">测试post发送Map数据</a><br>
<script type="text/javascript">
function postSend(){
$.ajax({
url:"${ctx}/account/postsend",
data:'{"uid":"10021","uname":"zhangsan","uage":"15","usex":"男","uphone":"18296126955","uadderss":"幸福小区23号"}',
type:"post",
contentType:"application/json;charset=utf-8",
dataType:'json',
success:function(data){
alert("send success!");
console.log(data);
}
})
}
</script>
后台控制器:
@RequestMapping("/account/postsend")
@ResponseBody
public Map<String,String> postSend(@RequestBody Map<String,String> map){
for(Map.Entry<String,String> me:map.entrySet()){
System.out.println(me.getKey()+"::"+me.getValue());
}
System.out.println(" map end");
return map;
}
打印结果:
前端发送get请求,使用ajax发送json对象数据,这时使用get请求就可以发送json对象了,这时候浏览器的请求数据如下:
<a href="javascript:void(0);" onclick="getSend()">测试接收Map数据</a><br>
<script type="text/javascript">
function getSend(){
$.ajax({
url:"${ctx}/account/getsend",
data:{"uid":"10021","uname":"zhangsan","uage":"15","usex":"男","uphone":"18296126955","uadderss":"南昌市新建区幸福小区23号"},
type:"get",
contentType:"application/json;charset=utf-8",
dataType:'json',
success:function(data){
alert("send success!");
console.log(data);
}
})
}
</script>
后台控制器:
@RequestMapping(value="/account/getsend",method = RequestMethod.GET)
@ResponseBody
public Map<String,String> getSend(@RequestParam Map<String,String> map){
for(Map.Entry<String,String > me:map.entrySet()){
System.out.println(me.getKey()+":::"+me.getValue());
}
System.out.println(" map end.");
return map;
}
打印结果:
细心的同学可能会发现,两个控制器中的参数Map前面的注解不一样,接收post请求,用的是@RequestBody,而接收get请求用的是@RequestParam。
原因是:
@RequestBody 注解常用来处理Content-Type不是application/x-www-form-urlencoded
编码的内容,而是例如application/json, application/xml等编码的;
它是通过使用HandlerAdapter 配置的HttpMessageConverters
来解析post data body,然后绑定到相应的bean上的。
@RequestParam 用于在控制层获取请求体中的参数,类似使用request.getParameter("name"); 而我们上面已经看到了,使用get发送json对象,Query string 就是标准的key-value格式数据,非常符合@RequestParam的取值要求。