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'
方式提交数据,需要注意提交内容中是否包含不合适的符号,比如'&'。