SpringMVC实现JSON交互:@RequestBody注解与@ResponseBody注解的使用

现如今由于移动互联网的兴起,简洁的JSON格式成为很多系统之间进行交互的主要格式。SpringMVC为开发者提供了一种简洁的实现不同数据格式交互的机制(JSON、XML以及其他数据格式),其会将前台传来的JSON/XML等格式信息自动转换为相应的包装类,或者将输出的信息转换为JSON/XML等格式的数据。

SpringMVC主要利用类型转换器(MessageConverter)将前台信息转换成开发者需要的格式。然后在相应的Controller方法接收参数前添加@RequestBody注解,进行数据转换,或在方法的返回值类型处添加@ResponseBody注解,将返回信息转换成相关格式的数据。

@RequestBody注解的特点就是,根据请求参数的Content-Type决定是否将相关格式转换至包装类,如果Content-Type是目标类型,就进行转换。这里转换的是JSON数据,所有要求将前端请求的Content-Type指定为“application/json”类型,而普通key/value请求参数的Content-Type默认为“application/x-www-form-urlencoded”类型。

【实例】使用SpringMVC实现JSON交互。

1、引用依赖的jar包

SpringMVC对于JSON的解析和组装是基于开源工具类jackson的,所以要使用SpringMVC进行JSON数据交互,必须引入jackson的3个依赖jar包:jackson-core.jar、jackson-annotations.jar、jackson-databind.jar。将这3个jar包引用到项目中。

2、配置类型转换器

引入相关的依赖jar包后,需要在SpringMVC核心配置文件springmvc.xml中,为处理器适配器(HandlerAdapter)配置类型转换器列表MessageConverter,并在其中添加需要的类型转换器。这样当请求到达处理器适配器层时,配置的@RequestBody注解与@ResponseBody注解就会利用具体的类型转换器MessageConverter将请求信息转换为指定的格式。具体配置如下:

<!-- 注解适配器 -->
<!-- 注意:如果配置了<mvc:annotation-driven/>自动注解标签,那么这种情况就不需要配置类型转换器了 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
        </list>
    </property>
</bean>

但要注意的是,如果配置了<mvc:annotation-driven/>自动注解标签,则表明使用SpringMVC提供的注解型配置,那么这种情况就不需要配置类型转换器了,因为SpringMVC已经默认初始化了7种转换器。

使用<mvc:annotation-driven/>自动注解标签配置,可以转换多种类型的数据格式,因为自动注解配置默认加载了7种类型转换器。而如果不使用自动注解配置,只是单独配置了JSON转换器,则配置了@RequestBody的参数只能接收并解析JSON格式的数据,如果想解析或组装其他类型的数据,则需要添加新的类型转换器。

3、编写Controller控制器的执行方法

(1)创建用户信息参数类(UserParam.java),用于接收前端请求的参数。

package com.pjb.mvc.model;

/**
 * 用户信息参数类
 * @author pan_junbiao
 **/
public class UserParam
{
    private String userName; //用户名称
    private String password; //用户密码

    //省略getter与setter方法...
}

(2)创建用户信息模型类(UserModel.java),用于保存用户信息并返回给页面。

package com.pjb.mvc.model;

/**
 * 用户信息模型类
 * @author pan_junbiao
 **/
public class UserModel
{
    private int userId; //用户ID
    private String userName; //用户名称
    private String blogUrl; //博客地址
    private String remark; //备注信息

    //省略getter与setter方法...
}

(3)创建控制器类,并实现获取JSON格式的登录用户信息的方法。

package com.pjb.mvc.controller;

import com.pjb.mvc.model.UserModel;
import com.pjb.mvc.model.UserParam;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * JSON控制器类
 * @author pan_junbiao
 **/
@Controller
@RequestMapping("json")
public class JsonController
{
    /**
     * 获取JSON格式的登录用户信息
     */
    @RequestMapping(value = "getLoginUser", method = RequestMethod.POST)
    @ResponseBody
    public UserModel getLoginUser(@RequestBody UserParam userParam)
    {
        UserModel userModel = null;
        //判断登录信息
        if (userParam.getUserName().equals("pan_junbiao的博客") && userParam.getPassword().equals("123456"))
        {
            userModel = new UserModel();
            userModel.setUserId(1);
            userModel.setUserName("pan_junbiao的博客");
            userModel.setBlogUrl("https://blog.csdn.net/pan_junbiao");
            userModel.setRemark("您好,欢迎访问 pan_junbiao的博客");
        }
        //返回结果
        return userModel;
    }
}

4、执行测试

4.1 测试方法一:使用ajax请求

使用JQuery提供的Ajax功能请求,关键代码:

//加载数据钮事件
$("#btnLoad").click(function () {
    //请求参数对象
    var params = {};
    params.userName = "pan_junbiao的博客";
    params.password = "123456";

    //执行Ajax请求
    $.ajax({
        type: "POST",
        url: "${pageContext.request.contextPath}/json/getLoginUser.action",
        dataType: "json",
        contentType: "application/json; charset=UTF-8",
        data: JSON.stringify(params),
        success: function (result) {
            //绑定数据
            $("#td_userId").html(result.userId);
            $("#td_userName").html(result.userName);
            $("#td_blogUrl").html(result.blogUrl);
            $("#td_remark").html(result.remark);
        }
    });
});

创建测试页面(userJson.jsp),完整的测试代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SpringMVC实现JSON交互</title>
    <meta name="author" content="pan_junbiao的博客">
    <style>
        table { border-collapse: collapse; margin-bottom: 10px}
        table,table tr th, table tr td { border:1px solid #000000; padding: 5px 10px;}
        .txtBox{padding: 3px;width: 300px;font-size: 16px;}
    </style>
</head>
<body>
<div align="center">
    <table>
        <caption>SpringMVC实现JSON交互</caption>
        <tr>
            <th>用户ID:</th>
            <td id="td_userId"></td>
        </tr>
        <tr>
            <th>用户名称:</th>
            <td id="td_userName"></td>
        </tr>
        <tr>
            <th>博客地址:</th>
            <td id="td_blogUrl"></td>
        </tr>
        <tr>
            <th>备注信息:</th>
            <td id="td_remark"></td>
        </tr>
    </table>
    <input type="button" id="btnLoad" value="加载数据"/>
</div>
</body>
<script src="${pageContext.request.contextPath}/JS/jquery-3.4.1.min.js"></script>
<script>
    //加载数据钮事件
    $("#btnLoad").click(function () {
        //请求参数对象
        var params = {};
        params.userName = "pan_junbiao的博客";
        params.password = "123456";

        //执行Ajax请求
        $.ajax({
            type: "POST",
            url: "${pageContext.request.contextPath}/json/getLoginUser.action",
            dataType: "json",
            contentType: "application/json; charset=UTF-8",
            data: JSON.stringify(params),
            success: function (result) {
                //绑定数据
                $("#td_userId").html(result.userId);
                $("#td_userName").html(result.userName);
                $("#td_blogUrl").html(result.blogUrl);
                $("#td_remark").html(result.remark);
            }
        });
    });
</script>
</html>

执行结果:

4.2 测试方法二:使用Postman工具

第二种测试方法,使用Postman工具进行测试。

执行结果:

发布了354 篇原创文章 · 获赞 208 · 访问量 165万+

猜你喜欢

转载自blog.csdn.net/pan_junbiao/article/details/103835016