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://xiahunao.cn/news/2871326.html

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

相关文章

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

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

Java多线程实战-CountDownLatch模拟压测实现

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️本系列源码仓库:多线程并发编程学习的多个代码片段(github) 🏷️个人学习笔记,若有缺误,欢迎评论区指正…

深度学习 精选笔记(13.2)深度卷积神经网络-AlexNet模型

学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。 ③非常推荐上面(学习参考&#x…

单片机学到什么程度才可以去工作?

单片机学到什么程度才可以去工作? 如果没有名校或学位的加持,你还得再努力一把,才能从激烈的竞争中胜出。以下这些技能可以给你加分,你看情况学,不同行业对这些组件会有取舍: . Cortex-M内核:理解MCU内核各部件的工作机制&#…

如何优化使用Nginx

文章目录 🔊博主介绍🥤本文内容数据压缩负载均衡安装OpenResty或ngx_http_lua_module配置Nginx以启用Lua编写Lua脚本配置upstream块以使用Lua变量测试配置 合并请求1. 确保SSI模块已启用2. 配置Nginx以使用SSI3. 使用SSI指令4. 重新加载或重启Nginx 集成…

Python爬虫与数据可视化源码免费领取

引言 作为一名在软件技术领域深耕多年的专业人士,我不仅在软件开发和项目部署方面积累了丰富的实践经验,更以卓越的技术实力获得了🏅30项软件著作权证书的殊荣。这些成就不仅是对我的技术专长的肯定,也是对我的创新精神和专业承诺…

【leetcode-53最大子数组和】

题目: 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] …

MySQL知识点极速入门

准备SQL 创建数据库: 创建一个名为emptest的数据库 create database emptest; use emptest; 创建数据表: 设计一张员工信息表,要求如下: 1. 编号(纯数字) 2. 员工工号 (字符串类型,长度不超…

Windows10中配置并使用nvidia-smi

1. 问题 当在window10系统中使用nvidia-smi命令时: 会得到提示:nvidia-smi不是内部或外部命令,也不是可运行的程序或批处理文件。 注:其实安装NVIDIA控制面板时,软件已内置安装了nvidia-smi.exe,我们只需…

文件包含漏洞(input、filter、zip)

一、PHP://INPUT php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码…

【Java刷题篇】串联所有单词的子串

这里写目录标题 📃1.题目📜2.分析题目📜3.算法原理🧠4.思路叙述✍1.进窗口✍2.判断有效个数✍3.维护窗口✍4.出窗口 💥5.完整代码 📃1.题目 力扣链接: 串联所有单词的子串 📜2.分析题目 阅…

长连接技术

个人学习记录,欢迎指正 1.轮询 1.1 轮询的形式 短连接轮询 前端每隔一段时间向服务端发起一次Http请求来获取数据。 const shortPolling () > { const intervalHandler setInterval(() > {fetch(/xxx/yyy).then(response > response.json()).then(respo…

企业计算机服务器中了devicdata勒索病毒怎么办,devicdata勒索病毒解密工具流程

随着科学技术的不断发展与应用,越来越多的企业开始利用网络开展各项工作业务,网络为企业的生产运营提供了极大便利,大大提高了生产运营效率,同时也为企业的发展规划带来不错的契机。但网络是一把双刃剑,网络在为人们提…

HAProxy高性能负载均衡器

一、HAProxy基础知识 (一)HAProxy概述 HAProxy是一款基于事件驱动、单进程模型设计的四层与七层负载均衡器,它能够在TCP/UDP层面以及HTTP(S)等应用层协议上实现高效的流量分发。HAProxy不仅适用于Web服务器负载均衡,还能应用于数据…

AI大浪潮,怎能少了国产HBM内存?

据有关报道显示,武汉新芯半导体制造有限公司(XMC)正在启动一项专注于开发和生产高带宽内存(HBM)的项目。 HBM作为一种关键的DRAM类型,对于人工智能(AI)和高性能计算(HPC&…

腾讯云轻量应用服务器2核4G5M代表什么意思?

腾讯云服务器2核4G5M带宽配置是代表什么?代表2核CPU、4G内存、5M公网带宽,这是一款轻量应用服务器,系统盘为60GB SSD云硬盘,活动页面 txybk.com/go/txy 活动打开如下图: 腾讯云2核4G5M服务器 如上图所示,这…

智慧公厕建设的主要目标是什么?

随着城市化进程的不断推进,公共厕所作为城市基础设施的重要组成部分,也变得越来越重要。为了提升公共厕所的管理水平、提供更好的服务质量,智慧公厕应运而生。智慧公厕的建设旨在通过信息化手段实现公共厕所的全面感知监测,实现公…

Jmeter文件上传不成功问题

前言 最近好忙呀,项目上线然后紧接着又客户培训了,由于项目有个模块全是走配置的,所以导致问题不断,近期要培训为了保障培训时客户同时操作的情况,所以把我从功能端抽出来做压测了,之前安排了2个同事写压测…

力扣24. 两两交换链表中的节点

新建虚拟头节点,用3个指针记录前3个节点,然后再相互赋值指向,再移动当前节点,当前节点所在的位置,只能交换该节点的后两个节点(所以必须建立虚拟头节点,才能操作第1,2个节点&#xf…

ts版本微信小程序在wxml保存文件不刷新页面的解决办法

将project.config.json中的skylineRenderEnable改为false "skylineRenderEnable": false