15、Spring MVC 数据绑定(基本数据类型、包装类、数组、List、Map、JSON)

Spring MVC 数据绑定

数据绑定:在后端的业务方法中直接获取客户端 HTTP 请求中的参数,将请求参数映射到业务方法的形参中, Spring MVC 中数据绑定的工作是由 HandlerAdapter 来完成的。

  • 基本数据类型
package org.westos.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author lwj
 * @date 2020/12/19 16:44
 */
@Controller
@RequestMapping("/data")
public class DataBindHandler {
    @ResponseBody
    @RequestMapping("/baseType")
    public String baseType(int id) {
        return id + "";
    }
}

@ResponseBody:表示 Spring MVC 会直接将业务方法的返回值响应给客户端,如果不加 @ResponseBody 注解,Spring MVC 会将业务方法的返回值传递给 DispatcherServlet,再由 DispatcherServlet 调用 ViewResolver 对返回值进行解析,映射到一个 JSP 资源。

http://localhost:8080/data/baseType?id=1

缺陷:基本数据类型不能接收Null值。

  • 包装类
@ResponseBody
@RequestMapping("/packageType")
public String packageType(@RequestParam(value = "num", required = false, defaultValue = "0") Integer id) {
    return id + "";
}

包装类可以接收 null ,当 HTTP 请求没有参数时,使用包装类定义形参的数据类型,程序不会抛出异常。(响应客户端null)

@RequestParam

value = “num”:将 HTTP 请求中名为 num 的参数赋给形参 id。

required:设置 num 是否为必填项,true 表示必填,false 表示非必填,可省略。

defaultValue = “0”:如果 HTTP 请求中没有 num 参数,默认值为0。

http://localhost:8080/data/packageType

客户端显示0。

http://localhost:8080/data/packageType?num=10

客户端显示10。

  • 数组
@RestController
@RequestMapping("/data")
public class DataBindHandler {
    @RequestMapping("/array")
    public String array(String[] num) {
        String str = Arrays.toString(num);
        return str;
    }
}

@RestController 表示该控制器会直接将业务方法的返回值响应给客户端,不进行视图解析。

@Controller 表示该控制器的每一个业务方法的返回值都会交给视图解析器进行解析,如果只需要将数据响应给客户端,而不需要进行视图解析,则需要在对应的业务方法定义处添加 @ResponseBody 。

http://localhost:8080/data/array?num=1&num=2&num=3

等同于

@Controller
@RequestMapping("/data")
public class DataBindHandler {
    @RequestMapping("/array")
    @ResponseBody
    public String array(String[] num) {
        String str = Arrays.toString(num);
        return str;
    }
}
  • List

Spring MVC 不支持 List 类型的直接转换,需要对 List 集合进行包装。

集合封装类

@Data
public class UserList {
    private List<User> users;
}

JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/data/list" method="post">
        用户1编号:<input type="text" name="users[0].id">
        姓名:<input type="text" name="users[0].name">
        地址:<input type="text" name="users[0].address.value"> <br>
        用户2编号:<input type="text" name="users[1].id">
        姓名:<input type="text" name="users[1].name">
        地址:<input type="text" name="users[1].address.value"> <br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

业务方法

@RestController
@RequestMapping("/data")
public class DataBindHandler {
    @RequestMapping("/list")
    public String list(UserList userList) {
        StringBuilder str = new StringBuilder();
        for (User user : userList.getUsers()) {
            System.out.println(user);
            str.append(user);
        }
        return str.toString();
    }
}

此时从前台到后台的数据绑定是没有问题的。但是从后台向前台传递时出现了中文乱码问题。

处理 @ResponseBody 的中文乱码,在 springmvc.xml 中配置消息转换器。

<mvc:annotation-driven>
    <!--在注解驱动中配置消息转换器-->
    <mvc:message-converters register-defaults="true">
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="supportedMediaTypes" value="text/html;charset=utf-8"/>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
  • Map

自定义封装类

@Data
public class UserMap {
    private Map<String, User> users;
}

业务方法

@RestController
@RequestMapping("/data")
public class DataBindHandler {
    @RequestMapping("/map")
    public String map(UserMap userMap) {
        StringBuilder str = new StringBuilder();
        for (String s : userMap.getUsers().keySet()) {
            User user = userMap.getUsers().get(s);
            str.append(user);
        }
        return str.toString();
    }
}

JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/data/map" method="post">
        用户1编号:<input type="text" name="users['ab'].id">
        姓名:<input type="text" name="users['ab'].name">
        地址:<input type="text" name="users['ab'].address.value"> <br>
        用户2编号:<input type="text" name="users['ba'].id">
        姓名:<input type="text" name="users['ba'].name">
        地址:<input type="text" name="users['ba'].address.value"> <br>
        <input type="submit" value="提交">
    </form>
</body>
</html>
  • JSON

客户端发送 JSON 格式的数据,直接通过 Spring MVC 绑定到业务方法的形参中。

处理 Spring MVC 无法加载静态资源,在 web.xml 中添加配置即可。

在这里插入图片描述

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>

JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <script src="js/jquery-3.5.1.min.js"></script>
    <script>
        $(function () {
            let user = {
                id: 1,
                name: "张三"
            }
            $.ajax({
                url: "/data/json",
                data: JSON.stringify(user),
                method: "POST",
                contentType: "application/json;charset=UTF-8",
                dataType: "JSON",
                success: function (data) {
                    alert(data.id + "---" + data.name);
                }
            })
        });
    </script>
</body>
</html>

上面代码中最重要的是contentType属性。

业务方法

@RestController
@RequestMapping("/data")
public class DataBindHandler {
    @RequestMapping("/json")
    public User user(@RequestBody User user) {
        System.out.println(user);
        user.setId(2);
        user.setName("李四");
        return user;
    }
}

Spring MVC 中的 JSON 和 JavaBean 的转换需要借助于 fastjson,po.xml中引入相关依赖。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.73</version>
</dependency>

springmvc.xml 添加 fastjson 配置。

<mvc:annotation-driven>
    <!--在注解驱动中配置消息转换器-->
    <mvc:message-converters register-defaults="true">
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="supportedMediaTypes" value="text/html;charset=utf-8"/>
        </bean>
        <!--配置fastjson-->
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>

热门文章

暂无图片
编程学习 ·

vscode自定义vue模板

创建一个用户代码片段 在创建的模板中输入 {"Print to console": {"prefix": "vue","body": ["<template>"," <div>"," "," </div>","</template>&…
暂无图片
编程学习 ·

SpringCloud之服务配置中心

转载请标明出处&#xff1a;https://blog.csdn.net/men_ma/article/details/106847165. 本文出自 不怕报错 就怕不报错的小猿猿 的博客 Docker入门之Docker安装镜像和容器的相关命令操作目标1.SpringCloud Config简介2.Config Server基本使用目标 1、SpringCloud Config简介 2…
暂无图片
编程学习 ·

2020年前端面试题

1、HTML5的新特性&#xff08;转自&#xff1a;https://www.cnblogs.com/vicky1018/p/7705223.html&#xff09; 为了更好地处理今天的互联网应用&#xff0c;HTML5添加了很多新元素及功能&#xff0c;比如: 图形的绘制&#xff0c;多媒体内容&#xff0c;更好的页面结构&…
暂无图片
编程学习 ·

【Lintcode】1218. Number Complement

题目地址&#xff1a; https://www.lintcode.com/problem/number-complement/description 给定一个正整数xxx&#xff0c;输出其补数。补数定义是将xxx的二进制表示位按位翻转所得之数&#xff08;该二进制表示不应该含前导000&#xff0c;除非它自己是000&#xff09;。 可…
暂无图片
编程学习 ·

HOME%分号导致环境变量无效-以javac为例(第N个小插曲)

今天使用javac命令突然报错&#xff1a; E:\test>javac ‘javac’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 这个错误常比较见&#xff0c;一般是jdk安装和环境变量是否设置的问题&#xff0c;多篇文章和问答已经提供了解决方法。 但是我的问题不是…
暂无图片
编程学习 ·

@Value DI注入 的几种使用方法

//1.直接赋值Value("normal")private String normal;//使用时值为"normal"//2.注入操作系统Value("#{systemProperties[os.name]}")private String osName;//3.注入表达式结果Value("#{ T(java.long.Math).random()*100.0 }")private …
暂无图片
编程学习 ·

【git】加入github项目教程

【下载git】 git是管理github的工具&#xff0c;上面也有提到&#xff0c;在git官网上下载最新版git即可&#xff0c;安装也很简单。 【新建本地库】 在自己的电脑上&#xff0c;选定或者新建一个文件夹作为该项目的本地版本库位置&#xff0c;比如说我想将项目test放在桌面。…
暂无图片
编程学习 ·

2021年煤矿井下电气考试题库及煤矿井下电气模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2021年煤矿井下电气考试题库及煤矿井下电气模拟试题&#xff0c;包含煤矿井下电气考试题库答案和解析及煤矿井下电气模拟试题练习。由安全生产模拟考试一点通公众号结合国家煤矿井下电气考试最新大纲及煤矿井下电气考…
暂无图片
编程学习 ·

2020-12-17

基于51单片机交通灯&#xff08;汇编语言&#xff09; 设计要求&#xff1a; 设计交通灯控制系统。模拟交通信号灯控制&#xff1a;一般情况下正常显示&#xff0c;东西-南北交替放行&#xff0c;各方向通行时间为30秒。有救护车或警车到达时&#xff0c;两个方向交通信号灯全…
暂无图片
编程学习 ·

Python面向对象 (4)

Python面向对象 私有权限 面向对象三大特性&#xff1a;封装、继承、多态 封装的意义 1,将属性和方法放到一起做为一个整体&#xff0c;然后通过实例化对象来处理&#xff1b;2,隐藏内部实现细节&#xff0c;只需要和对象及其属性和方法交互就可以了&#xff1b;3,对类的属…
暂无图片
编程学习 ·

oracle自动启动脚本

oracle自动启动脚本 /etc/oratab介绍 系统版本&#xff1a;CentOS release 6.8 (Final) 数据库版本&#xff1a;Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production 核心文件&#xff1a;/etc/oratab 注&#xff1a;如果相应目录下没有该文件…
暂无图片
编程学习 ·

大数据容器化-基于Kubernetes(k8s)构建spark运行环境

Apache Spark 在大数据处理与分析领域&#xff0c;Apache Spark无疑占据着重要地位。它的特点是基于内存计算&#xff0c;支持各类资源管理平台&#xff0c;其中以YARN最为常见&#xff0c;同时又与Hadoop平台集成&#xff0c;在集群节点以HDFS作为分布式文件存储系统。 我们…
暂无图片
编程学习 ·

Android 使用 Lottie 库简单快速地实现漂亮的动画

Android 使用 Lottie 库简单快速地实现漂亮的动画 安卓实现动画的方式有很多种&#xff0c;Lottie 库提供了更加简便的方法&#xff0c;资源也更加轻量&#xff0c;很多动画资源就 KB&#xff0c;因为多是 Json 文件。 Lottie 是 Airbnb 开发的一款能够为原生应用添加动画效果…
暂无图片
编程学习 ·

HashMap集合遍历的五种方式

文章目录创建HashMap集合&#xff0c;添加数据一、第一种foreach遍历二、第二种foreach遍历三、第一种迭代器遍历 效率高&#xff08;建议使用&#xff09;四、第二种迭代器遍历 效率低&#xff08;不建议使用&#xff09;五、JDK8新特性&#xff0c;通过lambda遍历Map创建Hash…
暂无图片
编程学习 ·

java Proxy示例

JDK的动态代理 Proxy public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throws IllegalArgumentException{***************}首先jdk的动态代理&#xff0c;需要传入三个参数(ClassLoader loader, Class<?>[…
暂无图片
编程学习 ·

SolarWinds 供应链攻击通告

报告编号&#xff1a;B6-2020-121403 报告来源&#xff1a;360CERT 报告作者&#xff1a;360CERT 更新日期&#xff1a;2020-12-14 0x01 漏洞简述 2020年12月14日&#xff0c;360CERT监测发现 FireEye 发布了 SolarWinds 供应链攻击通告 的分析报告&#xff0c;事件等级&a…