当前位置: 首页 > news >正文

Spring MVC的常用注解

目录

@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;}@Overridepublic 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 属性对应用户的配置信息和浏览器版本,如上图,成功展示

相关文章:

Spring MVC的常用注解

目录 RequestMapping 例子&#xff1a; RequestMapping 支持什么类型的请求 使 RequestMapping 只支持特定的类型 RestController 通过 HTTP 请求传递参数给后端 1.传递单个参数 注意使⽤基本类型来接收参数的情况 2.传递多个参数 3.传递对象 4.RequestParam 后端参数…...

vim 使用文档笔记

1. i&#xff1a;进入编辑模式 2. ESC&#xff1a;进入一般命令模式 3. h 或 ←&#xff1a;光标向左移动一个字符 4. j 或 ↓&#xff1a;光标向下移动一个字符 5. k 或 ↑&#xff1a;光标向上移动一个字符 6. l 或 →&#xff1a;光标向右移动一个字符 7. num&#xf…...

274. H 指数

文章目录 一、题目1、题目描述2、基础框架3、原题链接 二、解题报告1、思路分析1.1 方案一1.2 方案二 2、时间复杂度3、代码详解3.1 方案一3.2 方案二 三、本题小知识 一、题目 1、题目描述 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论…...

0基础学习PyFlink——用户自定义函数之UDTAF

大纲 UDTAFTableAggregateFunction的实现累加器定义创建累加 返回类型计算 完整代码 在前面几篇文章中&#xff0c;我们分别介绍了UDF、UDTF和UDAF这三种用户自定义函数。本节我们将介绍最后一种函数&#xff1a;UDTAF——用户自定义表值聚合函数。 UDTAF UDTAF函数即具备了…...

SQLi靶场

SQLi靶场 less1- less2 &#xff08;详细讲解&#xff09; less 1 Error Based-String (字符类型注入) 思路分析 判断是否存在SQL注入 已知参数名为id&#xff0c;输入数值和‘ 单引号‘’ 双引号来判断&#xff0c;它是数值类型还是字符类型 首先输入 1 &#xff0c; 发现…...

重庆开放大学学子们的好帮手

作为一名电大学员&#xff0c;我有幸目睹了一个令人惊叹的学习工具的诞生——电大搜题微信公众号。这个创新应用为重庆开放大学&#xff08;广播电视大学&#xff09;的学子们提供了便捷、高效的学习资源&#xff0c;成为他们的得力助手。 重庆开放大学是一所为全日制在职人员提…...

机器学习-学习率:从理论到实战,探索学习率的调整策略

目录 一、引言二、学习率基础定义与解释学习率与梯度下降学习率对模型性能的影响 三、学习率调整策略常量学习率时间衰减自适应学习率AdaGradRMSpropAdam 四、学习率的代码实战环境设置数据和模型常量学习率时间衰减Adam优化器 五、学习率的最佳实践学习率范围测试循环学习率&a…...

【Vue3-Flask-BS架构Web应用】实践笔记1-使用一个bat脚本自动化完整部署环境

前言 近年来&#xff0c;Web开发已经成为计算机科学领域中最热门和多产的领域之一。Python和Vue.js是两个备受欢迎的工具&#xff0c;用于构建现代Web应用程序。在本教程中&#xff0c;我们将探索如何使用这两个工具来创建一个完整的Web项目。我们将完成从安装Python和Vue.js到…...

工作小计-GPU硬编以及依赖库 nvcuvidnvidia-encode

工作小计-GPU编码以及依赖库 已经是第三篇关于编解码的记录了。项目中用到GPU编码很久了&#xff0c;因为yuv太大&#xff0c;所以编码显得很重要。这次遇到的问题是环境的搭建问题。需要把开发机上的环境放到docker中&#xff0c;以保证docker中同样可以进行GPU的编码。 1 定…...

前端 JS 经典:宏任务、微任务、事件循环(EventLoop)

1. 前言概览 js 是一门单线程的非阻塞的脚本语言 单线程&#xff1a;只有一个主线程处理所有任务 非阻塞&#xff1a;有异步任务&#xff0c;主线程挂起这个任务&#xff0c;等异步返回结果再根据一定规则执行 2. 宏任务与微任务 都是异步任务宏任务&#xff1a;script 标签&a…...

电子邮件发送接收原理(附 go 语言实现发送邮件)

前言 首先要了解电子邮件的发送接收&#xff0c;不是点到点的。我想给你传达个消息&#xff0c;不是直接我跑到你家里喊你&#xff1a;“嘿&#xff0c;xxx&#xff0c;是你的益达&#xff0c;快拿走”。 而是类似快递的发送收取方式&#xff0c;是有服务器的中转的。我先将我…...

体系结构评估——(三)风险承担者

风险承担者分为系统生产者、系统消费者、系统服务人员和其他四大类。 其中系统生产者有&#xff1a;软件系统架构师、开发人员、维护人员、集成人员、测试人员、标准专家、 性能工程师、安全专家、项目经理、产品线经理。 系统消费者有&#xff1a;客户、最终用户、应用开发…...

【HarmonyOS】元服务卡片展示动态数据,并定点更新卡片数据

【关键字】 元服务卡片、卡片展示动态数据、更新卡片数据 【写在前面】 本篇文章主要介绍开发元服务卡片时&#xff0c;如何实现卡片中动态显示数据功能&#xff0c;并实现定时数据刷新。本篇文章通过实现定时刷新卡片中日期数据为例&#xff0c;讲述展示动态数据与更新数据功…...

SaveFileDialog.OverwritePrompt

SaveFileDialog.OverwritePrompt 获取或设置一个值&#xff0c;该值指示如果用户指定的文件名已存在&#xff0c;Save As 对话框是否显示警告。 public bool OverwritePrompt { get; set; } OverwritePrompt 控制在将要在改写现在文件时是否提示用户 https://vimsky.com/…...

oracle统计信息

1. 查看表的统计信息 1.建表 SQL> create table test as select * from dba_objects;2.查看表的统计信息 select owner, table_name, num_rows, blocks, avg_row_lenfrom dba_tableswhere owner SCOTTand table_name TEST; OWNER TABLE_NAME NUM_ROWS BLO…...

LeetCode 面试题 16.01. 交换数字

文章目录 一、题目二、C# 题解 一、题目 编写一个函数&#xff0c;不用临时变量&#xff0c;直接交换 numbers [a, b] 中 a 与 b 的值。 示例&#xff1a; 输入: numbers [1,2] 输出: [2,1] 提示&#xff1a; numbers.length 2-2147483647 < numbers[i] < 214748364…...

手机apn介绍

公司遇到一件很棘手的事情&#xff0c;app发版之后&#xff0c;长江以北地方的用户网络信号很好&#xff0c;但是打开app之后网络连接不上&#xff0c;而长江以南的用户网络却很好。大家找了很多资料&#xff0c;提出一些方案&#xff1a; 1、是不是运营商把我们公司的ip给限制…...

垃圾回收系统小程序

在当今社会&#xff0c;废品回收不仅有利于环境保护&#xff0c;也有利于资源的再利用。随着互联网技术的发展&#xff0c;个人废品回收也可以通过小程序来实现。本文将介绍如何使用乔拓云网制作个人废品回收小程序。 1. 找一个合适的第三方制作平台/工具&#xff0c;比如乔拓云…...

【随机过程】布朗运动

这里写目录标题 Brownian motion Brownian motion The brownian motion 1D and brownian motion 2D functions, written with the cumsum command and without for loops, are used to generate a one-dimensional and two-dimensional Brownian motion, respectively. 使用cu…...

基于机器视觉的车道线检测 计算机竞赛

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…...

C语言文件读写,文件相关操作

文章目录 C语言文件读写&#xff0c;文件相关操作1.C语言万物皆是地址&#xff0c;文件读操作2.文件的写3.文件的复制4.获取文件的大小5.文件的加密解密 C语言文件读写&#xff0c;文件相关操作 1.C语言万物皆是地址&#xff0c;文件读操作 // // Created by MagicBook on 20…...

竞赛选题 深度学习卷积神经网络的花卉识别

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…...

CMake教程 - basic point

CMake教程 - basic point 1 - Building a Basic Project 最基本的CMake项目是由单个源代码文件构建的可执行文件。对于像这样简单的项目&#xff0c;只需要一个带有三个命令的CMakeLists.txt文件。 注意&#xff1a;尽管CMake支持大写、小写和混合大小写命令&#xff0c;但小…...

day52--动态规划11

想死&#xff0c;但感觉死的另有其人&#xff0c;&#xff0c;怎么还在动态规划&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV 第一题&#xff1a;买卖股票的最佳时机III 给定一个数组&#xff0c;它…...

Jenkins入门级安装部署

前言 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。通常&#xff0c;项目中常用Jenkins作为编译打包项目的工具&#xff0…...

tcpdump 异常错误

tcpdump 进行抓包的时候&#xff0c;-w 提示 Permission denied&#xff1a; sudo tcpdump -w test1.log tcpdump: test1.log: Permission denied 开始以为是用户权限的问题&#xff0c;后来换用 root 账户还是不行&#xff0c;经搜索&#xff0c;是 AppArmor 的问题。 解决方…...

如何绘制【逻辑回归】中threshold参数的学习曲线

threshold参数的意义是通过筛选掉低于threshold的参数&#xff0c;来对逻辑回归的特征进行降维。 首先导入相应的模块&#xff1a; from sklearn.linear_model import LogisticRegression as LR from sklearn.datasets import load_breast_cancer from sklearn.model_selecti…...

4.1 数据库安全性概述

思维导图&#xff1a; 前言&#xff1a; - **第一章回顾**&#xff1a;数据库特点 - 统一的数据保护功能&#xff0c;确保数据安全、可靠、正确有效。 - 数据保护主要涵盖&#xff1a; 1. **数据的安全性**&#xff08;本章焦点&#xff09; 2. 数据的完整性&#xff08;第…...

tftp服务的搭建

TFTP服务的搭建 1 先更新一下apt包 sudo apt-get update2 服务器端(虚拟机上)安装 TFTP相关软件 sudo apt-get install xinetd tftp tftpd -y3 创建TFTP共享目录 mkdir tftp_sharetftp_shaer的路径是/home/cwz/tftp_share 3.1 修改共享目录的权限 sudo chmod -R 777 tftp…...

c语言简介

C 语言最初是作为 Unix 系统的开发工具而发明的。 1969年&#xff0c;美国贝尔实验室的肯汤普森&#xff08;Ken Thompson&#xff09;与丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;一起开发了 Unix 操作系统。Unix 是用汇编语言写的&#xff0c;无法移植到其他计算机&…...