SpringMVC(10)——JSON数据交互

概述

Spring MVC在数据绑定的过程中需要对传递数据的格式和类型进行转换,它既可以转换String等类型的数据,也可以转换JSON等其他类型的数据。

为实现浏览器与控制器类之间的JSON数据交互,SpringMVC提供了MappingJackson2HttpMessageConverter实现类默认处理JSON格式请求响应。该实现类利用Jackson开源包读写JSON数据,将Java对象转换为JSON对象和XML文档,同时也可以将JSON对象和XML文档转换为Java对象。

Jackson开源包及其描述如下:

  • jackson-annotations-2.9.4.jar:JSON转换注解包。
  • jackson-core-2.9.4.jar:JSON转换核心包。
  • jackson-databind-2.9.4.jar:JSON转换的数据绑定包。

可以访问https://mvnrepository.com/search?q=jackson下载。

故所需的jar包

在使用注解开发时需要用到JSON格式转换注解,分别是@RequestBody和@ResponseBody。

  • @RequestBody:用于将请求体中的数据绑定到方法的形参中,该注解应用在方法的形参上。
  • @ResponseBody:用于直接返回return对象,该注解用在方法上。

实例

创建springmvc项目并按照下图创建文件夹及文件:

各文件内容如下:

StudentController.java

package springmvcdemo.controller;

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;
import springmvcdemo.pojo.Student;

@Controller
@RequestMapping("/student")
public class StudentController {

    /**
     * 接收JSP页面请求的JSON数据,并返回JSON格式的结果
     * 方法中的@RequestBody注解用于将前端请求体中的JSON格式数据绑定到形参student上
     * 而@ResponseBody注解用于直接返回Student对象,当访问POJO对象时默认转换为JSON格式数据进行响应
     */
    @RequestMapping("json")
    @ResponseBody
    public Student json(@RequestBody Student student) {
        // 打印接收的JSON数据
        System.out.println(student);
        // 返回JSON格式的响应
        return student;
    }

}

Student.java

package springmvcdemo.pojo;

public class Student {
    private String username;
    private String password;
    private int age;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }
}

springmvc-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--使用扫描机制扫描控制器类,控制器类都在controller包及其子包下-->
    <context:component-scan base-package="springmvcdemo.controller"/>

    <!--配置静态资源,允许js文件夹下的所有文件可见-->
    <mvc:annotation-driven/>
    <mvc:resources mapping="/js/**" location="/WEB-INF/js/"/>

    <!--配置视图解析器-->
    <!--配置视图解析器成功后,RegisterController和LoginController控制器类的视图路径仅需提供register和login,视图解析器将会自动添加前缀和后缀-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--部署DispatcherServlet-->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--加载Spring MVC的配置文件,配置文件可以放在项目目录的任意位置,使用init-param元素加载配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!--配置文件的位置-->
            <param-value>/WEB-INF/config/springmvc-config/springmvc-servlet.xml</param-value>
        </init-param>
        <!--表示容器在启动时立即加载servlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <!--处理所有URL-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--避免中文乱码-->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

index.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加学生</title>
    <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script>
</head>
<body>
<form action="#">
    姓名:<input type="text" name="username" id="username"><br>
    密码:<input type="password" name="password" id="password"><br>
    年龄:<input type="text" name="age" id="age"><br>
    <input type="button" value="提交" onclick="submitForm()">
</form>
</body>
<script>
    <%--使用jQuery的Ajax提交JSON数据--%>
    function submitForm() {
        var username = $("#username").val();
        var password = $("#password").val();
        var age = $("#age").val();
        $.ajax({
            // 请求路径
            url: "/student/json",
            //请求类型
            type: "post",
            // 要发送的数据,转换成字符串格式
            data: JSON.stringify({
                username: username,
                password: password,
                age: age
            }),
            //定义发送请求的数据格式为JSON字符串
            contentType: "application/json;character:utf-8",
            // 定义回调相应的数据格式为JSON字符串
            dataType: "json",
            // 响应成功
            success: function (data) {
                if (data != null) {
                    alert("姓名:" + data.username + ";密码:" + data.password + ";年龄:" + data.age);
                }
            }
        });
    }
</script>
</html>

运行效果如下:

控制台输出:

 

如果对完整源码有兴趣。

可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。

注意:在公众号后台回复【CSDN201911161135】可获取本节源码。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值