Spring Web MVC入门(3)

学习Spring MVC

请求

传递JSON数据

JSON概念

JSON: JavaScript Object Natation

JSON是一种轻量的数据交互格式, 采用完全独立于编程语言的文本格式来存储和标识数据.

简单来说, JSON是一种数据格式, 有自己的格式和语法, 使用文本来表示对象或数组的信息, 因此JSON的本质是字符串, 用于在不同的语言中进行数据的传递和转换.

类似于:

国际通用语言--英语

中国56个民族不同地区的通用语言--普通话

有自己的语法, 其它语言也认识.

JSON和JavaScript之间的关系

没有关系, 只是语法相似, js开发者能更快的上手而已, 语法比较简单, 所以也很好学.

 JSON语法

JSON是一个字符串, 其格式非常类似于 JavaScript对象字面量的格式.

先来看一段JSON数据:

{"name": "John Doe","age": 30,"city": "New York","email": "john@example.com","phone": "+1234567890","languages": ["English", "Spanish", "French"]
}

1.数据在键值对(Key/Value)中

2.数据由 , 分隔

3.对象用{ }表示

4.数组用[ ]表示

5.值可以为对象, 也可以为数组, 数组中可以包含多个对象. 

JSON的两种结构

1.对象: 大括号 { } 保存的是一个无序的键值对集合. 一个对象以左括号 { 开始, 右括号 } 结束.

每个键之后跟着 : , 键值对之间使用 , 分隔.

2.数组: 中括号  [ ] 保存的是值的有序集合. 一个数组以左中括号 [ 开始, 右中括号 ] 结束, 值之间使用 , 分隔. 

JSON字符串和Java对象互转

JSON本质上是一个字符串, 通过文本存储和描述数据.

Spring MVC框架也集成了JSON的转换工具, 我们可以直接使用, 来完成JSON字符串和对象之间的互转

本质上是jackson-databind提供的功能. SpringMVC已经引入了进来, 直接使用即可.

转换的代码如下:

public class JSONUtils {private static ObjectMapper objectMapper = new ObjectMapper();public static void main(String[] args) throws JsonProcessingException {Person person = new Person();person.setId(5);person.setName("zhangsan");person.setPassword("1232423");//对象转为JSON字符串String JSONStr = objectMapper.writeValueAsString(person);System.out.println("JSON字符串为" + JSONStr);//JSON字符串转为对象Person p = objectMapper.readValue(JSONStr, Person.class);System.out.println("转换对象id:" + p.getId() + ",name:" + p.getName() + ",password:" + p.getPassword());}
}

使用ObjectMapper对象提供的两个方法, 可以完成对象和JSON字符串的互转.

writeValueAsString: 把对象转为JSON字符串.

readValue: 把JSON字符串转为对象. 

JSON优点 

1.简单易用: 语法简单, 易于理解和编写, 可以快速地进行数据转换.

2.跨平台支持: JSON可以被多种编程语言解析和生成, 可以在不同平台和语言之中进行数据转换和传输.

3.轻量级: 相比于XML, JSON更加轻量级, 传输时占用的带宽更小, 可以提高数据的传输速度.

4.易于扩展: JSON的数据结构灵活, 支持对象/数组等复杂的数据结构, 便于扩展和使用.

5.安全: JSON的数据格式是一种纯文本格式, 不包含任何可执行代码,  不会执行恶意代码.

基于以上特点, JSON在Web应用程序中被广泛使用, 如前后端数据交互, API接口数据传输等.

传递JSON对象

接收JSON对象, 需要使用@RequestBody注解.

RequestBody:请求正文, 意思是这个注解作用在请求正文的数据绑定, 请求参数必须写在请求正文中.

后端实现:

    @RequestMapping("/m8")public String method8(@RequestBody Person person) {return person.toString();}

 

可以看到, 后端正确接收了.

获取URL中参数@PathVariable

path variable:路径变量

和字面表达的意思一样, 这个注解主要作用于请求在URL路径上的数据绑定.

默认传递参数写在URL上, SpringMVC就可以获取到. 

后端代码:

    @RequestMapping("/m9/{id}/{name}")public String method9(@PathVariable Integer id, @PathVariable("name") String userName) {return "解析参数id:" + id + ",name:" + userName;}

 

参数对应关系如下:

 

 

如果方法参数名和需要绑定的URL的变量名称一致时. 不用给@PathVariable的属性赋值.

当方法参数名和需要绑定的URL的变量名称不一致时.需要给@PathVariable的value属性赋值(类似于之前讲到的@RequestParam) 

上传文件@RequestPart

后端代码实现:

    @RequestMapping("/m10")public String method10(@RequestPart MultipartFile file) throws IOException {//获取文件名称String fileName = file.getOriginalFilename();return "接收到的文件名称为: " + fileName;}

结果如下: 

 

获取Cookie/Session

回顾Cookie

HTTP协议本身是一个"无状态的"协议

所谓无状态就是指客户端与服务器的本次通信, 与下一次通信之间没有关系.

但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的.

比如用户登录, 它登录一次, 然后第二次访问的时候服务器就能知道之前是否已经登陆过了(登录的是谁).

上述图中的"令牌"通常就存储在Cookie字段中.

此时服务器就需要记录"令牌"信息, 以及令牌对应的用户信息, 这个就是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获取对应用户的信息, 如果没有则会重新创建一个Session, 并把SessionId返回.

 

Session默认是保存在内存里的, 如果重启服务器就会导致Session数据的丢失. 

Cookie和Session的区别

1.Cookie是客户端保存用户信息的一种机制, Session是服务器保存用户信息的一种机制

2.Cookie和Session之间可以通过SessionId连接起来

3. Cookie和Session需要经常配合到一起使用, 也可以不配合使用.

完全可以使用Cookie保存数据在客户端, 这些信息不一定是用户的信息, 也不一定是SessionId

Session中的sessionId可以不通过Cookie和Set-Cookie\传递, 比如通过URL传递.

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

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

相关文章

C++——类和对象(3)

目录 1. 拷贝构造 1.1 概念 1.2 特性 ​编辑 2. 赋值重载 和 运算符重载 2.1 运算符重载 2.2 赋值重载 此篇文章讲解六个默认成员函数中的 拷贝构造和赋值重载 。 1. 拷贝构造 1.1 概念 拷贝构造: 在创建对象的时候用已经创建好的对象去初始化一个新对象&am…

C# 打开文件对话框(OpenFileDialog)

OpenFileDialog&#xff1a;可以打开指定后缀名的文件&#xff0c;既能单个打开文件也能批量打开文件 /// <summary>/// 批量打开文档/// 引用&#xff1a;System.Window.Fomrs.OpenFileDialog/// </summary>public void OpenFile(){OpenFileDialog dialog new Op…

操作系统(OS)

文章目录 前言一、操作系统是什么&#xff1f;二、用户对资源的访问三、操作系统是怎么做到管理的&#xff1f; 前言 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。冯诺依曼体系结构中的硬件单元提供的功能&#xff0c;这些硬件由操作系统来控制与管…

整数和浮点数在内存中存储及题目

一、整数在内存中存储 整数的2进制表⽰⽅法有三种&#xff0c;即原码、反码和补码。三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&#xff0c;⽤1表⽰“负”&#xff0c;⽽数值位最⾼位的⼀位是被当做符号位&#xff0c;剩余的都是数值位 正整数…

UglifyJS 压缩工具

要使用 UglifyJS 进行 JavaScript 代码的压缩和混淆&#xff0c;你可以按照以下步骤进行&#xff1a; 安装 Node.js&#xff1a; 首先确保你的计算机上安装了 Node.js。如果没有安装&#xff0c;你可以从 Node.js 官方网站 下载并安装。 安装 UglifyJS&#xff1a; 在安装 Nod…

2024腾讯云免费服务器2核8G配置申请流程,亲测有效

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

C++for语句(2)

11.乘方计算 给出一个整数a和一个正整数n&#xff08;-1000000<a<1000000,1<n<100000&#xff09;&#xff0c;求乘方&#xff0c;即乘方的结果。最终结果的绝对值不超过1000000。 输入 一行&#xff0c;包含两个整数a和n&#xff08;-1000000<a<1000000,1…

第四十四周:文献阅读 + SG滤波+基于LSTM的编码器-解码器

目录 摘要 Abstract 文献阅读&#xff1a;基于集成深度神经网络的大规模水质预测 现有问题 提出方法 方法论 Savitsky-Golay过滤器 SE-LSTM&#xff08;基于LSTM的编码器-解码器神经网络&#xff09; 研究实验 数据集 实验设置 评估指标 基准模型 实验结果 发展…

搜维尔科技:使用SenseGlove Nova手套操纵其“CAVE”投影室中的虚拟对象

创造了一种基于 PC 的创新型多边沉浸式环境&#xff0c;让参与者完全被虚拟图像和声音包围。 需要解决的挑战&#xff1a; 传统的 VR 系统往往缺乏真实的触摸反馈&#xff0c;限制了用户的沉浸感。AVR Japan 旨在通过将触觉技术融入到他们的 CAVE 系统中来应对这一挑战&#x…

操作系统(AndroidIOS)图像绘图的基本原理

屏幕显示图像的过程 我们知道&#xff0c;屏幕是由一个个物理显示单元组成&#xff0c;每一个单元我们可以称之为一个物理像素点&#xff0c;而每一个像素点可以发出多种颜色。 而图像&#xff0c;就是在不同的物理像素点上显示不同的颜色构成的。 像素点的颜色 像素的颜色是…

HTML静态网页成品作业(HTML+CSS)——游戏战地介绍设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

3.4 bp,si,di寄存器,寻址方式,寄存器总结

汇编语言 1. [bxidata] 我们可以用[bx]来指明一个内存单元我们也可以用[bxidata]来表示一个内存单元&#xff0c;它的偏移地址为bx中的数值加上idata mount c d:masm c: debug r d 2000:1000 e 2000:1000 12 34 56 78 a mov ax,2000 mov ds,ax mov bx,1000 mov ax,[bx] mov c…

C++之deque与vector、list对比分析

一.deque讲解 对于vector和list&#xff0c;前一个是顺序表&#xff0c;后一个是带头双向循环链表&#xff0c;前面我们已经实现过&#xff0c;这里就不再讲解了&#xff0c;直接上deque了。 deque&#xff1a;双端队列 常见接口大家可以查看下面链接&#xff1a; deque - …

Redis - String 字符串

前言 下表中包含本博客提到的所有命令 字符串类型是 Redis 最基础的数据类型&#xff0c;关于字符串需要特别注意&#xff1a; 1&#xff09;⾸先 Redis 中所有的键&#xff08;key&#xff09;的类型都是字符串类型&#xff0c;⽽且其他⼏种数据结构也都是在字符串类似基础上…

Figure 01掀起了具身智能的崭新篇章

在人工智能的发展历程中&#xff0c;OpenAI始终扮演着创新的先锋角色。最近&#xff0c;他们与Figure公司的合作成果尤为引人注目&#xff0c;这一合作将多模态大模型技术成功应用于Figure 01机器人的开发中&#xff0c;为人类与机器的互动开辟了全新的时代。该机器人不仅能够与…

Matlab|【免费】基于半不变量的概率潮流计算

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该程序主要内容是基于半不变量法的概率潮流&#xff0c;包含蒙特卡洛模拟法、半不变量法&#xff0b;Gram-Charlier级数展开以及半不变量法Cornish-Fisher级数展开三种方法以及效果对比&#xff0c;模型考虑了…

Python 查找并高亮PDF中的指定文本

在处理大量PDF文档时&#xff0c;有时我们需要快速找到特定的文本信息。本文将提供以下三个Python示例来帮助你在PDF文件中快速查找并高亮指定的文本。 查找并高亮PDF中所有的指定文本查找并高亮PDF某个区域内的指定文本使用正则表达式搜索指定文本并高亮 本文将用到国产第三方…

cesium.js加载模型后,重新设置旋转角度属性值

// 加载模型var position Cesium.Cartesian3.fromDegrees(longitude, latitude, height);// 计算矩阵var rollAngleDegrees 15; // 设置翻滚角度var rollAngleRadians Cesium.Math.toRadians(rollAngleDegrees); // 将角度转换为弧度var orientation Cesium.Transforms.eas…

安装Pytorch——CPU版本

安装Pytorch——CPU版本 1. 打开pytorch官网2. 选择pip安装pytorch-cpu3.复制安装命令4. 在cmd命令窗口&#xff0c;进入你的虚拟环境4.1 创建虚拟环境4.2 进行安装 5. 安装成功6. 进行测试——如下面步骤&#xff0c;如图6.1 输入 python6.2 输入 import torch6.2 输入 print …

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Web)中篇

onBeforeUnload onBeforeUnload(callback: (event?: { url: string; message: string; result: JsResult }) > boolean) 刷新或关闭场景下&#xff0c;在即将离开当前页面时触发此回调。刷新或关闭当前页面应先通过点击等方式获取焦点&#xff0c;才会触发此回调。 参数…