Spring MVC的常用注解

news2024/11/19 0:19:39

目录

@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/1141968.html

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

相关文章

Haskell Stack编译cannot encode character ‘8226‘ 错误 (Win10)

文章目录 Haskell Stack编译cannot encode character 8226 错误解决方案 &#xff1a; 更改Windows语言和区域设置(locale setting)为支持UTF-18 Haskell Stack编译cannot encode character ‘8226’ 错误 解决方案 &#xff1a; 更改Windows语言和区域设置(locale setting)为支…

测开(自动化测试selenium(WebDriver API))

一个简单的 Web自动化 演示 百度一下 迪丽热巴。这样的一个用户行为 &#xff0c;会涉及的那些操作呢&#xff1f;1、打开浏览器 2、在输入框里面输入关键词【迪丽热巴】PS&#xff1a;当然这里可能还涉及到一个操作&#xff0c;回车执行操作。或者说&#xff1a;点击 “百度一…

vue源码分析(四)——vue 挂载($mount)的详细过程

文章目录 前言一、使用RuntimeCompiler解析$mount的原因二、$mount 解析的详细过程1.解析挂载的#app执行了vm.$mount2. 通过$mount方法执行以下文件的mount方法3. 执行util工具文件夹中的query方法4. 执行query方法后返回$mount方法判断el是否是body5. 判断!options.render&…

Spring的执行流程与Bean的生命周期

目录 一、Spring的执行流程&#xff08;生命周期&#xff09; 二、Bean的生命周期 一、Spring的执行流程&#xff08;生命周期&#xff09; 首先在Spring的执行过程中会先启动容器&#xff0c;这里是将配置文件进行加载。根据配置文件完成Bean的实例化&#xff0c;比如是配置的…

通过cpolar分享本地电脑上有趣的照片:部署piwigo网页

通过cpolar分享本地电脑上有趣的照片&#xff1a;部署piwigo网页 文章目录 通过cpolar分享本地电脑上有趣的照片&#xff1a;部署piwigo网页前言1.Piwigo2. 使用phpstudy网页运行3. 创建网站4. 开始安装Piwogo 总结 前言 作为一个游戏爱好者&#xff0c;笔者在闲暇之余也会登录…

ChatGLM系列二:ChatGLM2的介绍及代码实践

一、介绍 2023年06月25日&#xff0c;清华大学开源了 ChatGLM2-6B 模型&#xff0c;是 ChatGLM 模型的升级版本。ChatGLM2-6B 在多个方面有显著提升&#xff1a;模型性能更强&#xff0c;在各种测试集上的表现更好&#xff1b;支持更长的上下文&#xff0c;最大上下文长度提升…

Java练习题2021-3

"某地大数据防疫平台记录了往来的所有防疫相关信息&#xff0c;包括 本地或外地人员、健康码颜色、接种疫苗情况、最近一次核酸结果、最近一次核酸检测时间等。 该地希望依据平台数据组织新一轮的疫苗接种&#xff0c;现有2针免疫的疫苗A和1针免疫的疫苗B。 对于本地人员&…

漏洞复现-Apache Druid 任意文件读取 _(CVE-2021-36749)

Apache Druid 任意文件读取 _&#xff08;CVE-2021-36749&#xff09; 漏洞信息 Apache Druid Version 0.22以下版本中存在安全漏洞CVE-2021-36749文件读取漏洞 描述 ​ 由于用户指定 HTTP InputSource 没有做出限制&#xff0c;可以通过将文件 URL 传递给 HTTP InputSourc…

氧化锌纳米线 Zinc oxide nanowires

氧化锌纳米线 英文&#xff1a;Zinc oxide nanowires 分子式&#xff1a;ZnO 直径&#xff1a; 50nm 长度&#xff1a; 20um 纯度: 99% 外观&#xff1a;白色 描述&#xff1a;纳米线可以被定义为一种具有在横向上被限制在100纳米以下(纵向没有限制)的一维结构。悬置纳米…

Builder 请进:波卡最新开发入门指南

撰文&#xff1a;Dennis Zoma 编译&#xff1a;OneBlock 社区 本文更新于 2023 年 10 月 3 日&#xff0c;来源&#xff1a;https://wiki.polkadot.network/docs/build-guide Polkadot 是一个区块链协议&#xff0c;有两个目标&#xff1a;在所有连接的平行链之间提供共享安全…

你绝对不知道的JMeter中如何实现接口之间的关联?

关联是Jmeter工具中非常重要的一个技术。因为在测试过程过有些数据是经常发生变化的&#xff0c;要获取并使用这些数据&#xff0c;就要使用关联。 比如&#xff1a;用户登录后&#xff0c;session信息都不同&#xff0c;有些操作要使用session&#xff0c;就需要将这个动态的信…

计算机网络_04_传输层

文章目录 1.什么是传输层2.传输层提供了什么服务3.传输层协议TCP 1.什么是传输层 传输层是OSI七层体系架构中的第四层, TCP/IP四层体系架构中的第二层, 从通信和信息处理两方面来看&#xff0c;“传输层”既是面向通信部分的最高层&#xff0c;与下面的三层一起共同构建进行网…

bootstap_小项目

通过bootstrap画一个简单的后台管理页面&#xff0c;知识有限&#xff0c;页面粗糙&#xff0c;一种记录方式 页面效果展示 首页页面代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible&qu…

Uva11059 Maximum Product(最大乘积)

1、题目 Uva 11059 2、题意 输入 n n n 个元素组成的序列 S S S&#xff0c;你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数&#xff0c;应输出0&#xff08;表示无解&#xff09;。 1 ≤ n ≤ 18 &#xff0c; − 10 ≤ S i ≤ 10 1 \le n \le 18&…

测试小白必看!接口测试必需掌握的知识要点!

接口测试 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 接口测试原理 通过测试程序模拟客…

SpringBoot中使用JdbcTemplate访问Oracle数据库

Oracle相信大家都不陌生吧&#xff0c;一个大型的数据库&#xff0c;至于数据库&#xff0c;我相信各位都比较熟悉了&#xff0c;一个软件系统&#xff0c;不论是我们常做的App、小程序、还是传统的web站点&#xff0c;我们都有用户的信息&#xff0c;相关业务的数据&#xff0…

公司如何禁止拷贝文件

公司如何禁止拷贝文件 安企神U盘管理系统下载使用 禁止拷贝文件是一种数据安全措施&#xff0c;通常在企业中用于保护重要信息和知识产权。禁止拷贝文件的方法需要根据公司的实际情况来选择和实施&#xff0c;以下是一些常见的方法&#xff0c;可用于防止文件拷贝&#xff1a…

Splunk 之 filed 恢复

1: 背景&#xff1a; 我们在工作过程中&#xff0c;或者是和很多team 进行交互的时候&#xff0c;总会有 filed 共用的情况&#xff0c;还有就是filed 会被相同权限的同事删除等等&#xff0c;这种情况下&#xff0c;就要求做好 /opt/splunk/etc/apps 的备份工作。 如果知道原…

Amazon Lambda 转 Container Image 方式部署

背景描述 对于从 Lambda Console通过 Author from scratch 创建的函数, 可以直接在浏览器中编辑代码和调试, 非常方便. 不过由于 Lambda 函数 Quota 限制 Console 编辑器最大 3MB, 包含 Layer 和自定义 Runtim 后最大 250MB, 并且此配额不支持提限, 因此当函数体量较大时就不适…

基于AI与物联网技术的智能视频监控系统架构剖析

智能视频监控系统正逐渐成为我们日常生活和工作中不可或缺的一部分。基于物联网的智能监控系统架构为我们在各个领域提供了更高效、智能化和安全的监控解决方案。本文将以旭帆科技EasyCVR视频监控云平台为例&#xff0c;介绍基于AI、物联网的智能监控系统的架构&#xff0c;并探…