匹配请求,请求映射过程

这篇具有很好参考价值的文章主要介绍了匹配请求,请求映射过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

@RequestMapping注解

注解的功能和位置

语法格式:@注解类型名(属性名=属性值, 属性名=属性值, 属性名=属性值…)

  • 使用某个注解的时候,如果注解只有一个属性并且属性名是value的话,value可以省略
  • 使用某个注解的时候,如果注解的属性值是数组并且数组中只有一个元素,大括号可以省略

根据某种关系 将请求路径和处理请求的控制器方法建立映射关系 ,当前端控制器接收到用户请求后根据映射关系找到对应控制类的控制器方法处理这个请求

  • 标识一个类:设置映射请求的请求路径的初始信息,为当前控制器所有的控制器方法的请求地址指定一个基准路径,未标识默认以WEB应用的根目录为起点
  • 标识一个方法:设置映射请求的请求路径的具体信息,初始信息看类上有无@RequestMapping注解
  • @RequestMapping注解设置的属性越多表示匹配的条件就越精确
@Controller
@RequestMapping("/test")
public class RequestMappingController {
	// 此时映射的请求的请求路径为:/test/testRequestMapping
    @RequestMapping("/testRequestMapping")
    public String testRequestMapping(){
        // 返回逻辑视图名称
        return "success";
    }
    // 控制器类可以定义多个处理方法
}

注解的value属性(必须设置)

value属性(String类型的数组)指定标识的控制器方法可以处理请求的请求路径

  • 如果请求地址没有匹配的控制器方法就会报404错误(资源未找到)
<a th:href="@{/testRequestMapping}">测试@RequestMapping的value属性-->/testRequestMapping</a><br>
<a th:href="@{/test}">测试@RequestMapping的value属性-->/test</a><br>

为了保证前端控制器能够根据请求匹配到请求映射的控制器方法,每个控制器的控制方法所能映射的请求路径是唯一的但映射的请求路径个数不唯一

@RequestMapping(value = {"/testRequestMapping", "/test"})
public String testRequestMapping(){
    return "success";
}

注解的method属性

method属性(RequestMethod枚举类型的数组)指定标识的控制器方法可以处理请求的请求方式(个数不唯一),默认什么请求方式都可以处理

  • 如果请求方式没有匹配的控制器方法就会405错误(前提是value属性已经匹配)
<!--点击超链接或在浏览器地址栏发起的是GET请求-->
<a th:href="@{/test}">测试@RequestMapping的method属性-->GET</a><br>
<!--只有通过form表单设置请求方式为post才能发起POST请求(默认也是get)-->
<form th:action="@{/test}" method="post">
    <input type="submit">
</form>
@RequestMapping(value = {"/testRequestMapping", "/test"},method = {RequestMethod.GET, RequestMethod.POST})
public String testRequestMapping(){
    return "success";
}

注解的派生注解

SpringMVC提供了@RequestMapping的派生注解可以直接指定标识的控制器方法可以处理请求的请求方式不需要再设置method属性

注解名 作用
@GetMapping 处理get请求的映射
@PostMapping 处理post请求的映射
@PutMapping 处理put请求的映射
@DeleteMapping 处理delete请求的映射

HTTP协议中的所有请求方式GET,HEAD,POS,PUT, PATCH,DELETE,OPTIONS,TRACE,但是目前浏览器只支持发送GET和POST请求

  • 想要发送其他请求需要使用Spring提供的过滤器HiddenHttpMethodFilter将表单原本的POST请求转换为PUT和DELETE请求(具体实现Restful中会讲)
<a th:href="@{/testGetMapping}">测试GetMapping注解-->/testGetMapping</a><br>
@GetMapping("/testGetMapping")
public String testGetMapping(){
    return "success";
}

注解的params属性(了解)

params属性(String类型的数组)指定标识的控制器方法可以处理请求的请求参数条件(是否携带参数,参数的值是否相同)

  • 请求参数要求多个条件都成立,如果有一个条件不成立就会报400错误(前提是value属性method属性都已经匹配)
属性 功能
“param” 匹配请求必须携带param请求参数
“!param” 匹配请求必须不能携带param请求参数
“param=value” 匹配请求必须携带param请求参数且值必须为value
“param!=value” 匹配请求可以不携带param请求参数,如果携带值一定不能是value
<!--在Thymeleaf使用(name=value,name=value..)的方式发起请求携带参数,也可以直接使用?传参的方式,但IDEA会报错-->
<a th:href="@{/test(username='admin',password=123456)">测试@RequestMapping的params属性-->/test</a><br>
@RequestMapping(
        value = {"/testRequestMapping", "/test"}
        ,method = {RequestMethod.GET, RequestMethod.POST}
    	// 要求请求参数必须携带username请求参数和password请求参数并且它的值不等于123456
        ,params = {"username","password!=123456"}
)
public String testRequestMapping(){
    return "success";
}

注解的headers属性(了解)

HTTP请求协议GET请求的具体报文

GET /servlet05/getServlet?username=lucy&userpwd=1111 HTTP/1.1                           #请求行
Host: localhost:8080                                                                    #请求头
Connection: keep-alive
sec-ch-ua: "Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
// 谷歌
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36
// 火狐
User-Agent	Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
// Referer具体的来源页面,从a跳转到b,b就是来源页面,直接访问的没有来源页面(防盗链)
Referer: http://localhost:8080/servlet05/index.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
                                                                                        #空白行
                                                                                        #请求体(在Query String parameters里面)

headers的属性(String类型的数组)指定标识的控制器方法可以处理请求的请求头参数条件不区分大小写(是否携带请求头参数,请求头参数的值是否相同)

  • 即使请求满足注解的value属性method属性,但是只要请求头不匹配就会报404错误(资源未找到)
属性 作用
“header” 匹配的请求必须携带header请求头信息
“!header” 匹配的请求必须不能携带header请求头信息
“header=value” 匹配的请求必须携带header请求头信息且值必须是value
“header!=value” 匹配请求可以不携带header请求参数,如果携带值值一定不能是value
@RequestMapping(
    value="/testParamsAndHeaders()",
    headers={"User-Agent=Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0"}
)
public String handle04(){
    // 火狐能访问但谷歌不能访问 
    return "success";
}

@RequestMapping(
            value = "/testParamsAndHeaders",
            params = {"username","password!=123456"},
    		// 访问的请求路径必须有来源页面(只能通过跳转的方式访问,不能直接访问)
            headers = {"referer"}
    )
public String testParamsAndHeaders(){
    return "success";
}

consumes和produces属性

consumes: 只接受内容类型是哪种的请求,规定请求头中的Content-Type

produces: 告诉浏览器返回的内容类型是什么,给响应头中加上Content-Type:text/html;charset=utf-8

value属性设置路径的风格

ant风格的URL

Ant风格的请求路径支持3种匹配符进行模糊匹配,在模糊和精确多个匹配的匹配情况下精确优先,匹配的时候请求路径中不能使用特殊符号如?/

匹配符 作用 举例
匹配任意的单个字符,不写或者写多个都不行 /ant?可以匹配/ant1等
* 匹配任意的0个或多个字符以及一层路径, 但是没有 ? 精确 /ant*可以匹配/ant01
** 匹配任意的一层或多层目录(包括零层),使用时前后不能有字符,只能使用/xxx/**/xxx的方式 /ant/**可以匹配/ant/01
// 精确匹配
@RequestMapping("/antTest01")
public String antTest01(){
    return "success";
}	

// 匹配一个字符,0个多个都不行
@RequestMapping("/antTest0?")
public String antTest02(){
    return "success";
}

// 匹配任意多个字符,0个或者多个
@RequestMapping("/antTest0*")
public String antTest03(){
    return "success";
}

// 匹配一层路径
@RequestMapping("/a/*/antTest01")
public String antTest04(){
    return "success";
}

// 匹配多层路径
@RequestMapping("/a/**/antTest01")
public String antTest05(){
    return "success";
}

@PathVariable注解

请求路径中携带请求参数的两种方式

  • 使用查询字符串携带数据(传统方式): /deleteUser?id=1
  • 使用路径的方式携带数据(Rest风格): /user/delete/1

@RequestMapping注解映射的请求路径中使用{变量名}占位,然后在控制器方法形参上使用@PathVariable("变量名")获取路径上占位符的值并赋值给形参文章来源地址https://www.toymoban.com/news/detail-472981.html

  • 使用占位符既可以匹配到正确的请求路径,也可以在控制器方法的形参上获取占位符的值即请求参数的值
  • 浏览器地址栏上的请求路径和占位符是一一对应的关系(多层路径对应多个占位符),发起请求时要求必须为占位符赋值否则报404错误
<a th:href="@{/testRest/1/admin}">测试路径中的占位符-->/testRest</a><br>
@RequestMapping("/testRest/{id}/{username}")
// 如果控制器方法形参的变量名和路径占位符中的变量名相同,@PathVariable注解的value属性值可以省略
public String testRest(@PathVariable("id") String id, @PathVariable("username") String username){
    // id:1,username:admin
    System.out.println("id:"+id+",username:"+username);
    return "success";
}

到了这里,关于匹配请求,请求映射过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 详解 SpringMVC 的 @RequestMapping 注解

    @RequestMapping是一个用于映射HTTP请求到处理方法的注解,在Spring框架中使用。它可以用于控制器类和处理方法上,用来指定处理不同URL路径的请求,并定义请求的方法(GET、POST等)、请求参数、请求头等。 @RequestMapping注解的常用属性包括 : value:用于指定URL路径,可以是单个

    2024年02月11日
    浏览(37)
  • 【Java EE】@RequestMapping注解

    在Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射 ,也就是浏览器连接程序的作⽤ 我们先来看看代码怎么写 创建⼀个 TalkController 类,实现⽤⼾通过浏览器和程序的交互,具体实现代码如下: 这时候我们使用浏览器访问 http://127.0.0.1:8080/hi 就可访问 @RequestMapping 是Spring Web M

    2024年04月09日
    浏览(43)
  • 3、SpringMVC之RequestMapping注解

    创建名为spring_mvc_demo的新module,过程参考2.1节 细节请参考2.6节 从注解名称上可以看出,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系; SpringMVC 的前端控制器(DispatcherServlet)接收到请求后,就会在映射关系中找到对应的控制器方法来处

    2024年02月08日
    浏览(39)
  • Spring MVC-@RequestMapping注解详解

    目录 1、@RequestMapping注解的作用 2、@RequestMapping注解的位置 3、value属性 (1)基础用法 (3)路径中的占位符(重点) 4、method属性 5、params属性(了解) 6、headers属性(了解) @RequestMapping注解的作用,就是 将请求和处理请求的控制器方法关联起来 ,建立映射关系。 SpringMVC接

    2023年04月24日
    浏览(46)
  • Spring MVC 的RequestMapping注解

    作用:用于建立请求URL和处理请求方法之间的对应关系。 出现位置: 类上: 请求 URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以按照模块化管理,例如: 账户模块: /account /add /account /update /account

    2024年02月02日
    浏览(40)
  • Spring MVC学习之——RequestMapping注解

    用于建立请求URL和处理请求方法之间的对应关系。 value:指定请求的实际地址,可以是一个字符串或者一个字符串列表。 value可以不写,直接在括号中写,默认就是value值 @RequestMapping(value=“/hello”) public String hello(){ return…} method:指定请求的方式,可以是GET、POST、PUT、DELE

    2024年01月18日
    浏览(56)
  • SpringMVC中@RequestMapping注解的详细说明

    @RequestMapping 是Spring MVC中一个用于映射HTTP请求和控制器方法之间关系的注解。它用于定义控制器方法如何响应特定的HTTP请求,包括GET、POST、PUT、DELETE等。以下是 @RequestMapping 注解的详细说明: 基本用法: @RequestMapping 用于注解一个控制器方法,指定该方法应该处理的请求路径

    2024年02月07日
    浏览(43)
  • 学习注解的使用模拟RequestMapping解析path

    注解在后端开发过程中提供了许多的便利,提高了代码简洁性和可读性,在应用程序中占据越来越重要的作用,很有学习的必要,接下来会通过代码来完成对类、方法、属性注解的解析。 回到顶部 代理类会使我们获取注解失败,要做特殊处理。

    2024年02月16日
    浏览(48)
  • Spring MVC @Controller和@RequestMapping注解

    @Controller 注解可以将一个普通的 Java 类标识成控制器(Controller)类,示例代码如下。 Spring MVC 是通过组件扫描机制查找应用中的控制器类的,为了保证控制器能够被 Spring MVC 扫描到,我们还需要在 Spring MVC 的配置文件中使用  context:component-scan/  标签,指定控制器类的基本包

    2024年02月09日
    浏览(50)
  • @RequestMapping和@FeginClient注解不能同时使用的问题

    在新版本SpringCloud中,增加了契约验证,当一个类上同时使用@RequestMapping 和 @FeignClient 注解时,会抛出此异常信息:java.lang.IllegalArgumentException: @RequestMapping annotation not allowed on @FeignClient interfaces 将类上的@RequestMapping注解删掉,将路径更改到每个方法的路径上即可,然后使用@

    2024年02月03日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包