一、简介
💬概述:见名知意,RequestMapping就是请求映射的意思
🔑作用:将浏览器的请求与处理请求的控制器方法关联起来,建立映射关系,保证一个请求对应一个控制器方法
💡 如果
@RequestMapping
只在方法上使用,则必须保证@RequestMapping
的value
属性值唯一性,即在同一个控制器或者不同控制器中,不能出现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通配符)的作用,而不再表示目录- 扩展学习: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
中,常用的有GET
、POST
、PUT
、DELETE
@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
属性中每一个值才能匹配成功,缺一不可,而对于value
和method
,只需满足它们中的一个属性值即可💡 如果当前请求只满足
value
和method
,不满足params
的每一个属性值,页面会报400错误,表示请求参数不匹配
🔑测试
① 在首页中添加超链接,跳转到成功页面success.html,并带上请求参数username和password
<a th:href="@{/testParams(username='Key',passowrd=123)}">测试param属性</a>
❓ thymeleaf语法中请求参数的书写
- 直接在请求路径
/testParams
后用?
带上请求参数,不同请求参数用&
隔开,即原始的方式- 在请求路径后添加括号
()
,括号里面添加请求参数,不同请求参数用,
隔开,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
属性中每一个值才能匹配成功,缺一不可,而对于value
和method
,只需满足它们中的一个属性值即可💡 如果当前请求不满足
headers
的每一个属性值,页面会报404错误,直接资源都找不到
🔑测试
① 测试链接
<a th:href="@{/success}">测试headers属性</a>
② 创建对应的控制器方法,设置headers
属性值
@RequestMapping(
value = "/success",
headers = {"Host=localhost:8080"}
)
public String showSuccess() {
return "success";
}