Spring【Again】——复杂POJO的绑定

简单介绍:

Again系列是将之前的内容我认为做的不好的地方或者是理解不到位的地方再来一次,加深记忆或者改错。我们就在来复习一下之前我们说过的复杂类型的数据绑定。

先来复习一下简单数据绑定:

简单数据绑定就是我们在传递参数的时候,传递的参数数量很少,数据类型单一,基本就是一两个的基本数据类型的时候才会用到,我们举个例子:

做一个简单的案例,首先我们创建一个空的项目,然后通过发送一个带有参数的请求,然后在Controller中接受这个参数的案例来介绍简单的数据绑定需要做什么:

创建一个Controller:

package com.Spring.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/users")
public class UserController {
    @GetMapping
    public String select(String username){
        System.out.println(username);
        return username;
    }
}

这是一个接受请求参数的Controller,参数名叫做username,类型是String。当请求成功之后会将请求中的参数返回到请求端,并且在控制台上打印。

然后我们发送一个请求:

 我们的请求参数是张三,那么我们看到返回的值肯定也是张三,并且在控制台打印的就是张三,简单的数据绑定的格式和方式都很简单。

这种简单的方式适用于参数很少,一般也就一两个,并且类型简单的数据。如果是多个数据,我们一般会将它绑定到Java类上,这种方式叫做POJO绑定:

POJO绑定:

我们先创建一个封装数据的POJO类:

package com.Spring.pojo;

import lombok.Data;

@Data
public class user {
    private String name;
    private String password;
}

然后是发送请求的Controller 

//    POJO绑定
    @GetMapping("/ByUser")
    public String selectUser(user user){
        System.out.println(user.toString());
        return user.toString();
    }

我接下来写的所有的controller都会只写方法体,如果想要自己验证,可以随便粘贴放在类中,然后通过映射路径访问即可。

然后我们请求一下POJO绑定的路径:

这里还是注意一下我们请求的时候的参数,参数名要和类中的属性名一样才能被接受,如果参数名和属性名不一样,需要通过属性进行指定,否则无法自动接收。

核心思想: 

其实在一开始的时候,我们就要对这个参数有一个明确的认知,这个参数是什么,多个参数之间的关系是什么。对于前端浏览器来说,多个参数时间是松散的,可以是没有关系的,可以是单一的,对于前端来说,这个参数的格式对他们来说并不重要,只需要输入参数,然后发送到后端的controller就可以了,那么后端如何处理这个参数是我们要关心的事情,比如这个参数是什么类型,参数名是什么,参数要如何封装。

在现阶段,我们用来接收参数的对象,也就是这个东西:

这个方法中的参数user,我们就可以暂时先不把他理解成一个对象,理解成一个盒子,一个用来存放多个属性值的盒子,这个属性名和前端保持一致就可以了,这就是一个盒子,放了很多的数据,或者说多个数据存放到了一个盒子里面,为什么这个盒子是Java类,因为我们用的是Java做后端语言,操作Java类肯定是更方便一些。如果用别的语言肯定就是其他格式的盒子。 

带着这种想法,我们剩下的就是怎么往盒子里面放数据了,其实格式非常的简单,因为我们现在学的前端的那些表单控件无法做到一次传递多个数据,也就是一个input标签只能传递一个数据,那么我们在传递的时候就可以通过精确定位某一个数据的形式,可丁可卯的把数据放到盒子里。

复杂数据类型绑定——数组:

数组类型的绑定适用于多个属性名相同,但是属性值不相同的,比如我们在使用多选功能的时候,我们一次性选择了多个,我们又想把多个数据存储在一起,那么就需要后台绑定的时候,将前端传递进来的数据绑定成数组,基本步骤如下:

1、定义一个前端表单,向后端传递多个参数名一样但是参数值不一样的数据。使用我们的多选框是最适合不过的了:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<form action="http://localhost:8080/users/ByList" method="post">
    <table>
        <tr>
            <th>选择</th> <th>学科</th>
        </tr>
        <tr>
            <th><input type="checkbox" name="args" value="1"></th> <th>数学</th>
        </tr>
        <tr>
            <th><input type="checkbox" name="args" value="2"></th> <th>语文</th>
        </tr>
        <tr>
            <th><input type="checkbox" name="args" value="3"></th> <th>英语</th>
        </tr>
        <tr>
            <td><input type="submit" value="提交"></td>
        </tr>
    </table>
</form>
</body>
</html>

然后就是一个简单的只有一个复选框的表单,我们需要注意三个地方,第一个就是表单的提交路径,这个路径对应我们controller的映射地址,这个地址写错了你后面的controller铁定是接收不到数据。第二个就是表单的name,这个值对应我们controller中的方法的形参的变量名。最后就是value,这个值就是我们选中后将要填充进数组中的值,最后我们选中了几,就会看到他输出的是几,然后我们就来看后台的controller是如何写的:

//    List数组绑定
    @PostMapping("/ByList")
    public Integer[] selectList(Integer [] args){
        System.out.println(Arrays.toString(args));
        return args;
    }

其实跟之前一样的,只不过注意这个地方方法的形参的参数要和前端的表单中的input标签中的name的属性值保持一致,然后因为我们的表单提交是使用post方式,所以方法使用@PostMapping注解标注。

然后我们先启动程序,然后提交标签:

我们先全选,然后提交:

最后一行已经显示了我们选择的value值,然后我们少选一个:

按照我们的猜想,这次输出的数组中不会存在2:

 合理,跟我们的猜想是一样,说明我们之前做的对的。

 图示看起来非常的简单,在实际操作的时候也确实是很简单,毕竟数组就是一个可变的盒子,多一个少一个都无所谓,甚至没有都可以。

泛型为基本数据类型的绑定和之前的数组的绑定的格式是基本差不多的,唯一的区别就是在controller上作为参数接收的时候,需要加上一个@RequestParam,否则会导致一个报错,待会我们会演示这个报错并说明一下这个报错是如何形成的。

先给看一下后台的controller是如何写的,前端的页面是没有发生改变的,然后我们启动程序,向这个controller中发送一些参数:

 

我们选择跟之前一样的表单数据,然后观察他的返回值:

跟之前是一样的,也就是说格式不变,只不过参数的类型改变,以及添加了一个注释,那么这个注释如果不加会怎么样的?

 

现在我们删除这个注释,然后重启服务器,再次发送请求:

 在控制台爆出了这么一个错误,这个错误的意思是找不到接口java.util.List的主构造函数或单个唯一构造函数,找不到构造函数,那么他是想干什么才会用到这个构造函数呢?他想创建一个List对象,但是接口不能直接创建对象,所以我们要用这个注解表示我们创建的其实不是List的集合,而是将我们接受到的参数作为一组数据存储到集合中,这个注解的作用就是指明我们传递进来的数据是要以何种类型存储。

复杂POJO绑定:

还记得之前我们说过的,对于数据绑定来说,我们的对象就是一个盒子,那么既然他是一个盒子,那么盒子就可以套盒子,那么有趣的地方就来了。所谓的复杂POJO是和简单POJO对比来的,简单POJO的属性都是简单数据类型,String虽然是对象,但是此处也暂时当简单数据类型。那么复杂POJO的属性可以是对象,可以是数组,可以是集合,可以是Map,可以是集合里面套数组,可以是集合里面套对象,可以是集合里面套对象套数组,可以是……

简单来说,复杂POJO的复杂就体现在我们现在的盒子不是打开就能看见数据了,是打开之后是盒子,盒子再打开才是数据,甚至盒子打开之后还是盒子,盒子打开之后开始盒子,然后才是数据,那就自己玩去吧。

我们就说集中常见的:

POJO属性是对象的情况:

我们先学思想,然后看图,最后看代码实现,如果能不看到代码就做出来,那就是学会了:

现在有一个类叫做A,然后A里面包含一个属性,这个属性是一个对象,叫做B,就像这样:

 这是可以的吧,我的属性是一个对象,然后这个对象有自己的属性,那么我们怎么访问这个属性呢?

调用呗~回归到最基础的Java语法了,怎么调用啊?

A.B.name呗,是不是?如果忘记了我们就用代码写一写:

 

 这是B他的属性都用基本数据类型,然后我们创建A:

为了做对比,我们在A里面除了B属性之外,再添加一个简单数据类型的属性,然后我怎么通过A获取B里面的数据啊?直接调用方法就行了:

我可以这么写吧,如果这里不理解,建议回去复习一下Java的语法,为什么要说到这个呢,因为前段传入数据的方式也是这么来的,只不过我们这里是调用方法,getB啊,getName啊,前端更方便,直接调用属性就行了:

注意看input标签的name属性,就直接用你要绑定的类的属性去调用就可以了,比如我的b属性是一个对象,b对象中包含name属性和age属性,那么就直接写“b.name”就可以将数据绑定到B属性的name属性上,然后我们看返回值:

 

是不是跟我们写的一样,id是普通数据类型, b是复杂数据类型,也就是对象,然后输出的格式就像上面是一样的。然后来看我们controller是怎么写的。

 

还有一个重要的地方就是,我们所有的数据绑定的这些写法,都是写在前端的,对我们的后端来说,Java类就是Java类,我们直接拿来用就可以了,这就是为什么我要用数据绑定的方式将数据放在盒子里,因为我们的Java操作盒子非常的简单。 

 其他方式:

其实道理都是一样的,其他的无非就是属性是LIst还是属性是Map,我把这两个的图画出来,然后简单的说一下,但是代码就不写了,如果看完之后还是不会写的,评论或者私信我,我单独发给你。

属性为List的,List的泛型是对象类型的:

通过数组的下标定位到集合中的元素,然后通过集合的元素调用对象的属性

 属性为Map类型,Map值的泛型是B类型:

Map类型通过键查找对应的值,所以在插入的时候通知键查找到最对应的值,然后值包含多个属性,通过值找到对应的属性,完成赋值

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/20990.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

玩转ChatGPT:快速制作PPT

一、写在前面 首先还是让小Chat推销下自己&#xff1a; 你是否曾经为制作 PPT 而烦恼&#xff1f;现在有了 ChatGPT&#xff0c;再也不必担心灵感枯竭啦&#xff01;使用 ChatGPT 撰写 PPT 可以让你轻松地组织思路、快速得到内容&#xff0c;无需任何营销口号&#xff0c;Cha…

C++模板类与继承

目录 分类 一、模板类不继承 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;分析 &#xff08;3&#xff09;运行结果 二、模板类继承普通类 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;分析 &#xff08;3&#xff09;运行结果 三、普通类继…

Win11校园网不弹出登录页面怎么回事?

Win11校园网不弹出登录页面怎么回事&#xff1f;最近有用户在使用校园网的时候遇到了一些问题&#xff0c;访问登录网站的时候&#xff0c;一直无法显示登录的界面。那么遇到这个情况如何去进行解决呢&#xff1f;一起来看看以下的解决方法分享吧。 解决方法如下&#xff1a; 方…

nodejs处理xlsx文件生成json文件

nodejs处理xlsx文件有好几种方式&#xff0c;这里用的是js-xlsx库&#xff1b; 需求 有一个 xlsx 的文件&#xff0c;里面有几个不同的 sheet&#xff0c;需要读取这个表格中不同 sheet 的数据&#xff0c;并且为每个 sheet 生成对应的 json 文件。 例如有一个名为 template…

文本三剑客之——Awk

Awk Awk简介Awk语法格式Awk常见内置变量Awk实例演示按行输出文本BEGIN模式和END模式按字段输出文本通过管道&#xff0c;双引号调用shell命令date 的用法getline的用法awk数组 Awk简介 Awk是一个功能强大的编辑工具&#xff0c;用于在Linux/UNIX 下对文本和数据进行处理。数据…

ChatGPT vs. Bing vs. Bard

随着 2022 年 ChatGTP 的推出&#xff0c;人工智能聊天机器人的世界突然走上了一条新道路。如今&#xff0c;密切关注 AI 的人都知道&#xff0c;不同公司推出了几款产品。从谷歌拥有自己的 Bard AI&#xff0c;到微软发布新的 Bing AI Chat&#xff0c;再到 OpenAI 发布GPT-4。…

用gost实现远程端口映射

gost 是一个非常优秀的tunnel. 支持多种形式的端口映射。 本文只介绍远程端口映射方式的tunnel. 远程端口映射的意思就是&#xff0c;将本地端的某个服务的端口A&#xff08;tcp/udp&#xff09;映射到远程的某个端口P上&#xff0c; 用户通过访问远程的端口P来访问本地端的这…

生态碳汇涡度通量数据分析

生态碳汇涡度相关监测与通量数据分析 朱老师&#xff08;副教授&#xff09;&#xff1a;来自国内重点高校&#xff0c;长期从事涡度通量观测与分析研究&#xff0c;发表SCI论文多篇&#xff0c;主持国家与地方科研项目多个&#xff0c;在生态环境数据处理与分析中具有丰富的实…

Fourier分析入门——第3章——离散函数的Fourier分析

目录 第 3 章 离散函数的Fourier分析 3.1 引言 3.2 在1点采样的函数 3.3 在2点采样的函数 3.4 Fourier分析是一种线性变换 3.5 Fourier分析是一种基向量的变更 3.6 在3点采样的函数 3.7 在D点采样的函数 3.8 整理(tidying up) 3.9 Parseval[p:zeifa:l]定理 3.10 关联…

【LeetCode】203,移除链表元素。 难度等级:简单。链表入门题目,值得深入研究。

文章目录 一、题目二、解答&#xff1a;迭代法&#xff0c;引入一个新的头结点三、难点解释 【LeetCode】203&#xff0c;移除链表元素。 难度等级&#xff1a;简单。 本题是链表入门题目&#xff0c;值得深入研究。 一、题目 二、解答&#xff1a;迭代法&#xff0c;引入一个…

Spring实现IOC和DI入门案例(XML版)

文章目录 1 IOC入门案例(XML版)1.1 思路分析1.2 代码实现步骤1:创建Maven项目步骤2:添加Spring的依赖jar包步骤3:添加案例中需要的类步骤4:添加spring配置文件步骤5:在配置文件中完成bean的配置步骤6:获取IOC容器步骤7:从容器中获取对象进行方法调用步骤8:运行程序 2 DI入门案例…

【差分+操作】C. Helping the Nature

Problem - 1700C - Codeforces 题意&#xff1a; 思路&#xff1a; 一开始手玩了一下 如果不是高低高的形式&#xff0c;那么一定不能通过操作3把全部元素变成0 因此就是先把所有元素变成高低高的形式 但是低在什么地方不确定 因此考虑枚举中间低谷位置&#xff0c;O(1)计…

ShardingSphere-JDBC整合SpringBoot JPA读写分离失败

问题 最近在整合ShardingSphere JDBC和Spring Boot的时候遇到一个问题,当ORM框架使用JPA时,读写分离会失效,查询仍然走主库并不会走从库!同样的配置使用Mybatis就没有任何问题。 在查阅各种资料后,初步确定未JPA事务问题 ShardingSphere负载均衡算法 我当前使用的版本是…

【历史上的今天】4 月 23 日:YouTube 上传第一个视频;数字音频播放器的发明者出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 23 日&#xff0c;世界读书日。在 1564 年的这一天&#xff0c;全世界最卓越的文学家之一莎士比亚出生&#xff1b;1616 年的这一天&#xff0c;莎士比亚…

shell脚本5数组

文章目录 数组1 数组定义方法2 获取数组长度2.1 读取数组值2.2 数组切片2.3 数组替换2.4 数组删除2.5 追加数组元素 3 实验3.1 冒泡法3.2 直接选择法3.3 反排序法 数组 1 数组定义方法 数组名(value0 valuel value2 …) 数组名( [0]value [1]value [2]value …) 列表名“val…

现在的00后,实在是太卷了,我们这些老油条都想辞职了......

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪20K&#xff0c;都快要超过我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家…

真题详解(传引用)-软件设计(七十五)

真题详解&#xff08;补码转换&#xff09;-软件设计&#xff08;七十四)https://blog.csdn.net/ke1ying/article/details/130674214 分治算法技术设计______。 答案&#xff1a;1、问题划分 2、递归求解 3、合并解 虚拟存储体系_____两级构成。 解析&#xff1a;主存 和 辅…

linux环境安装使用tomcat详解

01-安装Tomcat # 0.下载tomcat http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.46/bin/apache-tomcat-8.5.46.tar.gz # 1.通过工具上传到Linux系统中 # 2.解压缩到/usr目录中 [rootlocalhost ~]# tar -zxvf apache-tomcat-8.5.46.tar.gz -C /usr/ -C 用来指…

【AI绘图 丨 Midjourney 系列教程二】— 初识超火的AI绘画神器Midjourney

今天起&#xff0c;由 Midjourney 打头阵&#xff0c;让我们开始共同探索一系列的 AI 领域革命性作品&#xff0c;包括 Midjourney、Stable Diffusion、ChatGPT 等等&#xff0c;学习这些新时代的魔法和它的咒语。 写在前面 官方文档是最好的入门课程。相较于市面上琳琅满目的…

《计算机网络—自顶向下方法》 Wireshark实验(七):以太网与ARP协议分析

1 以太网 1.1 介绍 以太网是现实世界中最普遍的一种计算机网络。以太网有两类&#xff1a;第一类是经典以太网&#xff0c;第二类是交换式以太网&#xff0c;使用了一种称为交换机的设备连接不同的计算机。 经典以太网&#xff1a;是以太网的原始形式&#xff0c;运行速度从 …