Spring Web MVC入门(3)

news2024/10/7 6:46:22

学习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.coloradmin.cn/o/1524825.html

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

相关文章

Linux网络基础2

目录 实现网络版本计算器 自己定协议实现用json协议实现 重谈OSI七层模型HTTP协议 域名介绍url介绍HTTP请求和响应 实现一个简易的HTTP服务器 实现简易Http服务器初级版实现简易Http服务器中级版 实现一个简易的HTTP服务器最终版 请求方法HTTP状态码HTTP常见的Header 实现网…

The Rise and Potential of Large Language Model Based Agents: A Survey

OpenAI AI的应用研究主管Lilian Weng发布了关于AI Agents的《大语言模型(LLM)支持的自主代理》,在文章中她定义了基于LLM构建AI Agents的应用框架:AgentLLM(大型语言模型)记忆(Memory&#xff0…

【AI系列】Torchvision、Torchaudio 和 Torchtext关系

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

13 - grace数据处理 - 泄露误差改正 -正演建模法(Forward-Modeling)

grace数据处理 - 泄露误差改正 -正演建模法(Forward-Modeling) *0* 引言*1* Matlab代码实现0 引言 正演建模法最早是由Chen等提出的,本质是通过迭代的思想反求真实信号的过程,为什么要反求呢?因为在数据处理过程中做了球谐截断和空间滤波,使部分有用信号被湮灭,也就是有…

Sentinel篇:线程隔离和熔断降级

书接上回:微服务:Sentinel篇 3. 隔离和降级 限流是一种预防措施,虽然限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障。 而要将这些故障控制在一定范围,避免雪崩,就要靠线程隔离…

email + celery+django 异步发送邮件功能的实现

主要流程: django通过发件服务器到收件服务器,最后到收件人 邮件配置设置需要打开SMTP/IMAP并获的授权码,完成授权功能实现发送给收件人 邮件配置请参考另一博客https://blog.csdn.net/qq_44238024/article/details/136277821 项目结构树…

[ROS 系列学习教程] rosbag Python API

ROS 系列学习教程(总目录) 本文目录 1. 构造函数与关闭文件2. 属性值3. 写bag文件内容4. 读bag文件内容5. 将bag文件缓存写入磁盘6. 重建 bag 文件索引7. 获取bag文件的压缩信息8. 获取bag文件的消息数量9. 获取bag文件记录的起止时间10. 获取话题信息与消息类型 rosbag 的 Pyt…

Python 编程中反斜杠 “\” 的作用:作为续行符和转义字符,处理文件路径和正则表达式时需特别注意。

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ Python 中的反斜杠 \ 可以被用作续行符,它允许你将一行代码分成多行来书写,以提高代码的可读性。这在处理长字符串、复杂的数学表达式或其他需要多行布局的代码时非常有用。 使…

使用三种方式读取文本文件

文章目录 🍔需求🎄思路⭐代码⭐效果🛸注意 在 Java 中,读取文件通常涉及以下几个步骤: 打开文件:首先需要创建一个文件对象,表示要读取的文件。这个文件对象可以包含文件路径、文件名等信息。 …

zookeeper快速入门五:用zookeeper实现服务注册与发现中心

系列: zookeeper快速入门一:zookeeper安装与启动-CSDN博客 zookeeper快速入门二:zookeeper基本概念-CSDN博客 zookeeper快速入门三:zookeeper的基本操作 zookeeper快速入门四:在java客户端中操作zookeeper-CSDN博客…

Tomcat Seeion 集群

部署:nginx服务器:11-11;tomcat1:11-3; tomcat2:11-6 nginx服务器11-11做搭建: [rootmcb-11 ~]# systemctl stop firewalld [rootmcb-11 ~]# setenforce 0 [rootmcb-11 ~]# yum install epel-release.noarch -y [rootmcb…

数据结构试卷第九套

1.时间复杂度 2.树,森林,二叉树的转换 2.1树转二叉树 给所有的兄弟节点之间加一条连线;去线,只保留当前根节点与第一个叶子节点的连线,删除它与其他节点之间的连线;然后根据左孩子右兄弟进行调整&#xf…

gitlab cicd问题整理

1、docker设置数据目录: 原数据目录磁盘空间不足,需要更换目录: /etc/docker/daemon.json //写入/etc/docker/daemon.json {"data-root": "/data/docker" } 2、Dockerfile中ADD指令不生效 因为要ADD的文件被.docker…

使用Python进行自然语言处理(NLP):NLTK与Spacy的比较【第133篇—NLTK与Spacy】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python进行自然语言处理(NLP):NLTK与Spacy的比较 自…

[数据集][目标检测]焊接件表面缺陷检测数据集VOC+YOLO格式2292张10类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2292 标注数量(xml文件个数):2292 标注数量(txt文件个数):2292 标注…

【鸿蒙HarmonyOS开发笔记】常用组件介绍篇 —— 弹窗组件

简介 弹窗是移动应用中常见的一种用户界面元素,常用于显示一些重要的信息、提示用户进行操作或收集用户输入。ArkTS提供了多种内置的弹窗供开发者使用,除此之外还支持自定义弹窗,来满足各种不同的需求。 下面是所有涉及到的弹窗组件官方文档…

NSSCTF 403,444,2145,3845,404,445

[SWPUCTF 2021 新生赛]简简单单的逻辑 py文件,使用pycharm打开进行分析 其中,hex()[2:]:将十进制转化为十六进制 zfill(2):位数不足2,前补0 这里即将flag的ASCII码与key进行异或,再将每位转化为十六进制…

Prism的发布和订阅

首先需要设置一个发布和订阅的类 -- 这里发布和订阅的消息是string类型所以就只用PubSubEvent类 发布部分(构造函数注入,发布个“Hello”) 订阅部分: public partial class ViewC : UserControl {private readonly IEventAggrega…

文件的基础

一、文件 什么是文件 文件流: 一、1、文件的相关操作 创建文件的三种方式: public class FileCreate {public static void main(String[] args) {}//方式1 new File(String pathname)Testpublic void create01() {String filePath "e:\\news1.…

1987-2022年各省专利申请授权数据(8个指标))

1987-2022年各省专利申请授权数据(8个指标)) 1、时间:1987-2023年 2、指标:国内专利申请受理量(项)、国内发明专利申请受理量(项)、国内实用新型专利申请受理量(项)、国内外观设计专利申请受理量(项)、国内专利申请授…