Spring Boot入门指南:轻松构建高效Spring应用(四)

news2024/11/15 17:34:21

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字段中.


⽐如去医院挂号

  1. 看病之前先挂号.挂号时候需要提供⾝份证号,同时得到了⼀张"就诊卡",这个就诊卡就相当于患者的"令牌".
  2. 后续去各个科室进⾏检查,诊断,开药等操作,都不必再出⽰⾝份证了,只要凭就诊卡即可识别出当前患者的⾝份.
  3. 看完病了之后,不想要就诊卡了,就可以注销这个卡.此时患者的⾝份和就诊卡的关联就销毁了.(类似于⽹站的注销操作)
  4. ⼜来看病,可以办⼀张新的就诊卡,此时就得到了⼀个新的"令牌" 

此时在服务器这边就需要记录"令牌"信息,以及令牌对应的⽤⼾信息,这个就是Session机制所做的⼯作.

理解Session
我们先来了解⼀下什么是会话.会话:对话的意思。

在计算机领域,会话是⼀个客⼾与服务器之间的不中断的请求响应.对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客⼾.当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话.当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了.


⽐如我们打客服电话
每次打客服电话,是⼀个会话.挂断电话,会话就结束了下次再打客服电话,⼜是⼀个新的会话.
如果我们⻓时间不说话,没有新的请求,会话也会结束. 

服务器同⼀时刻收到的请求是很多的.服务器需要清楚的区分每个请求是从属于哪个⽤⼾,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系.
Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象. 

 Session的本质就是⼀个"哈希表",存储了⼀些键值对结构.Key就是SessionID,Value就是⽤⼾信息(⽤⼾信息可以根据需求灵活设计).

SessionId是由服务器⽣成的⼀个"唯⼀性字符串",从Session机制的⻆度来看,这个唯⼀性字符串称为SessionId.但是站在整个登录流程中看待,也可以把这个唯⼀性字符串称为token.
上述例⼦中的令牌ID,就可以看做是SessionId,只不过令牌除了ID之外,还会带⼀些其他信息,⽐如时间,签名等. 

  1.  当⽤⼾登陆的时候,服务器在Session中新增⼀个新记录,并把sessionId返回给客⼾端.(通过HTTP响应中的Set-Cookie字段返回).
  2. 客⼾端后续再给服务器发送请求的时候,需要在请求中带上sessionId.(通过HTTP请求中的Cookie字段带上).
  3. 服务器收到请求之后,根据请求中的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

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Transformer合集

资料 位置编码:https://zhuanlan.zhihu.com/p/454482273 自注意力:https://zhuanlan.zhihu.com/p/455399791 LN:https://zhuanlan.zhihu.com/p/456863215 ResNet:https://zhuanlan.zhihu.com/p/459065530 Subword Tokenizati…

重生之我们在ES顶端相遇第5章-常用字段类型

思维导图 前置 在第4章,我们提到了 keyword(一笔带过)。在本章,我们将介绍 ES 的字段类型。全面的带大家了解 ES 各个字段类型的使用场景。 字段类型 ES 支持以下字段类型(仅介绍开发中常用,更多内容请自…

接口自动化测试框架实战-4-日志方法封装

上一小节我们讲解了文件读写方法的封装方法,本小节我们完成一下框架日志的封装方法。 首先我们讲解一下日志封装和日志记录有哪些用处? 更加方便的设置日志的格式和输出方式全局方法可以各个类/函数中都能统一调用分类记录接口用例执行日志,方便嵌入测试报告错误日志提示,…

乘云数字受邀Zabbix MeetUp济南站,分享《DataBuff在打造可观测性数据底座上的探索》

7月20日,Zabbix主办的MeetUp线下活动在济南圆满举行,众多技术大咖汇集现场,交流技术知识、分享先进的思想。乘云数字受邀参加此次盛宴,创始人兼CEO向成钢在现场发表了关于“DataBuff在打造可观测性数据底座上的探索”的主题演讲。…

【多模态】CLIP-KD: An Empirical Study of CLIP Model Distillation

论文:CLIP-KD: An Empirical Study of CLIP Model Distillation 链接:https://arxiv.org/pdf/2307.12732 CVPR 2024 Introduction Motivation:使用大的Teacher CLIP模型有监督蒸馏小CLIP模型,出发点基于在资源受限的应用中&…

NFTScan 浏览器现已支持 .mint 域名搜索功能!

近日,NFT 数据基础设施 NFTScan 浏览器现已支持用户输入 .mint 域名进行 Mint Blockchain 网络钱包地址的搜索查询, NFTScan 用户能够轻松地使用域名追踪 NFT 交易,为 NFT 钱包地址相关的搜索查询功能增加透明度和便利性。 NFTScan explorer…

C++树形结构(2 树的直径)

目录 1.定义: 2.直径的性质: 3.树的直径求解方法: 4.直径端点求解方法: 朴素方法: 优化方法: 5.例题: 6.直径公共点: 7.例题: 8.去掉再加上: 9.例…

Hi3751V560_SELinux

Hi3751V560_SELinux setenforce Enforcing setenforce Permissive(或“setenforce 0”) getenforce V560:demo本身的: [ 13.765161] type=1400 audit(1628821512.905:4): avc: denied { read } for pid=1926 comm="system_server" name="ifindex" d…

vue3前端开发-小兔鲜项目-图片切换效果和动态class

vue3前端开发-小兔鲜项目-图片切换效果和动态class!这次实现的效果是&#xff0c;图片预览效果&#xff0c;根据小图片&#xff0c;来实时改变大图&#xff08;预览&#xff09;的效果。同时让动态的特征class也跟着显示出来。 <script setup> import {ref} from vue // …

【Vue3】响应式数据

【Vue3】响应式数据 背景简介开发环境开发步骤及源码使用 ref 定义基本类型响应式数据使用 reactive 定义对象类型响应式数据使用 ref 定义对象类型响应式数据 ref 和 reactive 的对比使用原则建议 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈…

【C++初阶】string类

【C初阶】string类 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 1.2 实际中 2. 标准库中的string类 2.1 string类 2.…

day07:用户下单、订单支付

文章目录 地址薄相关相关代码需求分析和设计代码书写 用户下单需求分析和设计代码开发 订单支付微信支付介绍微信支付准备工作如何保证数据安全&#xff1f;如何调用到商户系统 地址薄相关相关代码 需求分析和设计 产品原型接口设计数据库设计 代码书写 地址薄相关代码都是单…

【unity 新手教程 001/100】安装与窗口布局介绍

欢迎关注 、订阅专栏 【unity 新手教程】谢谢你的支持&#xff01;&#x1f49c;&#x1f49c; Unity下载与安装 &#x1f449;点击跳转详细图文步骤&#xff1a;Unity Hub Unity 编辑器 窗口布局&#xff1a; Hierarchy: 层级窗口 | 默认 Sample Scene (main camera、direc…

三星Unpacked发布会即将举行:有新款折叠屏手机,还有智能戒指

随着7月的脚步渐近&#xff0c;科技界的目光再次聚焦于三星&#xff0c;它即将在法国巴黎举办今年的第二场Unpacked发布会。这不仅是一场新品的展示&#xff0c;更是三星对创新科技的一次深刻诠释。 从Galaxy Z Fold 6的全新设计&#xff0c;到Galaxy Z Flip 6的显著升级&…

MySQL数据库练习(四)

1.建库建表 # 创建数据库 create database mydb15_indexstu;# use mydb15_indexstu;# 学生表student&#xff0c;定义主键&#xff0c;姓名不能重名&#xff0c;性别只能输入男或女&#xff0c;所在系的默认值是“计算机”&#xff0c;结构如下:student(Sno 学号&#xff0c;…

C#中的线性表

什么是线性表 线性表是最简单、最基本、最常用的数据结构。线性表是线性结构的抽象(Abstract),线性结构的特点是结构中的数据元素之间存在一对一的线性关系。这种一对一的关系指的是数据元素之间的位置关系,即:(1)除第一个位置的数据元素外,其它数据元素位置的前面都只有一个数…

基于python的京东VR眼镜口碑情感分析,包括lda和情感分析

第1章 绪论 1.1选题背景 在当今科技发展迅速的时代&#xff0c;虚拟现实&#xff08;VR&#xff09;技术作为一种前沿的数字体验方式受到越来越多人的关注。京东作为中国领先的电商平台&#xff0c;推出的VR眼镜备受消费者关注。通过对京东VR眼镜口碑进行情感分析&#xff0c…

2022 年中高职组“网络安全”赛项-海南省省竞赛任务书-1-B模块-B-4Web渗透测试

前言 本章节我将尝试操作B-4模块的渗透测试&#xff0c;搭建环境很难&#xff0c;还望大家点点赞多多支持&#xff01; 任务概览 最后4、5、6有一定的难度。 环境要求 kali Linux192.168.41.2Web服务器&#xff08;假设为PYsystem 2020 模拟平台&#xff09;192.168.41.7交换…

AGV平面坐标系变换公式及实例

1、AGV坐标系简介 如上图&#xff0c;小车前后对角是有激光雷达的&#xff0c;其坐标系称为激光坐标系&#xff0c;采用极坐标系体现。中间为车体坐标系&#xff0c;激光坐标系相对于车体坐标系关系不变&#xff1b;左下角是地图坐标系&#xff0c;小车扫图后&#xff0c;建立的…

PCIE的GT计算

在PCIe总线中&#xff0c;使用GT(Gigatransfer)计算PCIe链路的峰值带宽。GT是在PCIe链路上传递的峰值带宽&#xff0c;其计算公式为总线频率数据位宽2。