SpringMVC 学习(三)之 @RequestMapping 注解

news2024/10/6 6:42:18

目录

1 @RequestMapping 注解介绍

2 @RequestMapping 注解的位置

3 @RequestMapping 注解的 value 属性

4 @RequestMapping 注解的 method 属性

5 @RequestMapping 注解的 params 属性(了解)

6 @RequestMapping 注解的 headers 属性(了解)

7 @RequestMapping 注解的 produces 属性(了解)

8 @RequestMapping 注解的 consumes 属性(了解)

9 SpringMVC 支持 ant 风格的路径

10 SpringMVC 支持路径中的占位符(重点)


1 @RequestMapping 注解介绍

        @RequestMapping 注解作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。它主要有六种属性,分别是 value、method、header、params、produces、consumes。这六种属性之间是与的关系,联合使用会使请求地址的映射更加精确。

  • value:指定请求路径
  • method:指定请求方法
  • header:指定请求头信息
  • params:指定请求参数
  • produces:指定返回的媒体类型
  • consumes:指定处理的媒体类型

2 @RequestMapping 注解的位置

@RequestMapping 注解可以放在方法或类的上方,以指定请求的路径和其他相关的信息。

  • 放在处理请求的方法上,设置映射请求的请求路径的具体信息
@RequestMapping("/path")
public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
    // 处理请求的逻辑
    return "success";
}

上述代码中,收到请求路径为 /path 的请求,会调用 handleRequest 方法处理

  • 放在控制器类上,设置映射请求的请求路径的初始信息
@Controller
@RequestMapping("/api")
public class MyController {
    @RequestMapping("/users")
    public String handleUsersRequest(HttpServletRequest request, HttpServletResponse response) {
        // 处理用户请求的逻辑
        return "success";
    }
}

上述代码中,/api 是请求路径的初始信息,/users 是请求路径的具体信息,只有收到请求路径为 /api/users 的请求,才会调用 MyController 控制器中的 handleUsersRequest 方法。

3 @RequestMapping 注解的 value 属性

        @RequestMapping 注解的 value 属性通过请求地址匹配请求映射,是一个字符串类型的数组,表示该请求映射能够匹配多个请求地址所对应的请求,一般而言,必须设置 value,配合其它属性使映射更精确。

jsp
<a href="${pageContext.request.contextPath}/login/test1">请求路径: /login/test1</a><br/>
<a href="${pageContext.request.contextPath}/login/test2">请求路径: /login/test2</a>


控制器
@Controller
@RequestMapping("/login")
public class MyController {
    @RequestMapping(value = "/test1")
    public String handler1() {
        System.out.println("处理器1");
        return "success";
    }
    @RequestMapping(value = {"test2", "/test3"})
    public String handler2() {
        System.out.println("处理器2");
        return "success";
    }
}

4 @RequestMapping 注解的 method 属性

        @RequestMapping 注解的 method 属性通过请求的请求方式匹配请求映射,是一个 RequestMethod 类型的数组,表示该请求映射能够匹配多种请求方式的请求。若当前请求的请求地址满足请求映射的 value 属性,但是请求方式不满足 method 属性,则浏览器报错 405:Request method 'POST' not supported。

        常用的请求方式有 GET、POST、PUT、DELETE,但是目前的浏览器只支持 GET、POST 请求方法,若要发送 PUT 和 DELETE 请求,则需要通过 Spring 提供的过滤器 HiddenHttpMethodFilter。

对于处理指定请求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解

  • 处理 GET 请求的映射 --> @GetMapping
  • 处理 POST 请求的映射 --> @PostMapping
  • 处理 PUT 请求的映射 --> @PutMapping
  • 处理 DELETE 请求的映射 --> @DeleteMapping
<a href="${pageContext.request.contextPath}/login/test1">请求路径: /login/test1</a><br/>
<a href="${pageContext.request.contextPath}/login/test2">请求路径: /login/test2</a>

@Controller
@RequestMapping("/login")
public class MyController {
    @RequestMapping(value = "/test1", method = {RequestMethod.POST})
    public String handler1() {
        System.out.println("处理器1");
        return "success";
    }
    @RequestMapping(value = {"test2", "/test3"}, method = {RequestMethod.GET})
    public String handler2() {
        System.out.println("处理器2");
        return "success";
    }
}

5 @RequestMapping 注解的 params 属性(了解)

        @RequestMapping注解的 params 属性通过请求参数匹配请求映射,是一个字符串类型的数组,可以通过四种表达式设置请求参数和请求映射的匹配关系。注意,请求参数不要空格,空格也是一个字符。

  • "param":要求请求映射所匹配的请求必须携带 param 请求参数
  • "!param":要求请求映射所匹配的请求必须不能携带 param 请求参数
  • "param=value":要求请求映射所匹配的请求必须携带 param 请求参数且 param=value
  • "param!=value":要求请求映射所匹配的请求必须携带 param 请求参数但是 param!=value
<a href="${pageContext.request.contextPath}/login/test1?username=西施&password=123">请求路径: /login/test1?username=西施&password=123</a><br/>
<a href="${pageContext.request.contextPath}/login/test2?username=赵飞燕&password=111">请求路径: /login/test2?username=赵飞燕&password=111</a><br/>
<a href="${pageContext.request.contextPath}/login/test2?password=111">请求路径: /login/test2?password=111</a>

@Controller
@RequestMapping("/login")
public class MyController {
    @RequestMapping(
            // 请求路径只能为 /test1
            value = "/test1",
            // 请求方法既可以是 GET 方法,也可以是 POST 方法
            method = {RequestMethod.GET, RequestMethod.POST},
            // 请求路径不能必须包含 username 参数,参数 password 必须为 123
            params = {"username", "password=123"})
    public String handler1() {
        System.out.println("处理器1");
        return "success";
    }
    
    @RequestMapping(
            // 请求路径既可以为 /test2,也可以为 /test3
            value = {"/test2", "/test3"},
            // 请求方法必须是 GET 方法
            method = {RequestMethod.GET},
            // 请求路径中不能包含 username 参数,参数 password 不能为 123
            params = {"!username", "password!=123"}
    )
    public String handler2() {
        System.out.println("处理器2");
        return "success";
    }
}

测试结果

请求路径包含参数 username,且 password 要为 123,则成功访问

请求路径不能包含参数 username,且 password 要为 111,否则,访问失败

6 @RequestMapping 注解的 headers 属性(了解)

        @RequestMapping 注解的 headers 属性通过请求头信息匹配请求映射,是一个字符串类型的数组,可以通过四种表达式设置请求头信息和请求映射的匹配关系。和 params 属性用法一致。

  • "header":要求请求映射所匹配的请求必须携带 header 请求头信息
  • "!header":要求请求映射所匹配的请求必须不能携带 header 请求头信息
  • "header=value":要求请求映射所匹配的请求必须携带 header 请求头信息且 header=value
  • "header!=value":要求请求映射所匹配的请求必须携带 header 请求头信息且 header!=value

7 @RequestMapping 注解的 produces 属性(了解)

        @RequestMapping 注解的 produces 属性通过返回的媒体类型即请求头 Accept 中的媒体类型)匹配请求映射,是一个字符串类型的数组常用的媒体类型有以下几种:

  • text/plain:纯文本内容,例如 HTML、XML、CSS 等
  • image/jpeg:JPEG 图像
  • image/png:PNG 图像
  • audio/mpeg:MPEG 音频
  • video/mp4:MP4 视频
  • application/pdf:PDF 文件
  • application/msword:Microsoft Word 文档
  • application/vnd.ms-excel:Microsoft Excel 文档
  • application/x-www-form-urlencoded:URL 编码的表单数据
  • application/vnd.openxmlformats-officedocument.wordprocessingml.document:OpenXML 格式的 Word 文档
  • application/vnd.openxmlformats-officedocument.spreadsheetml.sheet:OpenXML 格式的 Excel 文档

注:

  • Content-Type: 告诉服务器当前发送的数据是什么格式
  • Accept : 用来告诉服务器,客户端能接收哪些格式,最好返回这些格式

8 @RequestMapping 注解的 consumes 属性(了解)

        @RequestMapping 注解的 consumes 属性通过处理的媒体类型即请求头 Content-Type 中的媒体类型,一般而言,POST 方法的请求头有 Content-Type,而 GET 方法的请求头没有 Content-Type)匹配请求映射,是一个字符串类型的数组。

<form action="${pageContext.request.contextPath}/login/test1" method="post">
    用户名: <input type="text" name="username"/> <br>
    密 码: <input type="password" name="password"/> <br>
    <input type="submit" />
</form>test2">请求路径: /login/test2</a><br/>

@Controller
@RequestMapping("/login")
public class MyController {
    @RequestMapping(
            // 请求路径只能为 /test1
            value = "/test1",
            // 请求路径请求头中的 Context-Type 只能为 application/x-www-form-urlencoded
            consumes = {"application/x-www-form-urlencoded"}
    )
    public String handler1(HttpServletRequest request) throws IOException {
        System.out.println("处理器1");
        System.out.println("Content-Type:" + request.getContentType());
        return "success";
    }
}

9 SpringMVC 支持 ant 风格的路径

  • ?:表示任意的一个字符
  • *:表示任意的 0 ~ n 个字符
  • **:表示任意的一层或多层目录,只能是 /**/xxx 的格式
<a href="${pageContext.request.contextPath}/xx/login/test1">请求路径: /xx/login/test1</a><br/>
<a href="${pageContext.request.contextPath}/xx/login/test2">请求路径: /xx/login/test2</a><br/>

@Controller
@RequestMapping("/**/login")
public class MyController {
    @RequestMapping(value = "/?est1")
    public String handler1() {
        System.out.println("处理器1");
        return "success";
    }

    @RequestMapping(value = "/te*")
    public String handler2() {
        System.out.println("处理器2");
        return "success";
    }
}

10 SpringMVC 支持路径中的占位符(重点)

        当请求将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping 注解的 value 属性中通过占位符 {xxx} 表示传输的数据再通过 @PathVariable 注解,将占位符所表示的数据赋值给控制器方法的形参。

<a href="${pageContext.request.contextPath}/login/test1/西施/123"> 请求路径: /login/test1/西施/123 </a><br/>


@Controller
@RequestMapping("/login")
public class MyController {
    @RequestMapping(value = "/?est1/{username}/{password}")
    public String handler1(@PathVariable("username") String username,
                           @PathVariable("password") String password) {
        System.out.println("处理器1");
        System.out.println("username:" + username + " password:" + password);
        return "success";
    }
}

通过请求路径的方式将“西施”和“123”两个值传递给处理器

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

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

相关文章

CSS三大定位方式(浮动、定位、弹性盒)详细解析

CSS三大定位方式 前言&#xff1a;作为一名前端开发&#xff0c;已经工作2年了。由于自己是半路出家&#xff0c;从嵌入式方向转到前端开发&#xff0c;都是边百度边开发&#xff0c;很多基础都不了解&#xff0c;只要解决问题就好&#xff0c;但是近来为了让自己知识体系化&a…

【数据结构(顺序表)】

一、什么是数据结构? 数据结构是由“数据”和“结构”两词组合而来。 什么是数据&#xff1f;常见的数值1、2、3、4.....、教务系统里保存的用户信息&#xff08;姓名、性别、年龄、学历等等&#xff09;、网页里肉眼可以看到的信息&#xff08;文字、图片、视频等等&#xff…

Yolo v9 “Silence”模块结构及作用!

论文链接&#xff1a;&#x1f47f; YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 代码链接&#xff1a;&#x1f47f; https://github.com/WongKinYiu/yolov9/tree/main Silence代码 class Silence(nn.Module):def __init__(self):supe…

Mysql运维篇(四) MHA

大佬博文 https://www.cnblogs.com/gomysql/p/3675429.html MySQL 高可用&#xff08;MHA&#xff09; - 知乎 一、MHA简介&#xff1a; MHA&#xff08;Master High Availability&#xff09;目前在MySQL高可用方面是一个相对成熟的解决方案&#xff0c;它由日本DeNA公司y…

【Linux进程】进程状态---进程僵尸与孤儿

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.进程排队2.进程状态…

uni-app nvue vue3 setup中实现加载webview,解决nvue中获取不到webview实例的问题

注意下面的方法只能在app端使用&#xff0c; let wv plus.webview.create("","custom-webview",{plusrequire:"none", uni-app: none, width: 300,height:400,top:uni.getSystemInfoSync().statusBarHeight44 }) wv.loadURL("https://ww…

Sentinel微服务流量治理组件实战上

目录 分布式系统遇到的问题 解决方案 Sentinel 是什么&#xff1f; Sentinel 工作原理 Sentinel 功能和设计理念 流量控制 熔断降级 Sentinel工作主流程 Sentinel快速开始 Sentinel资源保护的方式 基于API实现 SentinelResource注解实现 Spring Cloud Alibaba整合…

《隐私计算简易速速上手小册》第7章:隐私计算与云计算/边缘计算(2024 最新版)

文章目录 7.1 云计算中的隐私保护7.1.1 基础知识7.1.2 主要案例:使用 Python 实现云数据的安全上传和访问7.1.3 拓展案例 1:实现基于角色的访问控制7.1.4 拓展案例 2:使用 Python 保护 API 安全7.2 边缘计算的隐私问题7.2.1 基础知识7.2.2 主要案例:使用 Python 实现边缘设…

halcon中的一维测量

一维测量 像点到点的距离&#xff0c;边缘对的距离等沿着一维方向的测量都属于1D测量范畴。Halocn的一维测量首先构建矩形或者扇形的ROI测量对象&#xff0c;然后在ROI内画出等距离的、长度与ROI宽度一致的、垂直于ROI的轮廓线&#xff08;profile line&#xff09;的等距线。…

Jenkins解决Host key verification failed (2)

Jenkins解决Host key verification failed 分析原因情况 一、用OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时&#xff0c;OpenSSH会核对公钥。如果公钥不同&#xff0c;OpenSSH会发出警告&#xff0c;避免…

Java 学习和实践笔记(20):static的含义和使用

static的本义是静止的。在计算机里就表示静态变量。 在Java中&#xff0c;从内存分析图上可以看到&#xff0c;它与类、常量池放在一个区里&#xff1a; 从图可以看到&#xff0c;普通的方法和对象属性&#xff0c;都在heep里&#xff0c;而static则在方法区里。 static声明的…

Linux第65步_学习“Makefie”

学习“Makefie”&#xff0c;为后期学习linux驱动开发做铺垫。 1、在“/home/zgq/linux/atk-mp1”创建一个“Test_MakeFile”目录用于学习“Makefie”。 打开终端 输入“cd /home/zgq/linux/回车”&#xff0c;切换到“/home/zgq/linux/”目录 输入“mkdir Linux_Drivers回…

【AUTOSAR】--02 AUTOSAR网络管理相关参数

这是AUTOSAR网络管理梳理的第二篇文章&#xff0c;主要讲解AUTOSAR网络管理的相关参数。第一篇链接【01 AUTOSAR网络管理基础】。​ 相关参数有很多&#xff0c;我挑了一些相对重要的参数&#xff0c;分三部分进行讲解&#xff1a; 第一部分&#xff1a;比较常用&#xff0c…

uni-app 实现拍照后给照片加水印功能

遇到个需求需要实现&#xff0c;研究了一下后写了个demo 本质上就是把拍完照后的照片放到canvas里&#xff0c;然后加上水印样式然后再重新生成一张图片 代码如下&#xff0c;看注释即可~使用的话记得还是得优化下代码 <template><view class"content"&g…

​Sqli-labs靶场第9关详解[Sqli-labs-less-9]

Sqli-labs-Less-9 前言&#xff1a; SQL注入的三个条件&#xff1a; ①参数可控&#xff1b;&#xff08;从参数输入就知道参数可控&#xff09; ②参数过滤不彻底导致恶意代码被执行&#xff1b;&#xff08;需要在测试过程中判断&#xff09; ③参数带入数据库执行。&#…

C#_扩展方法

简述&#xff1a; 扩展方法所属类必需是静态类&#xff08;类名依据规范通常为XXXExtension&#xff0c;XXX为被扩展类&#xff09;扩展方法必需是公有的静态方法扩展方法的首个参数由this修饰&#xff0c;参数类型为被扩展类型 示例&#xff1a; static class DoubleExtens…

windows安装 RabbitMQ

首先打开 RabbitMQ 官网&#xff0c;点击 Get Started(开始) 点击 Download Installation(下载安装)。 这里提供了两种方式进行安装&#xff0c;我们使用第二种方法。 使用 chocolatey以管理用户身份使用官方安装程序 往下滑&#xff0c;第二种方法需要 Erlang 的依赖&#x…

蓝桥杯14届计算思维国赛U8组包含真题和答案

十四届蓝桥杯国赛考试计算思维 U8 组 答案在底部 第一题 以下选项中,( )是由美国计算机协会设立,对在计算机领域内作出重要贡献的个人授予的奖项 。A.图灵奖 C.菲尔兹奖 B.诺贝尔奖 D.普利策奖 第二题 希希去吃寿司。餐台上摆出了许多食物,可供大家自选。如下图所示。 …

Linux的文件操作,重拳出击( ̄︶ ̄)

Linux的文件操作 学习Linux的文件操作&#xff0c;一般需要知道一个文件如果你想要操作他&#xff0c;必须知道你对这个文件有什么操作的权限或者修改你自己对文件操作的权限。必须要知道文件有三种权限 r&#xff1a;可读 w&#xff1a;可写 x&#xff1a;可执行 在打开Linux…

访问raw.githubusercontent.com失败问题的处理

1 问题 GitHub上的项目的有些资源是放在raw.githubusercontent.com上的&#xff0c;通常我们在安装某些软件的时候会从该地址下载资源&#xff0c;直接访问的话经常容易失败。 # 安装operator kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/2.1…