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传递.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

下载、安装Maven

官网搜索Maven 进入官网 点击下载

蓝桥杯每日一题 走迷宫bfs 超超详细解释!!!

昨天学习了bfs的基本概念&#xff0c;今天来做一道经典习题练练手吧&#xff01; bfs常用的两类题型 1.从A出发是否存在到达B的路径(dfs也可) 2.从A出发到B的最短路径&#xff08;数小:<20才能用dfs&#xff09; 遗留的那个问题的答案- 题目&#xff1a;走迷宫 答案&…

在根据卷积核大小计算padding时要遵循什么原则

在计算卷积操作中的 padding 大小时&#xff0c;通常有以下原则&#xff1a; 保持输入输出尺寸相同&#xff1a;如果希望卷积操作前后输入和输出的尺寸保持不变&#xff0c;可以使用以下公式计算 padding 大小&#xff1a; 其中&#xff0c;filter size 是卷积核的大小。这个…

腾讯云免费服务器申请入口_2核2G、2核8G和4核8G配置

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

【白嫖】100%中奖阿里云实物键盘、游戏机、苹果15

1.扫描下方二维码或者直接点击链接跳转 [阿里云-通义灵码] (https://developer.aliyun.com/topic/lingma/activities/202403?taskCode14508&recordIdb0e97482e51e08068012bbb1eb743a15#/?utm_contentm_fission_1%20%20%E3%80%8C%E9%80%9A%E4%B9%89%E7%81%B5%E7%A0%81%20…

146 Linux 网络编程2 ,Socket编程,如何创建Linux 服务器 和linux 客户端

IPport 就是一个程序在网络上的身份证号码。 这意味着我们需要如果写一个服务器&#xff0c;至少需要将这台服务器的ip 和 端口号写到程序里面。 实际上更细化的说&#xff1a;应该是将这三都写进程序里面 &#xff1a; IP类型&#xff08;IPV4或者IPV6&#xff09;&#xff…

5分钟教你激活喀秋莎Camtasia2023中文破解Crack下载附安装教程

Camtasia2023又称喀秋莎2023&#xff0c;集屏幕录制和视频剪辑功能于一体的软件&#xff0c;提供屏幕录制、区域录制、摄像头录制等多种录制方式&#xff0c;Camtasia2023版本带来了新的动态背景库、霓虹光标图像、录制语音旁白等多种新功能&#xff0c;适用于游戏录制、课程录…

Jupyter Notebook出错提示An error occurred while retrieving package information解决办法

出错日志信息&#xff1a; To access the notebook, open this file in a browser:file:///C:/Users/colda/AppData/Roaming/jupyter/runtime/nbserver-14564-open.htmlOr copy and paste one of these URLs:http://localhost:8888/?token3c0113e5da07c0b8b8c9de74ffb453c5047…

Python下有关CV的一些算法和函数

目录&#xff1a; 1. HoughCircles二级目录三级目录 1. HoughCircles 霍夫圆检测 二级目录 三级目录

【Docker】一文趣谈Docker

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 …

数学与计算机(2)- 线性代数

原文&#xff1a;https://blog.iyatt.com/?p13044 1 矩阵 NumPy 中 array 和 matrix 都可以用于储存矩阵&#xff0c;后者是前者的子类&#xff0c;array 可以表示任意维度&#xff0c;matrix 只能是二维&#xff0c;相当于矩阵专用&#xff0c;在一些矩阵的运算操作上较为直…

Python语法糖

N u m P y NumPy NumPy的 n d i t e r nditer nditer nditer 是 NumPy 提供的一种多维迭代器&#xff0c;用于对多维数组进行迭代操作。它可以替代传统的嵌套循环&#xff0c;在处理多维数组时更加方便和高效。 迭代器可以按照不同的顺序遍历数组的元素&#xff0c;也可以控制…

MyFileServer

靶场下载地址 https://download.vulnhub.com/myfileserver/My_file_server_1.ova 信息收集 # nmap -sn 192.168.56.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-24 22:07 CST Nmap scan report for 192.168.56.2 (192.168.56.2) Host is up (0.…

字节跳动后端工程师实习生笔试题-c++

字节跳动后端工程师实习生笔试题链接 笔试题 1. 最大映射2. 木棒拼图3. 魔法权值4. 或与加 1. 最大映射 有 n 个字符串&#xff0c;每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字&#xff0c;不同字符映射为不同的数字。这样每个字符串就可以看…

1990-2022年各省全要素生产率数据(仅结果)

1990-2022年各省全要素生产率数据&#xff08;仅结果&#xff09; 1、时间&#xff1a;1990-2022年 2、指标&#xff1a;地区、年份、OLS、FE、RE、DGMM、SGMM、SFA1、SFA2、SFA3、SFA3D、TFE、非参数法 3、范围&#xff1a;31省 4、计算说明&#xff1a; 产出指标&#x…

了解 HTTP 请求的五个关键要素

一个成功的 HTTP 请求不仅仅意味着简单地发送一个请求并接收到响应。事实上&#xff0c;每个 HTTP 请求都需要具备五大要点&#xff0c;这些要点确保了请求的正确性、可靠性和用户体验。在本文中&#xff0c;我们将探讨这五大要点&#xff0c;即发送适当的请求、显示加载状态、…

明日周刊-第2期

三月份的第3周&#xff0c;第2期如期而至。大家希望看到什么内容也可以在评论区互动。 第2期-明日周刊 1. 一周热点1.1 国内新闻1.2 国际新闻1.3 科技新闻1.4 社会新闻 2. 资源分享3. 言论4. 歌曲推荐 1. 一周热点 1.1 国内新闻 中国成功发射遥感三十五号05组卫星 本周&#…

微信小程序-微信支付

微信支付介绍 梳理一下流程&#xff1a; 1、用户点击下单&#xff0c;小程序向商户系统&#xff08;我们的服务器&#xff09;发起请求&#xff0c;服务器生成一个唯一订单号给小程序。 2、小程序向服务器发起微信支付请求&#xff0c;服务器调用微信下单接口&#xff0c;微信…

从排序算法的艺术看C语言qsort函数的魅力:一场数据的时空穿越

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 一 、回调函数 二、qsort函数 1.qsort函数排序整型数据 2.qsort函数排序结构数据 一 、回调函数 何为回调函数&#xff1…

STL容器之list类

文章目录 STL容器之list类1、list的介绍2、list的使用2.1、list的常见构造2.2、list的iterator的使用2.3、list空间增长问题2.4、list的增删查改2.5、list迭代器失效问题 3、list的模拟实现&#xff08;含反向迭代器&#xff09; STL容器之list类 1、list的介绍 list是序列容器…