Spring MVC JSON交互
1.配置
在Spring MVC的处理流程中的HandlerAdapter部分增加了对JSON格式的转换。需要在HandlerAdapter中配置对应的messageConverters。将配置添加到Spring MVC的配置文件中,代码:
<!--注解适配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> </bean> </list> </property> </bean>
使用
<mvc:annotation-driven />
则不需要配置。(此标签默认加载了一系列的默认配置,不只是HandlerMapper、和HandlerAdapter.我们这么懒当然使用这个喽)
Spring MVC提供的这个messageConverters内部使用的是jackson的类库。所以这里需要加入jar包:
jackson-core-asl-1.9.11.jar、jackson-mapper-asl-1.9.11.jar
2.格式
Spring MVC中处理JSON使用的是两个注解。
@RequestBody
和@ResponseBody
。他们均加在对象前面,将JAVA对象与JSON对象自动转换。
@RequestBody
- 将请求转换成JAVA对象。@ResponseBody
- 将JAVA对象转换成JSON对象。
所以,在请求数据为JSON数据的时候使用
@RequestBody
,在响应数据为JSON的时候使用@ResponseBody
典型用法:
JSON请求,JSON响应(已删去不必要的部分)
//前台代码 function loadMore() { $.ajax({ type:"post", url:"/blog/loadMore.action", contentType:"application/json;charset=utf-8;", data:'{"pageIndex":10}', error: function(request) {}, success : function(data){ if(null!=data && data.length>0){ }else{} } }); } //后台代码 @RequestMapping("/loadMore") public @ResponseBody List<Blog> loadMore(@RequestBody BlogJsonVO json,HttpSession session) throws Exception { List<Blog> blogList = blogService.getBlogList(1, json.getPageIndex()); return blogList; }FORM请求,JSON响应
//前台代码 function save(){ $.ajax({ type: "POST", url:contextPath + '/blog/save.action', data:'content=some&uid=1', error: function(request) { alert(" 发生未知错误 "); }, success: function(data) { if(data){ } } }); } //后台代码 @RequestMapping("/save") public @ResponseBody Blog save(Blog blog,HttpServletRequest req) throws Exception { String content = blog.getContent(); if(StringUtils.isNoneBlank(content)){ blogService.addBlog(blog); return blog; } return null; }
3.注意:
contentType:"application/json;charset=utf-8;"
,表明了提交的数据是JSON格式的,此时后台的接收对象前需要加@RequestBody
。JQuery的AJAX请求默认使用的是application/x-www-form-urlencoded;charset=utf-8
此时使用@RequestBody
会报415。在上面的基础上,data的格式需要做对应调整。参照上面代码
浏览器报415,因为jar包没有加或者后台没有加接收的注解
@RequestBody
。- 浏览器报400,JSON格式错误。
- JSON的名值对中的字符串需要是双引号。写成:
data:"{'pageIndex':10}"
就是错误的。
- JSON的名值对中的字符串需要是双引号。写成:
- JSON数据中不可以有回车。最开始我使用
JSON.stringify()
这个方法处理,但是在IE下各种问题。不是方法行为不一致就是JSON对象不支持等等。后来直接引用了jquery.json.js,使用了他的$.toJSON()
方法。
var jquery_content = $.toJSON(blog_content);
- JSON数据中不可以有回车。最开始我使用
如果使用
data:'content=some&uid=1'
方式提交数据,需要注意提交内容中是否包含不合适的符号,比如'&'。
来源:https://www.cnblogs.com/zhuani21/p/5376690.html