目录
[1. 传递对象](#1. 传递对象)
[2. 后端参数重命名(后端参数映射)](#2. 后端参数重命名(后端参数映射))
[3. 传递数组](#3. 传递数组)
[4. 传递集合](#4. 传递集合)
[5. 传递JSON数据](#5. 传递JSON数据)
[5.1 JSON概念](#5.1 JSON概念)
[5.2 JSON语法](#5.2 JSON语法)
[5.3 JSON字符串和Java对象互转](#5.3 JSON字符串和Java对象互转)
[5.4 JSON优点](#5.4 JSON优点)
[5.5 传递JSON对象](#5.5 传递JSON对象)
[6. 获取URL中参数@PathVariable](#6. 获取URL中参数@PathVariable)
[7. 上传文件@RequestPart](#7. 上传文件@RequestPart)

1. 传递对象
如果参数⽐较多时, ⽅法声明就需要有很多形参. 并且后续每次新增⼀个参数, 也需要修改⽅法声明.
我们不妨把这些参数封装为⼀个对象.
Spring MVC 可以⾃动实现对象参数的赋值,比如 Person 对象:

【注意】
此处的 @Data 注解的作用是构造对象每个参数的 get/set 方法,以及重写 toString 方法。
要使用 @Data 注解,需要先导入 lombok 依赖。

请求传入对象数据:
服务端代码:

客户端传入数据:

响应结果(toString):
【结论】
Spring 会根据参数名称自动绑定到对象的各个属性上, 如果某个属性未传递, 则赋值为null(基本类型则赋值为默认初识值, ⽐如int类型的属性, 会被赋值为0 。
2. 后端参数重命名(后端参数映射)
某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致 ,⽐如前端传递了⼀个 time 给后端,⽽后端是使⽤ createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值.
例如:

传入数据与响应结果:

此处 @RequestParam的含义是:
用 "t" 接收请求发送的数据,然后将 "t" 的值再赋值给 **"createTime"**这个参数
默认情况下,如果参数没有接收到数据,会继续返回空值:


但是加上了 @RequestParam 注解,该参数就会默认变成 必传参数 :

此时如果该参数没有接收到值,就会报错,因为它是一个 必传参数。
可以得出结论:
1. 使用 @RequestParam 进⾏参数重命名时, 请求参数只能和 @RequestParam 声明的名称⼀
致, 才能进⾏参数绑定和赋值.
2. 使用 @RequestParam 进⾏参数重命名时, 参数就变成了必传参数.
实际上,也可以将该参数设置为 非必传参数
只需要在 @RequestParam 内的 "required"参数的值设置为 false 即可:

此时该参数没有接收到参数,不会报错,而是直接为空值:
【注意】
可以看到, 添加required=false之后, time前⾯也加了key, 变成了 value = "time"
注解属性赋值时, 没有指明key的话, 默认为value属性.
如果需要有多个属性进⾏赋值时, 需要写上key
3. 传递数组
Spring MVC 可以⾃动绑定数组参数的赋值
后端实现代码:
向数组传入数据:1,2,3,4。响应结果:

调用toString方法,打印数组:

响应结果:

除了上述方式,还可以用逗号隔开的方式向数组传入数据:

响应结果是一样的:

4. 传递集合
默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,要使⽤
@RequestParam 绑定参数关系
后端接收代码:

传入数据,响应结果:

集合也支持使用逗号隔开的方式传入数据:

如果后端没有在参数前加入 @RequestParam就会报错:


5. 传递JSON数据
5.1 JSON概念
JSON:JavaScript Object Notation 【JavaScript 对象表⽰法】
JSON是⼀种轻量级的数据交互格式. 它基于 ECMAScript (欧洲计算机协会制定的js规范)的⼀个⼦集,采⽤完全独⽴于编程语⾔的⽂本格式来存储和表⽰数据。--百度百科
简单来说:JSON就是⼀种数据格式, 有⾃⼰的格式和语法, 使⽤⽂本表⽰⼀个对象或数组的信息, 因此JSON本质是字符串. 主要负责在不同的语⾔中数据传递和交换.
5.2 JSON语法
JSON 是⼀个字符串,其格式⾮常类似于 JavaScript 对象字⾯量的格式
这是一段JSON数据:
{
"squadName" : "Super hero squad" ,
"homeTown" : "Metro City" ,
"formed" : 2016 ,
"secretBase" : "Super tower" ,
"active" : true ,
"members" : [{
"name" : "Molecule Man" ,
"age" : 29 ,
"secretIdentity" : "Dan Jukes" ,
"powers" : [ "Radiation resistance" , "Turning tiny" , "Radiation
blast" ]
}, {
"name" : "Madame Uppercut" ,
"age" : 39 ,
"secretIdentity" : "Jane Wilson" ,
"powers" : [ "Million tonne punch" , "Damage resistance" , "Superhuman
reflexes" ]
}, {
"name" : "Eternal Flame" ,
"age" : 1000000 ,
"secretIdentity" : "Unknown" ,
"powers" : [ "Immortality" , "Heat Immunity" , "Inferno" ,
"Teleportation" , "Interdimensional travel" ]
}]
}
也可以压缩表⽰:
{ "squadName" : "Super hero squad" , "homeTown" : "Metro
City" , "formed" : 2016 , "secretBase" : "Super tower" , "active" : true , "members" :
[{ "name" : "Molecule Man" , "age" : 29 , "secretIdentity" : "Dan Jukes" , "powers" :
[ "Radiation resistance" , "Turning tiny" , "Radiation blast" ]},{ "name" : "Madame
Uppercut" , "age" : 39 , "secretIdentity" : "Jane Wilson" , "powers" :[ "Million tonne
punch" , "Damage resistance" , "Superhuman reflexes" ]},{ "name" : "Eternal
Flame" , "age" : 1000000 , "secretIdentity" : "Unknown" , "powers" :[ "Immortality" , "Heat
Immunity" , "Inferno" , "Teleportation" , "Interdimensional travel" ]}]}
第二种和第一种描述的数据⼀样, 只不过第一种进行了格式化, 更易读
JSON的语法:
- 数据在 键值对 (Key/Value) 中
- 数据由逗号 , 分隔
- 对象⽤ {} 表⽰
- 数组⽤ [] 表⽰
- 值可以为对象, 也可以为数组, 数组中可以包含多个对象
JSON的两种结构
- 对象: ⼤括号 {} 保存的对象是⼀个⽆序的 键值对 集合. ⼀个对象以左括号 { 开始, 右括号 }
结束。每个"键"后跟⼀个冒号 : ,键值对使⽤逗号 , 分隔 - 数组: 中括号 [] 保存的数组是值(value)的有序集合. ⼀个数组以左中括号 [ 开始, 右中括
号 ] 结束,值之间使⽤逗号 , 分隔。
5.3 JSON字符串和Java对象互转
JSON本质上是⼀个字符串, 通过⽂本来存储和描述数据
Spring MVC框架也集成了JSON的转换⼯具, 我们可以直接使⽤, 来完成JSON字符串和Java对象的互转
本质上是 jackson-databind 提供的功能, Spring MVC框架中已经把该⼯具包引⼊了进来, 咱们直接使⽤即可, 如果脱离Spring MVC使⽤, 需要引⼊相关依赖:
< dependency >
< groupId >com.fasterxml.jackson.core</ groupId >
< artifactId >jackson-databind</ artifactId >
< version >2.13.5</ version >
</ dependency >
示例:使用 jackson-databind 将对象转化成JSON,将JSON转化成对象
运行结果:
【结论】
使⽤ObjectMapper 对象提供的两个⽅法, 可以完成对象和JSON字符串的互转
writeValueAsString: 把对象转为JSON字符串
readValue: 把字符串转为对象
5.4 JSON优点
- 简单易⽤: 语法简单,易于理解和编写,可以快速地进⾏数据交换
- 跨平台⽀持: JSON可以被多种编程语⾔解析和⽣成, 可以在不同的平台和语⾔之间进⾏数据交换和传输
- 轻量级: 相较于XML格式, JSON数据格式更加轻量级, 传输数据时占⽤带宽较⼩, 可以提⾼数据传输速度
- 易于扩展: JSON的数据结构灵活,⽀持嵌套对象和数组等复杂的数据结构,便于扩展和使⽤
- 安全性: JSON数据格式是⼀种纯⽂本格式,不包含可执⾏代码, 不会执⾏恶意代码,因此具有较⾼的安全性
基于以上特点, JSON在Web应⽤程序中被⼴泛使⽤, 如前后端数据交互、API接⼝数据传输等
5.5 传递JSON对象
接收JSON对象, 需要使⽤@RequestBody 注解
RequestBody: 请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正文中
后端实现:

使用postman发送请求,以及响应:

通过Fiddler抓包,观察参数:

6. 获取URL中参数@PathVariable
@PathVariable 这个注解主要作⽤在请求URL路径上的数据绑定
默认传递参数写在URL上,SpringMVC就可以获取到
后端实现代码:
用postman发送请求,以及响应结果:

@PathVariable 也可以实现"重命名"的效果:

原理与上述 @RequestParam相同
【注意】
如果⽅法参数名称和需要绑定的URL中的变量名称⼀致时, 可以简写, 不⽤给@PathVariable的属性赋值, 如上述例⼦中的id变量
如果⽅法参数名称和需要绑定的URL中的变量名称不⼀致时, 需要@PathVariable的属性value赋值,
如上述例⼦中的userName变量
7. 上传文件@RequestPart
使用 @RequestPart注解可以实现上传一个文件到本地,例如一个图片。
后端代码实现:
使用postman发送请求,以及结果:

文件成功上传到磁盘路径D:/temp/Cirno.jpg :

完
如果哪里有疑问的话欢迎来评论区指出和讨论,如果觉得文章有价值的话就请给我点个关注还有免费的收藏和赞吧,谢谢大家!
