SpringMVC (3)

目录

[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的语法:

  1. 数据在 键值对 (Key/Value) 中
  2. 数据由逗号 , 分隔
  3. 对象⽤ {} 表⽰
  4. 数组⽤ [] 表⽰
  5. 值可以为对象, 也可以为数组, 数组中可以包含多个对象

JSON的两种结构

  1. 对象: ⼤括号 {} 保存的对象是⼀个⽆序的 键值对 集合. ⼀个对象以左括号 { 开始, 右括号 }
    结束。每个"键"后跟⼀个冒号 : ,键值对使⽤逗号 , 分隔
  2. 数组: 中括号 [] 保存的数组是值(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优点

  1. 简单易⽤: 语法简单,易于理解和编写,可以快速地进⾏数据交换
  2. 跨平台⽀持: JSON可以被多种编程语⾔解析和⽣成, 可以在不同的平台和语⾔之间进⾏数据交换和传输
  3. 轻量级: 相较于XML格式, JSON数据格式更加轻量级, 传输数据时占⽤带宽较⼩, 可以提⾼数据传输速度
  4. 易于扩展: JSON的数据结构灵活,⽀持嵌套对象和数组等复杂的数据结构,便于扩展和使⽤
  5. 安全性: 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 :


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

相关推荐
web1478621072328 分钟前
【Spring IoC】容器和IoC介绍以及IoC程序开发的优势
java·后端·spring
m0_7482482329 分钟前
Spring Boot 实战篇(四):实现用户登录与注册功能
java·spring boot·后端
要好好养胃30 分钟前
1-3压缩命令
linux·服务器·数据库
qq_3129201130 分钟前
jenkins使用不同用户管理不同工程
运维·jenkins
点点滴滴的记录34 分钟前
算法之排序算法
java·算法·排序算法
渗透测试老鸟-九青1 小时前
基于Electron的应用程序安全测试基础 — 提取和分析.asar文件的案例研究
网络·数据仓库·hive·hadoop·安全·网络安全·漏洞
老皇甫1 小时前
JDBC的救赎之道——MyBatis(静态SQL)
java·sql·mybatis
Czi橙1 小时前
MySQL当中的Lock
java·数据库·mysql·面试
风123456789~1 小时前
【Linux &&Oracle】time命令+oracle exp压缩
linux·运维·oracle
Pro_er1 小时前
Spring Boot 3.0深度实战:从核心特性到生产级调优
java