Spring MVC学习 | @RequestMapping注解

24 篇文章 0 订阅


学习视频🎥:https://www.bilibili.com/video/BV1Ry4y1574R

一、简介

💬概述:见名知意,RequestMapping就是请求映射的意思

🔑作用:将浏览器的请求与处理请求的控制器方法关联起来,建立映射关系,保证一个请求对应一个控制器方法

💡 如果@RequestMapping只在方法上使用,则必须保证@RequestMappingvalue属性值唯一性,即在同一个控制器或者不同控制器中,不能出现value值相同的控制器方法,不然会报错,因为Spring MVC不能确定哪一个才是真正对应的处理请求方法,

🔑使用(详情见Spring MVC学习 | 简介&HelloWord

@RequestMapping("/")
public String showIndex() {
    return "index";
}

二、标识的位置

🔑查看源码:在注解的源码中有一个@Target注解,@Target注解有两个属性值,分别标识类型(类)和方法,说明@RequestMapping注解可以用来标识类和方法

@Target({ElementType.TYPE, ElementType.METHOD})

🔑在类和方法上标识的区别

  • 在类上标识:设置请求映射关系的初始信息,常用来处理项目中不同功能模块的相同请求

    ⭐ 处理不同模块相同请求的例子:用户模块user和订单模块order中都有商品列表信息list,两个模块对应两个控制器,两个控制器中都有请求路径为/list的控制器方法,为区分两个方法,需要在两个控制器类上也添加@RequestMapping注解,注解的value值分别为/user/order,分别对应请求路径/user/list/order/list,因此不同模块对商品信息列表的请求就能区分开,不会产生冲突

  • 在方法上标识:设置请求映射关系的具体信息

💡 如果在类上和方法上都添加了@RequestMapping注解,则对应请求的请求路径必须是类上的value值再加上方法上的value值,如果只加方法上的value值会找不到资源,因为在类上标识的是映射关系的初始信息,没有初始信息,Spring MVC也就找不到具体信息

🔑测试标识的位置

  • 只在方法上标识:见Spring MVC学习 | 简介&HelloWord

  • 在类和方法上都标识

    ① 创建控制器,在控制器上和方法上都添加@RequestMapping注解,不同的是类上的value值为/test,方法上的value值为/success

    @Controller
    @RequestMapping("/test")
    public class TestController {
        
        @RequestMapping("/success")
        public String showSuccess() {
            return "success";
        }
    }
    

    ② 创建对应的测试成功页面success.html

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>测试成功页面</title>
        </head>
        <body>
            <span>测试成功!</span>
        </body>
    </html>
    

    ③ 在首页index.html中添加超链接,点击跳转到测试成功页面

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
        <head>
            <meta charset="UTF-8">
            <title>首页</title>
        </head>
        <body>
            <h1>HelloWord</h1> <br/>
    
            <!-- 使用thymeleaf语法实现页面跳转,可以动态获取工程路径 -->
            <a th:href="@{/test/success}">测试页面</a>
        </body>
    </html>
    

三、主要属性

3.1 value

🔑特点

  • @RequestMapping注解的value属性通过请求路径与请求建立映射关系

  • value属性是一个String类型的数组,能够与多个请求地址建立映射关系,即一个控制器方法可以匹配多个请求路径(但一个请求/请求路径只能对应一个控制器方法)

    💡 value属性可以匹配多个请求路径,但对每一个请求的处理方式都是一样的,因为每一个请求对应的是同一个控制器方法

  • @RequestMapping注解中必须设置value属性,因为至少要有一个请求路径才能与请求建立映射关系

🔑使用:设置多个请求路径时,将每个请求路径写在{}

@RequestMapping(
	value = {"/test1", "/test2"}
)
public String showTest() {
    return "test";
}

🔑支持Ant风格

  • Ant风格是神魔

    • 概述:Ant风格是一种请求路径的匹配方式,通过一些通配符来模糊匹配
    • Ant通配符
    通配符说明
    表示任意单个字符,但不能是空,也不能是路径中的特殊字符(如/?等)
    *表示0个或多个字符,也不能是路径中的特殊字符
    **表示0或多层目录(多层路径),同样也不能是路径中的特殊字符

    💡 通配符**的书写方式为/**/xxx,不能是/a**/xxx/a**a/xxx,即**前后只能是/,不能再加其他字符,如果前后有其他字符,则**只是两个*(第二种Ant通配符)的作用,而不再表示目录

  • value属性中使用Ant通配符

    测试代码可以匹配的路径不能匹配的路径
    @RequestMapping("/a?a/testAnt")/a1a/testAnt、 /aaa/testAnt、 /a=a/testAnt/aaaa/testAnt、 /a/a/testAnt、/a?a/testAnt
    @RequestMapping("/a*a/testAnt")/aa/testAnt、 /aaaaa/testAnt、 /a!bxxa/testAnt/a/a/testAnt、 /a?a/testAnt
    @RequestMapping("/**/testAnt")/a/a/a/testAnt、 /testAnt、 /a1a/testAnt/a/a/?/a/testAnt

🔑使用占位符

❓ 引入概念——rest方式书写的路径:Spring MVC的路径中的占位符常用于RestFul风格中,与原始方式不同,rest方式可以直接将请求参数值作为路径中的一部分添加到路径中,不用写?和参数名,而是直接将参数值写到一个/后面,如

  • 原始方式:/deleteUser?id=1
  • rest方式:/deleteUser/1

💡 关于RestFul:Spring MVC学习 | 视图&RESTFul

  • 占位符的格式:{xxx},xxx表示请求参数名(要传输的数据名称)

  • 占位符作用与特点

    • 标识对应的传输数据(请求参数)

    • 占位符在路径中是占有位置的,不会是空(“”),即对应的参数或数据必须要有值

      💡 当value属性值设置为/test/{id}时,请求路径中就必须带有对应的请求参数值才能匹配成功,如/test/1。如果请求路径为/test/(或者/test),即没有id这个请求参数值,就无法匹配成功,页面会报404错误

  • 在控制器方法中的使用

    ① 在控制器中添加对应控制器方法,在@RequestMapping注解的value的属性值中通过占位符{xxx}取代请求参数值,占位符中的值对应请求参数的名称(id、username)。然后在控制器方法中添加形参,分别对应两个请求参数,并在形参前加上@PathVariable注解,注解的value值对应请求参数名,最后在方法中打印两个请求参数

    @RequestMapping("/testRest/{id}/{username}")
    public String showTestRest(@PathVariable("id") Integer id, 
                               @PathVariable("username") String username) {
        System.out.println("id:" + id);
        System.out.println("username:" + username);
        
        return "success";
    }
    

    @PathVariable注解的作用:获取占位符中对应参数名的数据值,并将数据值赋值给控制器方法的对应形参

    ② 在首页中添加对应的测试超链接,超链接路径采用rest方式,将请求参数值(1、Key)直接写到路径中传给服务器

    <a th:href="@{/testResr/1/Key}">测试路径中的占位符</a>
    

3.2 method

🔑特点

  • @RequestMapping注解的method属性通过请求方式与请求建立映射关系

  • method属性是一个RequestMethod类型的数组,能够与多个请求方式建立映射关系,即一个控制器方法可以匹配多个请求方式

  • 一般与表单提交一起使用,与表单<form>标签中的method属性相对应

  • method属性不是必须要设置的,但如果设置了,就必须要满足对应的请求方式,相当于给请求增加了限制条件

    💡 如果当前请求的请求路径满足value属性值,但不满足method属性值,即请求方式与method值不一样,页面会报405的错误

  • 如果不设置method属性,表示任意的请求方式都可以,即不以请求方式为限制条件,而不是默认使用get请求

🔑使用:设置多个请求方式时,将每个请求方式写在{}

💡 method属性值封装在枚举RequestMethod中,常用的有GETPOSTPUTDELETE

@RequestMapping(
    value = "/testMethod",
    method = {RequestMethod.GET, RequestMethod.POST}
)
public String showTestMethod() {
    return "success";
}

🔑派生注解:对于处理指定请求方式的控制器方法,Spring MVC提供了@RequestMapping的派生注解,分别对应每一个请求方式,省略了method属性的设置

  • 常用的几个请求方式及其对应的派生注解和CRUD

    ① GET请求 --> @GetMapping --> 查询操作
    ② POST请求 --> @PostMapping --> 添加操作
    ③ PUT请求 --> @PutMapping --> 更新修改操作
    ④ DELETE请求 --> @DeleteMapping – >删除操作

    💡 当前浏览器只支持GET(超链接、表单)和POST(表单),不支持后面两种,如果要发送PUT或DELETE请求,需要使用Spring的过滤器

  • 使用:与@RequestMapping注解的使用类似,同样需要设置value属性值

    // 只匹配GET请求
    @GetMapping("/testGet")
    public String showTestGet() {
        return "testGet";
    }
    
    // 只匹配POST请求
    @PostMapping("/testPost")
    public String showTestPost() {
    	return "testPost";
    }
    

3.3 params

🔑特点

  • @RequestMapping注解的params属性通过请求参数与请求建立映射关系

  • params属性是一个String类型的数组,属性值有四种表达方式,四种表达式对应不同映射关系

    param:表示请求中必须带有param请求参数,不管参数值是多少
    !param:表示请求中一定不能带有param请求参数
    param=value:表示请求中必须带有param请求参数,且参数值必须为value
    param!=value:表示请求中必须带有param请求参数,且参数值一定不能为value

  • 当前请求必须满足params属性中每一个值才能匹配成功,缺一不可,而对于valuemethod,只需满足它们中的一个属性值即可

    💡 如果当前请求只满足valuemethod,不满足params的每一个属性值,页面会报400错误,表示请求参数不匹配

🔑测试

① 在首页中添加超链接,跳转到成功页面success.html,并带上请求参数username和password

<a th:href="@{/testParams(username='Key',passowrd=123)}">测试param属性</a>

❓ thymeleaf语法中请求参数的书写

  1. 直接在请求路径/testParams后用?带上请求参数,不同请求参数用&隔开,即原始的方式
  2. 在请求路径后添加括号(),括号里面添加请求参数,不同请求参数用,隔开,thymeleaf会对这种写法进行解析

💡 字符串类型参数值可以直接写,不添加单引号'',但在thymeleaf语法中会报错(但又不影响功能)

② 在控制器中添加控制器方法,方式上添加@RequestMapping,注解上添加params属性

@RequestMapping(
    value = "/testParams",
    params = {"username", "password=123"}
)
public String showTestParams() {
    return "success";
}

3.4 headers

💡 header属性与params属性类似,因为请求参数和请求头信息都是键值对的形式

🔑特点

  • @RequestMapping注解的headers属性通过请求头信息与请求建立映射关系

  • headers属性也是一个String类型的数组,属性值有四种表达方式,四种表达式对应不同映射关系

    header:表示请求中必须带有header请求参数,不管参数值是多少
    !header:表示请求中一定不能带有header请求参数
    header=value:表示请求中必须带有header请求参数,且参数值必须为value
    header!=value:表示请求中必须带有header请求参数,且参数值一定不能为value

  • 当前请求必须满足headers属性中每一个值才能匹配成功,缺一不可,而对于valuemethod,只需满足它们中的一个属性值即可

    💡 如果当前请求不满足headers的每一个属性值,页面会报404错误,直接资源都找不到

🔑测试

① 测试链接

<a th:href="@{/success}">测试headers属性</a>

② 创建对应的控制器方法,设置headers属性值

@RequestMapping(
	value = "/success",
    headers = {"Host=localhost:8080"}
)
public String showSuccess() {
    return "success";
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值