我的风格就是 列出例子,不过多的讲理论。
一切从一个普通的前端ajax请求jspringMVC后端的例子开始,
前端jQuery ajax 请求:
- $.ajax({
- url: getAbsoluteUrl('score/findScore'),
- type: 'POST',
- dataType: 'json',
- success: function (res) {
- alert(res);
- },
- error: function (msg) {
- alert(msg);
- }
- });
后端 springMVC代码
- @RequestMapping(value = "findScore", method = RequestMethod.POST, produces = "application/json")
- public @ResponseBody Map findScore(Model model, ServletRequest request) {
-
- Map map = new LinkedHashMap();
-
- map.put("createdUser","jiabaochina");
- map.put("score", 5);
- map.put("status", "success");
- return map;
- }
以上的代码是没有问题的,请求后会直接alert一个js对象。
这是因为ajax请求dataType值为json,jquery就会把后端返回的json字符串尝试通过JSON.parse()尝试解析为js对象。
http协议response返回值无论是json字符串还是普通text文本还是html文本,本质上讲,http response响应体就是文本内容。
而 jquery ajax 根据datatype来解析返回的文本,
简单讲datatype=‘text’时,jquery直接返回字符串。
当datatype=‘json’时,jquery会调用JSON.parse()解析字符串为js对象并且返回。
当datatype=‘html’时,jquery会在把html插入dom之前执行字符串包含的js代码。
看完ajax后台我们再看下springmvc后台,@responseBody的作用是方法返回的数据不经过视图解析,直接把map写到response响应体中。
@requesMapping的作用是通过其所带的value、method等值来决定是否处理该请求。
如以上
- @RequestMapping(value = "findScore", method = RequestMethod.POST, produces = "application/json")
含义是 :findScore对应url地址;metohd对应请求方法类型,只处理post请求。
那
produces =
"application/json"是什么意思呢?
此种方式相对使用@RequestMapping的“
headers = "Accept=application/json"
”更能表明你的目的。
其实produces =
"application/json"和headers = "Accept=application/json"”是一个意思。
此方法只处理 request 请求头中accept 为
"application/json"或者能够包含"application/json"的值,如“*/*”。
来,跑个例子。修改下上面的ajax请求
- $.ajax({
- url: getAbsoluteUrl('score/findScore'),
- headers: {
Accept: "text/plain; charset=utf-8"
},
- type: 'POST',
- dataType: 'json',
- success: function (res) {
- alert(res);
- },
- error: function (msg) {
- alert(msg);
- }
- });
在Prototyp(1.5)的Ajax代码封装中,将Accept默认设置为“text/javascript, text/html, application/xml, text/xml, */*”。这是因为Ajax默认获取服务器返回的Json数据模式。所以设置headers,强行制定ajax请求头 accept为“text/plain”。
结果,后端的方法都没进入,直接tomcat返回406错误。
结果和意义:
在普通的web项目中,前后端沟通很方便,甚至前后端是一个人在开发。这样produces = "application/json"就没有意义。
只有当在开发数据接口时,特别是调用方和开发方距离很远时,通过request请求accept和produces = "application/json"的配合,
能很好的限定数据的格式,确保万无一失。
有任何错误或疑问,请留言。
参考资料:
http://www.studyofnet.com/news/166.html
http://blog.csdn.net/lzwglory/article/details/17252099