Spring MVC JSON交互

女生的网名这么多〃 提交于 2020-01-02 00:27:02

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.stringify()这个方法处理,但是在IE下各种问题。不是方法行为不一致就是JSON对象不支持等等。后来直接引用了jquery.json.js,使用了他的$.toJSON()方法。

    var jquery_content = $.toJSON(blog_content);

  • 如果使用data:'content=some&uid=1'方式提交数据,需要注意提交内容中是否包含不合适的符号,比如'&'。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!