Spring Boot入门指南:轻松构建高效Spring应用(三)-CSDN博客
一.传递参数
7.传递数组
1.在IDEA中写出处理代码
2.打开postman
或者这样:key相同时,也会组成一个数组。
8. 传递集合
如果像数组传参一样传递集合,可能会报错。。。
打开日志:
原因:对于List接口来说,找不到参数或者构造函数。
意思是:以上这样传参是绑定给数组的,List没有绑定是拿不到参数的。
如何进行绑定呢?
使用注解@RequestParam进行绑定关系。
展示成功;
9.传递JSON数据
JSON就是⼀种数据格式,有⾃⼰的格式和语法,使⽤⽂本表⽰⼀个对象或数组的信息,因此JSON本质是字符串.主要负责在不同的语⾔中数据传递和交换。
类似于:
国际通⽤语⾔-英语
中国56个⺠族不同地区的通⽤语⾔-普通话有⾃⼰的语法,其他语⾔也认识.
JSON与Javascript的关系
没有关系,只是语法相似,js开发者能更快的上⼿⽽已,但是他的语法本⾝⽐较简单,所以也很好学
JSON语法
JSON是⼀个字符串,其格式⾮常类似于JavaScript对象字⾯量的格式。
也可以压缩表⽰:
和上⾯描述的数据⼀样,只不过上⾯的进⾏了格式化,更易读
JSON的语法:
所以,以下都是合法的JSON数据
可以使⽤在线JSON格式化⼯具来进⾏校验和书写:在线JSON校验格式化工具(Be JSON)
在IDEA中进行操作。
1.定义一个Person类
2.接收JSON对象
3.在Postman写入JSON
但是这里为什么返回为null呢?
打开Filddler。
我们传递一个参数对象进行对比一下
我们模拟form表单传递,这样参数就会显示在正文(body)部分
接收JSON对象,需要使⽤@RequestBody注解
RequestBody:
请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正⽂中。
大意是:接收JSON参数时,JSON参数传来的是在请求正文的一个整体对象,不用注解@RequestBody是无法接收到整个的,为什么使用对象或者其他参数就可以接收,因为字符串查询可以一个个参数接收(大概,自己理解的)。
10.JSON字符串和Java对象互转
JSON本质上是⼀个字符串,通过⽂本来存储和描述数据。
SpringMVC框架也集成了JSON的转换⼯具,我们可以直接使⽤,来完成JSON字符串和Java对象的互转,本质上是jackson-databind提供的功能,SpringMVC框架中已经把该⼯具包引⼊了进来,咱们直接使⽤即可,如果脱离SpringMVC使⽤,需要引⼊相关依赖。
JSON的转换⼯具包有很多,jackson-databind只是其中的⼀种.
使⽤ObjectMapper对象提供的两个⽅法,可以完成对象和JSON字符串的互转
writeValueAsString:把对象转为JSON字符串 。
readValue:把字符串转为对象
JSON优点
- 简单易⽤:语法简单,易于理解和编写,可以快速地进⾏数据交换
- 跨平台⽀持:JSON可以被多种编程语⾔解析和⽣成,可以在不同的平台和语⾔之间进⾏数据交换和传输
- 轻量级:相较于XML格式,JSON数据格式更加轻量级,传输数据时占⽤带宽较⼩,可以提⾼数据传输速度
- 易于扩展:JSON的数据结构灵活,⽀持嵌套对象和数组等复杂的数据结构,便于扩展和使⽤
- 安全性:JSON数据格式是⼀种纯⽂本格式,不包含可执⾏代码,不会执⾏恶意代码,因此具有较⾼的安全性
基于以上特点,JSON在Web应⽤程序中被⼴泛使⽤,如前后端数据交互、API接⼝数据传输等.
11.获取URL中参数
使用注解:@PathVariable
pathvariable:路径变量
和字⾯表达的意思⼀样,这个注解主要作⽤在请求URL路径上的数据绑定
默认传递参数写在URL上,SpringMVC就可以获取到。
可以看到,后端正确获取到了URL中的参数。
参数对应关系如下:
如果⽅法参数名称和需要绑定的URL中的变量名称⼀致时,可以简写,不⽤给@PathVariable的属性赋值,如上述例⼦中的id变量
如果⽅法参数名称和需要绑定的URL中的变量名称不⼀致时,需要@PathVariable的属性value赋值,如上述例⼦中的userName变量.
12.上传文件@RequestPart
使用Postman发送请求
12.获取cookie
回顾Cookie
HTTP协议⾃⾝是属于"⽆状态"协议.
"⽆状态"的含义指的是:默认情况下HTTP协议的客⼾端和服务器之间的这次通信,和下次通信之间没有直接的联系,但是实际开发中,我们很多时候是需要知道请求之间的关联关系的,例如登陆⽹站成功后,第⼆次访问的时候服务器就能知道该请求是否是已经登陆过了。
上述图中的"令牌"通常就存储在Cookie字段中.
⽐如去医院挂号
- 看病之前先挂号.挂号时候需要提供⾝份证号,同时得到了⼀张"就诊卡",这个就诊卡就相当于患者的"令牌".
- 后续去各个科室进⾏检查,诊断,开药等操作,都不必再出⽰⾝份证了,只要凭就诊卡即可识别出当前患者的⾝份.
- 看完病了之后,不想要就诊卡了,就可以注销这个卡.此时患者的⾝份和就诊卡的关联就销毁了.(类似于⽹站的注销操作)
- ⼜来看病,可以办⼀张新的就诊卡,此时就得到了⼀个新的"令牌"
此时在服务器这边就需要记录"令牌"信息,以及令牌对应的⽤⼾信息,这个就是Session机制所做的⼯作.
理解Session
我们先来了解⼀下什么是会话.会话:对话的意思。
在计算机领域,会话是⼀个客⼾与服务器之间的不中断的请求响应.对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客⼾.当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话.当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了.
⽐如我们打客服电话
每次打客服电话,是⼀个会话.挂断电话,会话就结束了下次再打客服电话,⼜是⼀个新的会话.
如果我们⻓时间不说话,没有新的请求,会话也会结束.
服务器同⼀时刻收到的请求是很多的.服务器需要清楚的区分每个请求是从属于哪个⽤⼾,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系.
Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象.
Session的本质就是⼀个"哈希表",存储了⼀些键值对结构.Key就是SessionID,Value就是⽤⼾信息(⽤⼾信息可以根据需求灵活设计).
SessionId是由服务器⽣成的⼀个"唯⼀性字符串",从Session机制的⻆度来看,这个唯⼀性字符串称为SessionId.但是站在整个登录流程中看待,也可以把这个唯⼀性字符串称为token.
上述例⼦中的令牌ID,就可以看做是SessionId,只不过令牌除了ID之外,还会带⼀些其他信息,⽐如时间,签名等.
- 当⽤⼾登陆的时候,服务器在Session中新增⼀个新记录,并把sessionId返回给客⼾端.(通过HTTP响应中的Set-Cookie字段返回).
- 客⼾端后续再给服务器发送请求的时候,需要在请求中带上sessionId.(通过HTTP请求中的Cookie字段带上).
- 服务器收到请求之后,根据请求中的sessionId在Session信息中获取到对应的⽤⼾信息,再进⾏后续操作.找不到则重新创建Session,并把SessionID返回
Session默认是保存在内存中的.如果重启服务器则Session数据就会丢失.
获取cookie
1.传统获取
此时没有设置Cookie,通过浏览器访问:http://127.0.0.1:8080/param/m10,得到Cookie为null。
再次访问
从这个例⼦中,也可以看出Cookie是可以伪造的,也就是不安全的,所以使⽤Cookie时,后端需要进⾏Cookie校验
2.简洁获取Cookie
3.获取Session
Session存储和获取。
Session是服务器端的机制,我们需要先存储,才能再获取Session也是基于HttpServletRequest来存储和获取的Session存储
这个代码中看不到SessionId这样的概念的.getSession操作内部提取到请求中的Cookie⾥的SessionId,然后根据SessionId获取到对应的Session对象,Session对象⽤HttpSession来描述。
获取Session有两种⽅式;
HttpSessiongetSession(booleancreate):参数如果为true,则当不存在会话时新建会话;参数如果为false,则当不存在会话时返回null.
HttpSessiongetSession():和getSession(true)含义⼀样,默认值为true.voidsetAttribute(Stringname,Objectvalue):使⽤指定的名称绑定⼀个对象到该session会话.
Session读取
读取Session可以使⽤HttpServletRequest.
ObjectgetAttribute(Stringname):返回在该session会话中具有指定名称的对象,如果没有指定名称的对象,则返回null.
运⾏.
先设置Session:http://127.0.0.1:8080/param/setSess
通过Fiddler观察Http请求和响应情况.
可以看到,Http响应中,通过Set-Cookie告知客⼾端,把SessionID存储在Cookie中通过浏览器,可以观察到运⾏结果
获取Session:http://127.0.0.1:8080/param/getSess
可以看到,Http响应中,通过Set-Cookie告知客⼾端,把SessionID存储在Cookie中通过浏览器,可以观察到运⾏结果:
获取Session:http://127.0.0.1:8080/param/getSess
通过Fiddler观察Http请求和响应
可以看到,Http请求时,把SessionId通过Cookie传递到了服务器.
简洁获取Session(1)
运⾏结果:http://127.0.0.1:8080/param/getSess2
简洁获取Session(2)
通过SpringMVC内置对象HttpSession来获取
HttpSessionsession=request.getSession();
Session不存在的话,会⾃动进⾏创建
运⾏结果:http://127.0.0.1:8080/param/getSess3