SpringMVC - JSON数据交互

Posted Lam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC - JSON数据交互相关的知识,希望对你有一定的参考价值。

Json(JavaScript Object Notation),它是一种轻量级数据交换格式,格式简单,易于读写,目前使用特别广泛。

1. 两种交互模式

① 请求json、输出json,要求请求的是json串,所以在前端页面中需要将请求的内容转成json,不太方便。
② 请求key/value、输出json。此方法比较常用。

2. @RequestBody 与 @ResponseBody

@RequestBody:接收用户传入json串转成pojo

用于读取http请求的内容(字符串),通过Springmvc提供的HttpMessageConverter接口将读到的内容(json数据)转换为Java对象并绑定到controller方法的参数上。

传统的请求参数:

save?item_id=001&item_name=王者荣耀&item_type=MOBA&item_price=0.0

现在的请求参数:使用POST请求,在请求体里面加入json数据

{
  "item_id" : "001",
  "item_name" : "王者荣耀",
  "item_type" : "MOBA",
  "item_price" : 0.0
}

@ResponseBody:把pojo转成json串响应用户

用于将controller的方法返回的对象,通过springmvc提供的HttPMessageConverter接口转换为指定格式的数据,如:json、xml等,通过Response响应给客户端。

3. 环境配置

对于Gson和jackson这两个json处理依赖,直接添加即可。
除此之外,其他的json解析器如fastjson都需要手动配置HttpMessageConverter。
实际上,在SpringMVC中,是由一个名叫HttpMessageConverter的类来提供对象到JSON字符串的转换的。
而SpringMVC默认就提供了Gson和Jackson的HttpMessageConverter,分别是org.springframework.http.converter.json.GsonHttpMessageConverter和MappingJackson2HttpMessageConverter。
对于其他的JSON解析器,只需要开发者手动配置一下HttpMessageConverter。

1、jar包准备 - 本例使用jackjson处理

Springmvc默认用MappingJacksonHttpMessageConverter对json数据进行转换,需要加入jackson的包,如下:

2、springmvc.xml文件中的配置推荐使用注解驱动

① 如果配置文件中配置过注解驱动<mvc:annotation-driven />,则无需多余配置

② 如果没有配置注解驱动, 则需如下配置(不推荐使用这种方式)

<!-- 注解适配器 -->
<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> 

 额外说明

默认情况下,JSON处理的HttpMessageConverter在org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter类中,如果当前项目的classpath下有jackson或者gson的依赖,则会被该类自动加载,然后创建相应的HttpMessageConverter。

对于fastjson,由于系统未提供自动支持,因此需要开发者手动配置fastjson的HttpMessageConverter,配置方式如下:

① 引入fastjson依赖:fastjson.jar

② 加入配置

<mvc:annotation-driven>
    <!--不使用默认消息转换器 -->
    <mvc:message-converters register-defaults="true ">
        <!-- 配置fastjson支持 -->
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <!--顺序保持这样,避免IE下载出错 -->
                    <value>text/html;charset=UTF-8</value>
                    <value>application/json</value>
                </list>
            </property>
            <property name="features">
                <list>
                    <value>WriteMapNullValue</value>
                    <value>QuoteFieldNames</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

HttpMessageConverter承担两件事

① 将请求结果转为json
② 将浏览器发送来的json转为对象

4. 请求JSON、响应JSON实现

请求

接收一个JSON格式的数据,需要框架帮我们自动转化为相关的Java对象。
客户端提交的数据需要通过 AJAX POST方式提交JSON数据
需要在形参中添加@RequestBody
@RequestBody:会把请求过来的JSON数据转成对象;主要用来接收前端传递给后端的json字符串中的数据。

响应

响应给客户端的是一个item对象 对应的JSON数据,
在处理方法中添加@ResponseBody注解

在springmvc中,直接接收json参数,如果参数中有日期的话,
不需要定义日期类型转换器,日期的转换由gson/jackson/fastjson来提供。

5. 使用JSON数据交互

前端代码:

注意:
① json只能是在请求体中,因此,json只能放在post或者put请求中,
② 请勿使用get/delete请求去测试json参数传递。
function jsonData() {
    $.ajax({
        // 请求方式
        type : "post",
        // 请求的url地址
        url : "${pageContext.request.contextPath }/jsonData.do",
        // 发送的数据格式
        contentType : "application/json",
        // 发送数据,使用JSON.stringify将对象转换为字符串
        data : JSON.stringify({
            "item_id" : "007",
            "item_name" : "王者荣耀",
            "item_type" : "MOBA",
            "item_price" : 0.0
        }),
        // 回调的格式
        dataType : \'json\',
        // 回调函数
        success : function(data) {
            alert(data);
            alert(data.item_name);
        },
        error : function(xhr, ajaxOptions, thrownError) {
            alert("请求出错!" + item);
            return false;
        }
    });
}

Controller代码:

@ResponseBody
@RequestMapping(value = "jsonData.do")
public ItemInfo jsonData(@RequestBody ItemInfo item) {
    System.out.println("jsonData = " + item);
    return item;
}

测试结果:

 - 浏览器发送的数据

 - 后台接收

 - 浏览器响应:返回一个json字符串

 - alert弹窗

 

以上是关于SpringMVC - JSON数据交互的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC学习——SpringMVC与前台的json数据交互

SpringMVC学习09SpringMVC与前台的json数据交互

SpringMVC中JSON数据交互

springMVC学习(11)-json数据交互和RESTful支持

SpringMvc的JSON数据交互

SpringMVC - JSON数据交互