Spring MVC的常用注解(接收请求数据篇)

news2024/11/21 0:32:06

目录

@RequestMapping

例子:

@RequestMapping 支持什么类型的请求

        使 @RequestMapping 只支持特定的类型

@RestController

通过 HTTP 请求传递参数给后端

1.传递单个参数

        注意使⽤基本类型来接收参数的情况

2.传递多个参数

3.传递对象

4.@RequestParam 后端参数重命名(修改映射关系)

5.传递数组

6.传递集合

7.传递JSON数据 @RequestBody

8.获取URL中参数 @PathVariable

9.上传⽂件 @RequestPart

10.获取Cookie/Session @CookieValue @SessionAttribute HttpSession

11.获取Header @RequestHeader


@RequestMapping

       在 Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射,也就是浏览器连接程序的作⽤ ,后面客户端访问服务器时 URL 中就要包含 @RequestMapping 中的参数

        路由映射:当⽤户访问⼀个 URL 时, 将⽤户的请求对应到程序中某个类的某个⽅法的过程就叫路由映射.

例子:

@RestController
@RequestMapping("/UserController")
public class UserController {
    @RequestMapping("/sayHi")
    public String sayHi(){
        return "hello,Spring";
    }
}

        如上的代码,对于类 UserController,@RequestMapping 注解中的参数为 /UserController ,对于方法 sayHi(),@RequestMapping 注解中的参数为 /sayHi ,这就说明,客户端发送的 HTTP 请求要是想访问到 sayHi()这个方法,URL 中的路径就应该有 /UserController/sayHi,假如在本机上访问 URL 就应该为 127.0.0.1:8080/UserController/sayHi

        我们可以看到如下的效果

@RequestMapping 支持什么类型的请求

        我们知道 HTTP 请求分为 Get,Post 等类型,那 @RequestMapping 注解支持什么类型的 HTTP 请求呢?

        @RequestMapping 支持所有类型的请求,无论 HTTP 请求是 Get 还是 Post 都能够正确的响应

        使 @RequestMapping 只支持特定的类型

        可能我们在开发时有特殊的要求,需要只支持特定类型的 HTTP 请求

@RequestMapping(value = "/sayHi/post",method = RequestMethod.POST)
    public String sayHiPost(){
        return "hello,Spring,post";
    }

        当我们如上所示在 @RequestMapping 注解中设置 method 属性以后就可以使 sayHiPost 方法只处理 Post 类型的请求

        


@RestController

        同样也用下面这个代码作为例子

@RestController
@RequestMapping("/UserController")
public class UserController {
    @RequestMapping("/sayHi")
    public String sayHi(){
        return "hello,Spring";
    }
}

        当我们把类前面的 @RestController 这个注解删掉,会发送什么样的效果呢?

        当我们把 @RestController 注解删掉以后再次通过之前的 URL 访问就发现报了404(找不到系统资源)错误

        因为在一个 Spring MVC 项目中会有很多的类,Spring 如何知道要根据 URL 到哪些类中去寻找对应的方法呢,就是通过 @RestController 注解,只有类加上了 @RestController 注解,Spring 才会去进行访问,查找类中方法的 @RequestMapping 注解是否符合要求 ,才能找到对应的资源

        上面我们把 UserController 类的 @RestController 注解删掉,Spring 在遍历的时候就不会去访问 UserController 类,也就找不到 sayHi()方法,所以浏览器就显示了 404(找不到系统资源)错误


通过 HTTP 请求传递参数给后端

        传递不同的参数会需要用到不同的注解

1.传递单个参数

        接收单个参数,在 Spring MVC 中直接⽤⽅法中的参数就可以,⽐如以下代码:

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

        我们通过浏览器发送一个携带参数的 HTTP 请求查看获取参数的效果

        如上图,我们在 HTTP 请求的 Query String 中携带了 KEY为 name 的键值对,Spring 会自动获取 HTTP 请求中的键值对,将键值对的 KEY 值和方法中的形参名进行对比,要是相同就将 KEY 对应的 VALUE 赋值给形参

        注意使⽤基本类型来接收参数的情况

@RequestMapping("/getAge")
    public String getAge(int age){
        return "age:"+age;
    }

        如上的代码,我们接收 age 用的是 int 类型,假设我们发送的 HTTP 请求没有给 age 传参就会出现下面的情况

        

        同时,在服务器日志中会有以下的报错信息

        意思就是,int 类型的变量不能被置为 null ,因为要是 HTTP 请求访问对应的方法时,没有给方法传参,Spring 就会自动将方法需要的参数设置为 null ,而基本类型是无法设置为 null 的,所以要是在服务器中用基本类型来接收参数的话,HTTP 请求就必须要传参

        当然这是很麻烦的,所以我们通常不用基本类型来接收 HTTP 请求携带的参数,而是用对应的包装类,比如 int 的包装类 Integer

2.传递多个参数

和接收单个参数⼀样,直接使⽤⽅法的参数接收即可.使⽤多个形参.

@RequestMapping("/getNameAge")
    public String getNameAge(String name,Integer age){
        return "name:"+name+" age:"+age;
    }

        Spring 会自动获取 HTTP 请求中 Query String(GET) 或 body (POST)中传递的参数,将参数的 KEY 值与方法的 形参名进行匹配,匹配成功以后就将 Value 赋值给对应的形参

3.传递对象

        如果参数⽐较多时,⽅法声明就需要有很多形参.并且后续每次新增⼀个参数,也需要修改⽅法声明.我们不妨把这些参数封装为⼀个对象,后面如果传递的参数需要改变的话,直接修改对象就可以了,不用修改方法

        定义一个 Person 对象来接收参数

public class Person {
    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

        

 @RequestMapping("/getPerson")
    public String getPerson(Person person){
        return "person:"+person.toString();
    }

        如上代码,当 HTTP 请求访问 getPerson 方法时,Spring 就会去获取 HTTP 请求中的键值对,将键值对的 Key 值与 Person 对象的属性值进行匹配,匹配成功后便将 Value 赋值给对应的属性,初始化对象

 得到如下的效果:

4.@RequestParam 后端参数重命名(修改映射关系)

        在某些情况下,前端传递的 Key 值与后端的参数名可能不一致,这样就会导致传参失败,比如前端传递了一个 Key 值为 name 的属性,而后端却用 username 这个形参来接收,那肯定就会导致接收失败

        所以,如果我们想要使用 username 这个形参来接收 Key 值为 name 对应的 Value ,我们就要通过 @RequestParam 注解修改前后端参数之间的映射关系

@RequestMapping("/getUsername")
    public String getUsername(@RequestParam("name") String username){
        return "username:"+username;
    }

得到的结果如下

        但这也会导致一些问题出现,当我们不给 getUsername()方法传递参数时,会出现下面的情况

        此时我们的 HTTP 请求没有携带参数给 getUsername()方法,所以导致出现了 400(客户端错误),这是因为 @RequestParam 注解有个 required 属性默认为 true ,这就导致使用 @RequestParam 注解修改映射关系以后,方法中的形参就变为了一个必传参数,要是没传就会报错

        解决方法:将 required 属性改为 false 

 @RequestMapping("/getUsername")
    public String getUsername(@RequestParam(value = "name" ,required = false) String username){
        return "username:"+username;
    }

5.传递数组

        HTTP 请求中的参数名和后端方法中数组类型的形参名相同,且参数有多个,Sping 就会自动把所有的 Value 值传递给后端方法的数组中

@RequestMapping("/getArrayName")
    public String getArrayName(String[] arrayName){
        return arrayName.toString();
    }

        得到的结果如下:

6.传递集合

        传递集合与传递数组类似,都是 HTTP 请求中的一个参数对应多个值

        但 Spring 默认 HTTP 请求中一个参数对应多个值这种情况要将值传递给数组,如果我们要传递给列表的话,就需要使用 @RequestParam 注解绑定参数关系

@RequestMapping("/getListName")
    public String getListName(@RequestParam List<String> listName){
        return "listName:"+listName;
    }

        得到的结果如下

7.传递JSON数据 @RequestBody

        企业中传递数据最普遍的便是通过 JSON 格式来传递数据,JSON就是⼀种数据格式,有⾃⼰的格式和语法,使⽤⽂本表⽰⼀个对象或数组的信息,因此 JSON本质是字符串.主要负责在不同的语⾔中数据传递和交换.关于 JSON 推荐看应用层自定义协议(组织数据的格式)

        Spring MVC框架也集成了JSON的转换⼯具,我们可以直接使⽤,来完成JSON字符串和Java对象的互转

        接收 JSON 格式的数据,我们需要用到 @RequestBody 这个注解,这个注解翻译过来是请求正文,所以我们传递的数据必须是在正文(body)中,当然传递 JSON 格式的数据通常也是放到 HTTP 请求的 body 中传输的

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

        得到的结果如下:

        在 json 格式的数据转换成 java 对象的过程中,Spring 会去获取到 HTTP 请求中的 json 字符串,并获取到 Person 对象中的属性,将 json 字符串中的 Key 值与 Person 对象中的属性名进行对比,要是相同就将 Key 对应的 Value 通过 Person 类中的 set 方法进行赋值

8.获取URL中参数 @PathVariable

        该注解翻译过来是路径变量,主要作⽤在请求URL路径上的数据绑定,可以获取到 URL 指定位置上的数据

@RequestMapping("/getUrlPath/{id}/{name}")
    public String getUrlPath(@PathVariable Integer id,@PathVariable String name){
        return "id:"+id+" name:"+name;
    }

 得到的结果如下:

9.上传⽂件 @RequestPart

代码实现

@RequestMapping("/getFile")
    public String getFile(@RequestPart MultipartFile file) throws IOException {
        //获取文件名称
        String fileName=file.getOriginalFilename();
        //文件上传到指定路径
        file.transferTo(new File("D:/图片/"+fileName));
        return "文件的名称为"+fileName;
    }

        通过 postman 构造 HTTP 请求发送文件,效果如下

10.获取Cookie/Session @CookieValue @SessionAttribute HttpSession

.获取 Cookie 代码:

@RequestMapping("/getCookie")
    public String getCookie(@CookieValue(required = false) String name){
        return "cookie:"+name;
    }

获取 Session 代码1:

@RequestMapping("/getSession1")
    public String getSession1(@SessionAttribute(required = false) String name){
        return "name:"+name;
    }

获取 Session 代码2:

通过Spring MVC内置对象 HttpSession 来获取 

 @RequestMapping("/getSession2")
    public String getSession2(HttpSession session){
        // Session 的相关数据保存到 session 对象中了
        String name=(String) session.getAttribute("name");
        return "name:"+name;
    }

使用内置对象 HttpSession 相当于HttpSession session = request.getSession();

getSession()方法的默认参数是 true ,所以要是没有找到 Session 会创建一个 Session

11.获取Header @RequestHeader

获取 Header 代码:

@RequestMapping("/getHeader")
    public String getHeader(@RequestHeader("User-Agent") String userAgent){
        return "User-Agent"+userAgent;
    }

结果如下:

        在 HTTP 请求的 Header 中 User-Agent 属性对应用户的配置信息和浏览器版本,如上图,成功展示

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

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

相关文章

分布式:一文吃透分布式锁,Redis/Zookeeper/MySQL实现

目录 一、项目准备spring项目数据库 二、传统锁演示超卖现象使用JVM锁解决超卖解决方案JVM失效场景 使用一个SQL解决超卖使用mysql悲观锁解决超卖使用mysql乐观锁解决超卖四种锁比较Redis乐观锁集成Redis超卖现象redis乐观锁解决超卖 三、分布式锁概述四、Redis分布式锁实现方案…

Threejs 三维开发系列之Threejs基础概念

Threejs简介(是什么)Threejs是一个web端的3D图形引擎&#xff0c;能利用js创建和控制各种三维模型和场景(能用来做什么)可以用js开发各种复杂的三维场景、空间模型动画展示、各种三维小游戏(比如微信跳一跳就是Threejs开发)。(优势) 传统三维开发一般是c openGl&#xff0c;开发…

计算机考研 | 2014年 | 计算机组成原理真题

文章目录 【计算机组成原理2014年真题44题-12分】【第一步&#xff1a;信息提取】【第二步&#xff1a;具体解答】 【计算机组成原理2014年真题45题-8分】【第一步&#xff1a;信息提取】【第二步&#xff1a;具体解答】 【计算机组成原理2014年真题44题-12分】 &#xff08;1&…

SAML- 安全断言标记语言

一、概念 安全断言标记语言&#xff08;SAML&#xff09;是一种开放标准&#xff0c;用于在各方之间&#xff08;特别是身份提供商和服务提供商之间&#xff09;交换身份验证和授权数据。SAML 是一种基于XML的安全断言标记语言&#xff08;服务提供商用来做出访问控制决策的语句…

OpenCV—自动驾驶实时道路车道检测(完整代码)

自动驾驶汽车是人工智能领域最具颠覆性的创新之一。在深度学习算法的推动下,它们不断推动我们的社会向前发展,并在移动领域创造新的机遇。自动驾驶汽车可以去传统汽车可以去的任何地方,并且可以完成经验丰富的人类驾驶员所做的一切。但正确地训练它是非常重要的。自动驾驶汽…

MaxQuant的安装和使用(linux)

安装 conda create -n maxquant conda activate maxquant conda install -c bioconda maxquantmaxquant --help # 查看命令行参数用法 MaxQuant goes Linux 2018年&#xff0c;作者发布了MaxQuant的linux版本&#xff08;1.6.1.0&#xff09;。该版本主要依赖mono。

这三个视频解析工具,谁看了不说好用?

在这个自媒体时代&#xff0c;很多小伙伴都有下载视频的需求&#xff0c;今天就来给大家分享三个视频下载解析工具&#xff0c;不仅操作简单&#xff0c;而且十分高效&#xff0c;谁用谁知道&#xff01; 一、WeDown 一个在线视频下载网站&#xff0c;支持直接复制视频地址链接…

使用Python编写多因子量化策略详解

概要 多因子量化策略是一种基于股票市场因子进行量化分析的投资策略。该策略基于多个因子模型并结合市场数据&#xff0c;通过计算每支股票的综合得分并以此为基础进行股票的选取和权重分配。在本篇文章中&#xff0c;我们将介绍如何使用Python编写多因子量化策略。 数据收集…

【年终特惠】基于最新导则下生态环评报告编制技术暨报告篇、制图篇、指数篇、综合应用篇系统性实践技能提升

根据生态环评内容庞杂、综合性强的特点&#xff0c;依据生态环评最新导则&#xff0c;将内容分为4大篇章(报告篇、制图篇、指数篇、综合篇)、10大专题(生态环评报告编制、土地利用图的制作、植被类型及植被覆盖度图的制作、物种适宜生境分布图的制作、生物多样性测定、生物量及…

php yield定义生成器,加快foreach、for等循环速度

yield关键字用于定义生成器函数。生成器函数可以一次生成一个值&#xff0c;并在每次生成值后暂停其执行&#xff0c;直到请求下一个值。这使得生成器可以有效地处理大量数据或无限数据流 不使用yield使用yield执行方式函数会立即执行&#xff0c;并一次性返回所有结果。函数执…

【CPP】类和对象

1- Classes and Objects Structures A struct in C is a type consisting of a sequence of data membersSome functions/Statements are needed to operate the data members of an object of a struct type 不不小心操作错误&#xff0c;不小心越界 Classes You should b…

五分钟理解Java跨平台原理(适合小白)

JVM通俗的理解 Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机&#xff0c;即JVM&#xff08;Java Virtual Machine&#xff09;是实现这一特点的关键。JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机…

SMART PLC梯形速度曲线轨迹规划(追剪从轴控制)

在介绍本专栏之前,大家可以参考另一篇博图PLC的梯形加减速点动功能块介绍文章 梯形加减速点动功能块(博途SCL)_RXXW_Dor的博客-CSDN博客文章浏览阅读184次。SMART PLC斜坡函数SMART PLC斜坡函数功能块(梯形图代码)_RXXW_Dor的博客-CSDN博客斜坡函数Ramp的具体应用可以参看下…

vue3+element-plus 表格全选和跨页勾选,以及全选全部功能

目录 背景描述 实现效果 详细开发 1.模拟数据和页面布局 2.跨页勾选和点击勾选功能 3.表头全选 4. 全选全部 &#xff08;1&#xff09;全选后禁用表格勾选&#xff08;简单&#xff09; &#xff08;2&#xff09;真正意义上的全选全部&#xff08;难&#xff09; 总…

「Eolink Apikit 教程」如何快速创建有效的API监控任务?

API 监控能够确保 API 的稳定性。如果一个 API 出现故障或崩溃&#xff0c;它可能会导致整个应用程序无法正常工作。这对用户和业务来说可能是灾难性的。通过监控 API&#xff0c;开发团队可以及时发现问题并采取措施来修复它们&#xff0c;从而降低应用程序中断的风险。 作为…

(免费领源码)PHP#mysql高校学生考证资源共享小程序35055-计算机毕业设计项目选题推荐

摘要 大学生“考证”已经成为大学生的一门必修课&#xff0c;越来越多的大学生加入考证的行列&#xff0c;他们认为毕业找工作的时候&#xff0c;证书是多多益善。大学生“考证热”应该引起学生&#xff0c;学校、以及社会用人单位等多方面的高度重视。大学生考证热潮的形成&am…

拉普拉斯噪声

拉普拉斯噪声是指从拉普拉斯分布中抽取的随机变量。拉普拉斯分布是一种连续型概率分布&#xff0c;其概率密度函数为&#xff1a; 拉普拉斯噪声在差分隐私&#xff08;Differential Privacy&#xff09;领域中被广泛使用&#xff0c;原因有以下几点&#xff1a; 灵活性&#xf…

学习笔记|单样本t检验|P值|两独立样本均数T检验|规范表达|《小白爱上SPSS》课程:SPSS第五讲 | 两独立样本均数T检验,你会了吗?

目录 学习目的软件版本原始文档P值是假设检验的终极者两独立样本均数T检验一、实战案例二、案例解析三、统计策略四、SPSS操作1、正态性检验2、T检验&#xff08;独立样本T检验&#xff09;结果 五、结果解读Tips&#xff1a;补充知识 六、规范报告1、规范表格2、规范文字 注意…

2.基于Jetson Nano的嵌入式小车避障项目

英伟达jetbot智能小车 一.数据采集 数据采集的时候&#xff0c;一定要不用的光线&#xff0c;不同的方向&#xff0c;不同的环境。 一般500-600张 二.AI训练 三.AI部署 import torch import torchvision3.1 加载预训练模型 第一步&#xff1a;载入模型 model torchvisi…

gitlab添加ssh秘钥

安装git 右击&#xff1a;git bash here 1.首先用如下命令&#xff08;如未特别说明&#xff0c;所有命令均默认在Git Bash工具下执行&#xff09;检查一下用户名和邮箱是否配置&#xff08;gitlab支持我们用用户名或邮箱登录&#xff09;&#xff1a; git config --global --…