Spring MVC(建立连接 + 请求)

文章目录

  • 一、建立客户端和服务器的连接
  • 二、如何构造请求(传参)
    • 2.1 构造请求方式 + 参数通用注解
    • 2.2 传递单个参数
    • 2.3 传递多个参数
    • 2.4 传递数组/集合
    • 2.5 传递对象
    • 2.6 传递JSON
  • 三、相关的其他请求操作
    • 3.1 获取URL中的参数 @PathVariable
    • 3.2 上传文件 @RequestPart
    • 3.3 获取和设置 Cookie/Session
      • Cookie和Session相关概念
      • 获取 + 设置 Cookie
      • 获取 + 设置Session
    • 3.4 获取Header

一、建立客户端和服务器的连接

  1. 如何建立:@RequestMapping
    • 通过 @RequestMapping 注解建立一个路由映射
    • 由于Spring Boot 内置了Tomcat,Tomcat会帮我们根据这个路由映射,去找到执行的文件
  2. @RequestMapping
    • 修饰对象:类和方法都可以修饰
    • 支持的方法:所以的请求方法都支持
      • 关于指定支持的方法:使用method属性
@RestController
@RequestMapping("/test")
public class HelloController {@RequestMapping(value = "/sayhi",method = RequestMethod.GET)public String sayHi(){return "hello";}
}
  1. 注解的属性:如果注解没有写属性名,默认属性名是value,而一旦有多个就需要区分哪个是哪个了

  2. 地址相关问题

    • 访问地址:类的路径/方法路径
    • 路径的写法
      • 层级:可以写多层,如@RequestMapping(“/hello/m1”)
      • 类路径:企业开发商建议写上类路径,因为这既可以减少名字的重复率,降低取名的难度,还可以方便我们查找代码
      • 关于/:理论上可以省略,但实际在企业开发上,建议加上,且是前加后不加 -------> 【/hello/m1】
      • 路径名VS方法名:两者没有什么关系,可以不一样,但是我们通常会取名一样,因为这样可以减少取名频率,且方便我们查找代码

二、如何构造请求(传参)

2.1 构造请求方式 + 参数通用注解

  1. 请求构造方式

    • 两种方法:请求的构造主要由前端或工具两种方式构造
    • 为什么我们使用Postman:但由于前后端分离,后端开发人员只需要提供一个接受参数的服务即可,至于怎么传参是前端的事,所以我们一般不用前者,而且为了测试个后端代码,还要写个前端很不值当。所以,我们此处所讲的都是通过postman来构造请求。
  2. 如何构造post请求)

    • 依靠前端:依靠前端的form表单/ajax
    • 依靠工具:使用Postman工具构造
  3. 如何传递JSON对象

    • 依靠前端:依靠前端的ajax传递
    • 依靠工具:使用Postman工具构造
  4. Postman使用的简单介绍:与HTTP格式一一对应

    • 为什么优先使用POST:Postman如果使用GET请求,Spring会默认从查询字符串里拿数据,这是Postman的默认设置,此时如果要传的数据是JSON之类的,就会出bug。所以,我们优先使用POST方法

在这里插入图片描述

在这里插入图片描述

  1. 后端参数重命名:@RequestParam注解,注解里面的参数是“前端传的”,后面的则是“后端想用的”
    • 底层逻辑:服务器获取到name对应的值后,将其赋值给username
    • 注意点:使用这个注解后,重命名的参数就变成必传参数了。如果想修改为“非必传”,只需要把required这个属性设置为false即可。
      在这里插入图片描述
@RestController
@RequestMapping("/param")
public class ParamController {@RequestMapping("/m4")public String m4(@RequestParam("name") String username){return username;}
}

2.2 传递单个参数

  1. 底层逻辑
    • 从请求的参数中,获取参数名为name的值,并给name赋值。
    • 相当于封装了Servlet的getPartmer方法,所以后端参数名要求和传的参数名一致。
@RestController
@RequestMapping("/param")
public class ParamController {@RequestMapping("/m1")public String m1(String name){return name;}
}

在这里插入图片描述

2.3 传递多个参数

  1. 如果设置的值未传怎么办:值为nul
    • 为何推荐使用包装类:因为如果未传值,该参数就会被赋值为null,如果此时数据类型为基本数据类型就会报错。所以企业开发中,我们建立使用包装类。
  2. 参数顺序:传递原理参考【传递单个参数】,所以参数传递顺序是无所谓的
@RestController
@RequestMapping("/param")
public class ParamController {@RequestMapping("/m2")public String m2(String name, Integer age){return "name:" + name + ", age:" + age;}
}

在这里插入图片描述

2.4 传递数组/集合

  1. 原理:当发送的请求中,同一个参数有多个时,浏览器会默认帮我们给封装成一个数组
  2. 传递数组
    • 两种请求路径
      • 参数间使用&:127.0.0.1:8080/param/m1?name=李四&name=张三&name=王五
      • 参数间使用,:127.0.0.1:8080/param/m1?name=李四,张三,王五
    • 后端代码
@RestController
@RequestMapping("/param")
public class ParamController {@RequestMapping("/m1")public String m1(String[] name){//使用lambda表达式进行循环Arrays.stream(name).forEach(s -> {System.out.print(s + " ");});return "已经正常接受数组";}
}
  1. 传递集合:使用 @RequestParam
    • 为什么要使用注解:因为如果收到多个同参数名的参数,Spring会默认帮我们封装为数组,此时我们是无法用调用集合的方法的。所以我们需要用@RequestParam注解告诉Spring这个参数是个集合。
    • 请求路径:和【传递数组】的传递方法一样
    • 后端代码
@RestController
@RequestMapping("/param")
public class ParamController {@RequestMapping("/m2")public String m2(@RequestParam List<String> name){return "接收到的list对象有:" + name.toString();}
}

2.5 传递对象

  1. 原理
    • 前三种方法的弊端
      • 一旦我们需要更改参数,就需要去修改接口定义,并且通知所以调用这个方法的地方,全部改请求参数,这十分繁琐。
      • 一旦前端未传一个后端业务运行所必须的参数,程序就会报错,容错率低
    • 为什么使用对象
      • 如果要修改参数,我们直接在对象内部添加即可
      • 遇到前端未传后端必须的数据时,后端代码里加点逻辑即可
  2. 后端代码
@RestController
@RequestMapping("/param")
public class ParamController {@RequestMapping("/m3")public String m3(Person person){return person.toString();}
}
public class Person {private String name;private String age;
}
  1. 请求发送:共有两种方法
    • query string:query string里直接把值放进去,Spring 会帮我们进行关系的映射。如【127.0.0.1:8080/param/m3?name=lisi&age=15】
    • JSON:解决了第一种方法query string内容太多的问题

2.6 传递JSON

  1. 什么是JSON
    • 一种轻量级的数据交互格式
    • 本质是一个字符串,可以和Java对象互相转换
      • 如何互转:使用ObjectMapper类的方法
  2. JSON的泛用性:因为只是数据交互格式,故而实际上面所有的传参都可以通过JSON来传
  3. JSON的格式介绍
    • 键值对
      • 存储地点:数据保存在键值对(Key/Value)中
      • 数据类型:key全部都是字符串,所以要用引号引起来,value则可以是各种类型
      • 分隔问题:键和值使用冒号分隔,数据之间则用逗号分隔
    • 对象和数组表示方法:对象用{}表示,数组用[]表示
  4. 如何传递JSON数据:使用 @RequestBody 注解
    • 为什么要使用该注解
      • 默认情况下,Spring MVC 会将请求参数绑定到方法的参数上,但请求体中的数据并不包含在标准的请求参数中(原本是key-value,传过来直接变成了一整个数据)
      • @RequestBody注解可以让Spring自动把Body里的数据转成对象
@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/m1")public String m1(@RequestBody Person person){return "收到的对象是:" + person.toString();}
}

在这里插入图片描述

三、相关的其他请求操作

3.1 获取URL中的参数 @PathVariable

  1. 获取一个URL
    在这里插入图片描述
  2. 可以获取多个URL,但要注意顺序:因为对于URL来说,他并不知道这些值有什么作用,它只会按照顺序放,不会一一对应
@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/m2/{userId}/{userName}")public String m2(@PathVariable Integer userId, @PathVariable String userName){return "接受到的userId为:" + userId + ", userName为:" + userName;}
}
  1. 请求格式必须要和后端定义的URL格式,不一致会报错
  2. 关于改名
@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/m2/{id}/{userName}")public String m2(@PathVariable("id") Integer userId, @PathVariable String userName){return "接受到的id为:" + userId + ", userName为:" + userName;}
}

3.2 上传文件 @RequestPart

  1. 如何上传:使用MultipartFile类接收文件 + @RequestPart 注解 + form-data式发送
    • 关于 MultipartFile类:可以接收各种文件,此处我们不用File类
    • 关于 form-data:以表单的形式传输二进制数据,而文件底层就是一大串二进制数据
@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/m3")public String m3(@RequestPart MultipartFile file) throws IOException {//打印传过来的文件名,此处是【普洱.jpg】System.out.println(file.getOriginalFilename());//将传过来的文件保存在当前机器上,路径为【D:/apply/+file.getOriginalFilename()】file.transferTo(new File("D:/apply/" + file.getOriginalFilename()));return "success";}
}

在这里插入图片描述

3.3 获取和设置 Cookie/Session

Cookie和Session相关概念

结合这个理解

  1. 为什么会有Cookie和Session
    • (1)HTTP是无状态的,即没有记忆功能,现在请求和过一会请求,同样的请求参数只会执行同样的处理逻辑。
    • (2)这就意味着,哪怕访问的是一个频繁访问的路径,我们也需要反复登录
    • (3)但有时候,我们需要让我们的服务有记忆功能,Cookie和Session就可以满足这个需求
  2. Cookie可以伪造,Session不行
  3. Cookie 和 Session 都是会话机制
    • 什么是会话机制:会话即对话
      在这里插入图片描述

获取 + 设置 Cookie

这是获取

  1. 使用Servlet原生的API获取可以获取到所有的Cookie
    • 为何能使用:因为Spring 是基于Servlet封装的,所以Servlet能用的,他都能用
    • HttpServletRequest和HttpServletResponse:都是Spring的内置对象,可以两个都加上,也可以只放一个,根据需求来
    • 为何要伪造Cookie:如果此时没有Cookie,cookies就会为null,后面更是会空指针异常。所以在没有Cookie的情况下,我们如果要测试该代码,需要伪造Cookie。
@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/getCookie")public String getCookie(HttpServletRequest request, HttpServletResponse response){Cookie[] cookies = request.getCookies();//使用lambda表达式进行循环Arrays.stream(cookies).forEach(cookie -> {System.out.println(cookie.getName() + ":" + cookie.getValue());});return "success";}
}
  1. 使用@CookieValue注解获取只能获取到指定的Cookie
@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/getCookie")public String getCookie(@CookieValue String name, @CookieValue Integer age){ //可以放置多个参数 return "Cookie存储的name为" + name;}
}

这是伪造Cookie

在这里插入图片描述
在这里插入图片描述

获取 + 设置Session

获取

  1. 使用内置对象 HttpServletRequest
@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/getSession")public String getSession(HttpServletRequest request){HttpSession session = request.getSession(false);  //默认值为trueif (session != null){String username = (String)session.getAttribute("username");return "登录用户:" + username;}return "session 为空";}
}
  1. 使用内置对象 HttpSession
    • 对 HttpSession session 的理解:相当于第一种方法的【request.getSession(true)】
@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/getSession")public String getSession(HttpSession session){String username = (String)session.getAttribute("username");return "username为:" + username;}
}
  1. 使用 @SessionAttribute 注解
    • 注意该参数变成了必传的:该注解的内部定义
      在这里插入图片描述
@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/getSession")public String getSession(@SessionAttribute String username){return "session中存储的username为:" + username;}
}

设置

  1. 通过Servlet方法设置:因为Session是服务端的,我们没有办法进行伪造,所以只能通过后端代码创建
@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/setSession")public String setSession(HttpServletRequest request){HttpSession session = request.getSession();session.setAttribute("username", "zhangsan");return "success";}
}

在这里插入图片描述

3.4 获取Header

  1. 使用内置对象HttpServletRequest
@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/getHeader")public String getHeader(HttpServletRequest request){//获取Header中某个key的值String userAgent = request.getHeader("User-Agent");return "userAgent:" + userAgent;}
}
  1. 使用@RequestHeader注解
    在这里插入图片描述

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

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

相关文章

maven找不到依赖,in offline mode

问题描述&#xff1a; [ERROR] Plugin org.jetbrains.kotlin:kotlin-maven-plugin:1.2.71 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.jetbrains.kotlin:kotlin-maven-plugin:jar:1.2.71: Cannot access aliyunmaven (ht…

未来娱乐新地标?气膜球幕影院的多维体验—轻空间

在中国&#xff0c;一座独特的娱乐场所正在崭露头角&#xff1a;气膜球幕影院。这个融合了气膜建筑与激光投影技术的创新场所&#xff0c;不仅令人惊叹&#xff0c;更带来了前所未有的科幻娱乐体验。让我们一起探索这个未来的娱乐空间&#xff0c;感受其中的多维魅力。 现场演出…

【刷题篇】滑动窗口(二)

文章目录 1、水果成篮2、找到字符串中所有字母异位词3、串联所有单词的子串4、最小覆盖子串 1、水果成篮 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多…

【Python技术】使用akshare、pandas打印合成生物概念股

前不久写过一篇文章【python技术】使用akshare抓取东方财富所有概念板块&#xff0c;并把指定板块概念的成分股保存excel 简单示例 &#xff0c;当初是用低空经济作为demo示例&#xff0c;得到概念股。 今天简单跑了下&#xff0c;提示 未找到板块名称合成生物&#xff0c;请检…

SM4-GCM Library代码示例

sm4-gcm加密解密测试代码: fn main() {let key Sm4Key([0u8; 16]);let nonce [0u8; 12];let plaintext b"Hello World!";let ciphertext sm4_gcm::sm4_gcm_encrypt(&key, &nonce, plaintext);println!("Encrypted: {}", hex::encode(&cip…

String,StringBuilder,StringBuffer

String&#xff0c;StringBuffer&#xff0c;StringBuilder String类 概念:String是不可变类&#xff0c;即一旦一个String对象被创建&#xff0c;包含在这个对象中的字符序列是不可改变的&#xff0c;直至该对象被销毁&#xff0c;并且String类是final类&#xff0c;不能有子…

Debian安装Redis、RabbitMQ、Nacos

安装Redis&#xff1a; 启动Redis、开机自启动 sudo systemctl start redis-server #启动sudo systemctl enable redis-server #开机自启 Redis状态(是否在运行) sudo systemctl status redis-server #查看运行状态 redis-cli ping # 客户端尝试连接 安装RabbitMQ&#xff0c;…

【JavaEE 初阶(五)】文件操作和IO

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多文件操作 目录 1.前言2.认识文件3.文件操作3.1File 属性3.2构造方法3.3File类方法 4.文件内容操作4.1R…

「JavaEE」多线程案例1:单例模式阻塞队列

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;JavaEE &#x1f387;欢迎点赞收藏加关注哦&#xff01; 多线程案例分析 &#x1f349;单例模式&#x1f34c;饿汉模式&#x1f34c;懒汉模式&#x1f34c;指令重排序 &#x1f349;阻塞队列&a…

Matlab|考虑极端天气线路脆弱性的配电网分布式电源和储能优化配置模型

1主要内容 程序主要参考《考虑极端天气线路脆弱性的配电网分布式电源配置优化模型-马宇帆》&#xff0c;针对极端天气严重威胁配电网安全稳定运行的问题。基于微气象、微地形对配电网的线路脆弱性进行分析&#xff0c;然后进行分布式电源接入位置与极端天气的关联性分析&#…

易图讯三维电子沙盘-大数据处理服务

易图讯科技10名高级大数据工程师&#xff0c;高效、快速进行POI、DEM、高清卫星影像、地形地貌、路网、矢量地图等海量大数据处理服务。 免费专业提供POI、AOI、DEM、高清卫星影像、地形地貌、路网、矢量地图等海量大数据处理服务。 1年更新2次POI、高清卫星影像。

Electron学习笔记(四)

文章目录 相关笔记笔记说明 六、数据1、使用本地文件持久化数据(1) 用户数据目录(2) 读写本地文件(3) 第三方库 2、读写受限访问的 Cookie3、清空浏览器缓存 相关笔记 Electron学习笔记&#xff08;一&#xff09;Electron学习笔记&#xff08;二&#xff09;Electron学习笔记…

数据结构-二叉树-红黑树

一、红黑树的概念 红黑树是一种二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&#xff0c;可以是Red或者BLACK&#xff0c;通过对任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出两倍&#xff0c;…

springcloud整合网关(springcloud-gateway) 跨域处理

pom引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- 服务注册 --><dependency><groupId>com.alibaba.cloud</groupId&…

Python 将Excel转换为多种图片格式(PNG, JPG, BMP, SVG)

目录 安装Python Excel库 使用Python将Excel工作表转换为PNG&#xff0c;JPG或BMP图片 使用Python将Excel特定单元格区域转换为PNG&#xff0c;JPG或BMP图片 使用Python将Excel工作表转换为SVG图片 有时&#xff0c;你可能希望以图片形式分享Excel数据&#xff0c;以防止他…

vue3使用setup模式的store报错

** setup store模式 $reset方法报错 ** 顾名思义就是 使用store 使用的是setup 语法模式 不能执行$reset 方法 解决方式&#xff1a; // main.ts import { createPinia } from pinia const pinia createPinia() pinia.use(({ store }) > {const initialState JSON.pars…

美股市场恒生指数冲刺19000点关口 地产股大涨

查查配5月10日电(中新财经记者 谢艺观)5月10日,港股现强势行情,恒生指数盘中一度冲至18993.28点,距离19000点关口仅一步之遥。 美港通证券以其专业的服务和较低的管理费用在市场中受到不少关注。该平台提供了实盘交易、止盈止损、仓位控制等功能,旨在为投资者提供更为全面的投…

.net core WebApi 部署 IIS

安装 IIS 下载需要的 net 版本安装 前往 .net core WebApi 项目打包 Program.cs var builder WebApplication.CreateBuilder(args);// 输出 builder.Services.AddControllers().AddJsonOptions(options > {options.JsonSerializerOptions.PropertyNamingPolicy null;…

怎么做自己的网站

现如今&#xff0c;拥有自己的网站已经成为现代生活中的一种标志。无论是个人博客、在线商店还是企业官网&#xff0c;都可以通过拥有一个网站来展示自己的个性、产品或服务。在这篇文章中&#xff0c;我将分享如何创建和管理自己的网站。 首先&#xff0c;你需要选择一个合适的…

unreal engine5.3.2 Quixel bridge无法登陆

UE5系列文章目录 文章目录 UE5系列文章目录前言一、问题定位二、解决方法 前言 这几天unreal engine5.3.2 Quixel bridge无法登陆&#xff0c;输入epic 账号和密码&#xff0c;然后在输入epic发送的验证码&#xff0c;总是提示登录失败。就算是使用科学上网依然无法登录。而且…