SpringMVC 02

这里先附上前一篇的地址,以上系列均为博主的学习路线,仅供参考

初识Spring MVC-CSDN博客

下面我们从SpringMVC传递数组开始讲起

1.传递数组

传递数组的方式和传递普通变量的方式其实是相同的,下面我们附上传递的图片

@RequestMapping("/r7")public String r1(String[] arrays){return Arrays.toString(arrays);}

第二种传送方式

2.传递集合

传递集合就不能像数组和普通对象一样直接传送了,而是需要使用注解来操作

注:这个注解和之前的重命名注解是一样的

@RequestMapping("/r8")public String r8(@RequestParam List<String> list){return "list" + list;}

3.JSON

首先json作为一种轻量级的数据交互格式,我们也需要了解json的传输和获取

首先先看一下JSON的格式

{"squadName": "Super hero squad","homeTown": "Metro City","formed": 2016,"secretBase": "Super tower","active": true,"members": [{"name": "Molecule Man","age": 29,"secretIdentity": "Dan Jukes","powers": ["Radiation resistance", "Turning tiny", "Radiation 
blast"]}, {"name": "Madame Uppercut","age": 39,"secretIdentity": "Jane Wilson","powers": ["Million tonne punch", "Damage resistance", "Superhuman 
reflexes"]}, {"name": "Eternal Flame","age": 1000000,"secretIdentity": "Unknown","powers": ["Immortality", "Heat Immunity", "Inferno", 
"Teleportation", "Interdimensional travel"]]}
}

就是键值对的形式来表示的,数据由逗号分隔,对象由大括号表示,数组使用中括号表示

我们也可以使用在线json网站来解析json

在线JSON校验格式化工具(Be JSON)

json与java对象之间的转换

注:SpringMVC已经集成了json的转换工具,这里我们就无需引入依赖了

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.5</version>
</dependency>

json这里的转换工具有很多,这里jackson只是其中的一种

或者还可以使用阿里的fastjson和fastjson2

注:这里也得使用注解才能生效,使用直接传输的话会导致返回的是默认值null

这里的注解使用@RequestBody

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

我们去掉注解试试,就会发现产生报错了

json和对象之间的转换

public static void main(String[] args) throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();String json = "{\"name\":\"admin\",\"age\":18}";//json转对象Person person = mapper.readValue(json, Person.class);System.out.println(person);//字符串转jsonString json1 = mapper.writeValueAsString(person);System.out.println(json1);}

注:这里是使用反射机制来进行操作的,注意要提供get和set方法以及空参的构造器,否则会产生异常,报错信息如下

4.获取URL中的参数

@PathVariable     和字面意思一样,这个注解主要就是获取URL中的数据绑定,简而言之就是获取URL中的参数

 @RequestMapping("/r10/{name}")public String r10(@PathVariable("name") String name){return "收到参数"+name;}

5.上传文件

这里又涉及一个新注解@RequestPart 这里的part有文件的含义

这里我们可以获取到上传文件的一些信息

@RequestMapping("/r11")public String r11(@RequestPart("file") MultipartFile file) {String fileName = file.getOriginalFilename();return "上传文件名:"+fileName;}

6.Cookie & Session

Cookie

首先我们来介绍一下Cookie

Cookie就是一串保存在客户端主机终端上的信息,是为了给某些网站进行身份验证,Session身份跟踪的字符串(经常通过加密)

Cookie保存在客户端,而Session保存在服务器端

Cookie解决了什么问题?

由于HTTP协议是一个无状态的协议,这意味着我们在访问网站的时候需要多次进行登录操作,比如访问一个淘宝,在浏览商品的时候需要进行登录,在付款的时候又要进行登录,这样就给用户造成了很大的困扰.

Cookie就是在第一次登录的时候由服务器返回一些数据给浏览器保存在本地,这样在进行第二次请求的时候,就会自动将上次保存的cookie嘻嘻携带给服务器,服务器就可以根据这个来知道用户是谁了.

注:Cookie存储的数据量有限,一般不超过4K

Cookie啥时候产生,一定有吗?

Cookie 的使用需要看要求,因为浏览器可以禁用Cookie,服务器端也可以不Set-Cookie

一般如果需要使用Cookie,那么就是客户端向服务器发送第一次请求的时候,服务端给客户端发送一个Cookie用于保存在本地

注:可以是保存在内存中,也有可能是保存在硬盘中

Cookie的生命周期?

Cookie在生成的时候会指定一个Expire值,这就是他的生命周期,超出即被清除,有些页面甚至设置为0或者负值,这样关闭浏览器即清除,更加安全

缺陷

1.Cookie中存储大的属性有限制,一个浏览器最多存储300个,且一个不能超过4K

每个站点能设置的Cookie总数不超过20个

2.安全性无法保证,因为Cookie可以被篡改

3.浏览器可以禁用Cookie

应用场景

对安全性要求不高,无需存储大量数据,主要用来做服务器和客户端的状态保持技术

Session

Session是会话的意思,比如说用户打开浏览器,点击一个超链接,访问服务器多个web资源,然后关闭浏览器就称之为一个会话.

什么时候产生?

当用户请求Web网页的时候,如果该用户还没有会话,就会自动创建一个Session,这样在应用程序跳转的时候,存储在Session对象中的变量不会丢失,这也就保证了会话会一直存在下去(Session是以键值对形式存储的)

注:服务器会向客户端发送一个SessionId放到Cookie里面,用户在每次访问网页的时候都会带着Cookie一起,这样服务器就可以根据SessionId来确定用户的信息了

Session生命周期

一般是根据需求设定的,就像淘宝的客服,在一段时间不去发送信息进行对话就会自动断开,这就是Session的生命周期

简而言之,Session和Cookie就是两种保存用户状态的机制,不同的是Cookie存储在客户端里面,Session存储在服务器里面

Cookie和Session结合使用

以登录举例,在我们第一次登录的时候,服务器会创建一个Session对象用来保存用户的信息,同时向客户端发送一出啊SessionId,客户端就将其保存在Cookie里面,下次再进行请求的时候,客户端会携带Cookie,也就是SessionId,这样服务器就可以知道用户是谁了.

下面我们介绍几种获取Cookie和Session的方式

1.传统方式获取

注意这里domain是域名千万不要写错了

 @RequestMapping("/r12")public String getC(HttpServletRequest request, HttpServletResponse response) {Cookie[] cookies = request.getCookies();StringBuilder sb = new StringBuilder();if (cookies != null) {for(Cookie cookie : cookies) {sb.append(cookie.getName()+":"+cookie.getValue());}}return sb.toString();}

简单方式

@RequestMapping("/r13")public String r13(@CookieValue("name") String name) {return "name:"+name;}

这里也侧面证明了Cookie是不安全的,可以伪造的

Session的获取和存储

Session的存储

@RequestMapping("/r14")public String getS(HttpServletRequest request, HttpServletResponse response) {HttpSession session = request.getSession();if(session != null) {session.setAttribute("name", "张三");}return "session 存储成功";}

获取Session

@RequestMapping("/r15")public String getR(HttpServletRequest request, HttpServletResponse response) {HttpSession session = request.getSession();if(session != null && session.getAttribute("name") != null) {String name = (String) session.getAttribute("name");return "name:"+name;}return "session 不存在";}

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

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

相关文章

uniapp小程序:使用uni.getLocation通过腾讯地图获取相关地址信息详情(超详细)

先看运行结果&#xff1a; 流程&#xff1a; 1、在edge网页搜索腾讯位置服务 搜索后点击这里 已经有账号的就进行登录&#xff0c;没有账号的进行注册即可 点击控制台&#xff1a; 进去后点击成员管理---->我的应用---->创建应用 输入相应的参数应用名称&#xff08;随便…

嵌入式3-15

1、整理思维导图 2、整理课上单向循环链表的代码 3、完成双向链表的剩下四个功能 2、 node_p create_list()//创建链表 { node_p p(node_p)malloc(sizeof(node)); if(pNULL) { printf("申请失败\n"); return NULL; } p->len…

React18 后台管理模板项目:现代、高效与灵活

&#x1f389; 给大家推荐一款React18TypescriptVitezustandAntdunocss且超级好用的中后台管理框架 项目地址 码云&#xff1a;https://gitee.com/nideweixiaonuannuande/xt-admin-react18github&#xff1a;https://github.com/1245488569/xt-admin-react18 演示地址 http…

Golang中map数据结构字段解析

Golang里map底层数据结构具体如下图所示&#xff1a; map其实就是一个指向 hmap 的指针&#xff0c;占用了8个字节 hmap各自段存放的字段意义如下&#xff1a; 字段含义countmap中元素的个数&#xff0c;对应len (map)的值flags状态标志位&#xff0c;标记map的一些状态B桶数…

【C++语言】冲突-C语言:命名空间

文章目录 前言1.命名空间&#xff1a;namespace关键字1.命名空间中可以定义变量、函数、类型2.命名空间可以嵌套3.相同命名空间共存 2 命名空间的使用方式&#xff1a;1.名称加用域作用限定符的方式访问&#xff08;同上&#xff09;2.使用using引入某个空间中的某个变量3.使用…

数据链路层_以太网

IP协议确定数据跨网络从主机A到主机B的路径&#xff0c;即IP协议解决了路径选择问题&#xff0c;但在这之前&#xff0c;必须先解决数据在一个子网内的传输的问题。跨网络的本质就是跨多个子网&#xff0c;只要一个子网内可以通信&#xff0c;那么便可以跨网络通信。 一.以太…

【算法杂货铺】二分算法

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 朴素二分查找 &#x1f4c2; 朴素二分模板 &#x1f4c1; 查找区间端点处 细节&#xff08;重要&#xff09; &#x1f4c2; 区间左端点处模板 &#x1f4c2; 区间右端点处模板 &#x1f4c1; 习题 1. 35. 搜索插入位…

Spring Cloud Gateway针对指定接口做响应超时时间限制

背景&#xff1a;我做的这个服务中存在要对大数据量做自定义统计的接口和大文件上传接口&#xff0c;接口响应用时会超过gateWay配置的全局用时&#xff0c;如果调整网关全局的超时时间和服务的全局超时时间是不合理的&#xff0c;故此想能否单独针对某个接口进行细粒度超时限制…

CXL-Enabled Enhanced Memory Functions——论文阅读

IEEE Micro 2023 Paper CXL论文阅读笔记整理 问题 计算快速链路&#xff08;CXL&#xff09;协议是系统社区的一个重要里程碑。CXL提供了标准化的缓存一致性内存协议&#xff0c;可用于将设备和内存连接到系统&#xff0c;同时保持与主机处理器的内存一致性。CXL使加速器&…

【Hadoop】Hadoop概述与核心组件

目录 Hadoop概述Hadoop 发展历史Hadoop 三大发行版本1.Apache Hadoop&#xff08;常用&#xff09;2.Cloudera Hadoop3.Hortonworks Hadoop优势优势总结——4高&#xff08;高可靠、高扩展、高效、高容错&#xff09; Hadoop组成1.HDFS管理者&#xff1a;NameNode&#xff08;n…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:GridItem)

网格容器中单项内容容器。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。仅支持作为Grid组件的子组件使用。 子组件 可以包含单个子组件。 接口 GridItem GridItem(value?: GridItemOptions)…

分布式系统常见负载均衡实现模式

分布式系统常见负载均衡实现模式 1. 4层负载均衡1.1. 负载均衡的常见需求1.2. 负载均衡的实现模式1.2.1 DR模式1.2.2 TUN模式1.2.3 NAT模式1.2.4 FULLNAT模式1.2.5 4种模式的差异 1.3. 负载均衡的均衡算法1.3.1 静态负载均衡1.3.2 轮询法1.3.3 加权循环法1.3.4 IP 哈希法1.3.5 …