@RequestMapping
一、作用
- 将请求与处理该请求的控制器方法进行匹配,建立映射关系
二、注解位置
-
标识一个类:设置映射请求的请求路径的初始信息
-
标识一个方法:设置映射请求的请求路径的具体信息
controller
@Controller @RequestMapping("/hello") public class HellController { @RequestMapping("/testIndex") public String toIndex() { return "index"; } }
html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>首页</h1> <!-- 此处的请求路径就需要写成:初始路径+具体路径 --> <a th:href="@{/hello/testIndex}">测试@RequestMapping注解位置</a> </body> </html>
三、value属性
-
value属性是一个String[ ]
,表示该请求映射可以匹配多个请求路径对应的请求 -
@RequestMapping注解中的
value属性必须设置
,连接的第一步就是通过请求路径匹配请求方法
html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>首页</h1> <a th:href="@{/test/testRequestMapping}">测试@RequestMapping注解</a><br/> <a th:href="@{/test}">测试@RequestMapping的value属性 - /test</a><br/> <a th:href="@{/testRequestMapping}">测试@RequestMapping的value属性 - /testRequestMapping</a><br/> </body> </html>
controller
@Controller public class RequestMappingController { @RequestMapping( value = {"/testRequestMapping","/test"} ) public String toSuccess() { return "success"; } }
-
如果value不匹配,就会报错400
四、method属性
-
通过请求的请求方式匹配对应的请求方法
-
如果@RequestMapping注解中不设置method属性,则默认接收任意请求方式
-
请求方式
get
是通过“?name1=value1&name2=value2…”连接在请求路径后的,不安全,数据量有限
post
有请求体,安全,数据量无限制
-
method属性匹配不成功,会报错405
html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>首页</h1> <a th:href="@{/test}">测试@RequestMapping的method属性</a><br/> <form th:action="@{/test}" method="post"> <input type="submit" value="测试@RequestMapping的method属性" /> </form><br/> </body> </html>
controller
@Controller public class RequestMappingController { @RequestMapping( value = {"/testRequestMapping","/test"}, method = {RequestMethod.GET} ) public String toSuccess() { return "success"; } }
-
如果就是匹配指定的请求方法,可以使用@RequestMapping的派生注解
@
Get
Mapping:专门处理get请求的映射@
Post
Mapping:专门处理post请求的映射@
Put
Mapping:专门处理put请求的映射@
Delete
Mapping:专门处理Delete请求的映射@Controller public class RequestMappingController { @GetMapping(value = {"/testRequestMapping","/test"}) public String toSuccess() { return "success"; } }
-
请求方式说明
目前,浏览器只支持get和post,在form表单中为method设置的put或delete请求方式,会被浏览器按照get请求来处理
若要发送put和delete请求,需要通过sping提供的过滤器HiddenHttpMethodFilter,在RESTful中使用
五、params属性
-
通过请求的请求参数匹配控制方法
-
params属性是一个字符串类型的数组,有四种表达式
“param”
:要求请求映射所匹配的请求必须携带param请求参数
“!param”
:要求请求映射所匹配的请求必须不能携带param请求参数
“param=value”
:要求请求映射所匹配的请求必须携带param请求参数,且param=value
“param!=value”
:要求请求映射所匹配的请求必须携带param请求参数,但是param!=value -
如果不匹配就会报错400
html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>首页</h1> <a th:href="@{/test(name, pwd=123456)}">测试@RequestMapping的params属性</a> </body> </html>
java
@Controller public class RequestMappingController { @RequestMapping( value = {"/testRequestMapping","/test"}, method = {RequestMethod.GET}, params = {"username","pwd=123456"} ) public String toSuccess() { return "success"; } }
六、headers属性
-
浏览器和服务器之间交互,必须使用HTTP协议进行,要求
浏览器向服务器发送请求
必须
以请求报文的形式
(Request Headers),服务器向浏览器响应数据必须以响应报文的形式(Response Headers)。
报文形式为一系列键值对。
-
通过请求头的请求信息匹配请求映射
-
headers属性是一个字符串类型的数组,有四种表达式
“header”
:要求请求映射所匹配的请求头
必须携带header请求参数
“!header”
:要求请求映射所匹配的请求头
必须不能携带header请求参数
“header=value”
:要求请求映射所匹配的请求头
必须携带header请求参数,且header=value
“header!=value”
:要求请求映射所匹配的请求头
必须携带header请求参数,但是header!=value
-
如果匹配不成功,报错404
html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>首页</h1> <a th:href="@{/test(name, pwd=123456)}">测试@RequestMapping的params属性</a> </body> </html>
java
@Controller public class RequestMappingController { @RequestMapping( value = {"/testRequestMapping","/test"}, method = {RequestMethod.GET}, params = {"username","pwd=123456"}, headers = {"Host=localhost:8081"} ) public String toSuccess() { return "success"; } }
七、对于value属性,支持ant风格的路径
-
?:表示任意的一个字符
但这个字符不能为空,不能为问号?或斜线/,因为在浏览器地址中,?和/有特殊的用途,?后拼接的是请求参数,/后表示的是目录层级
@Controller public class RequestMappingController { @RequestMapping( value = {"/a?a/test"} ) public String toSuccess() { return "success"; } }
<a th:href="@{/a1a/test}">测试value属性匹配ant风格的路径</a><br/>
-
*:表示任意的0个或多个字符
@Controller public class RequestMappingController { @RequestMapping( value = {"/a*a/test"} ) public String toSuccess() { return "success"; } }
<a th:href="@{/aa/test}">测试value属性匹配ant风格的路径</a><br/> <a th:href="@{/a234a/test}">测试value属性匹配ant风格的路径</a><br/>
-
**:表示任意的一层或多层目录,也可以是0层
@Controller public class RequestMappingController { @RequestMapping( value = {"/**/test"} ) public String toSuccess() { return "success"; } }
<a th:href="@{/a/ba/a/test}">测试value属性匹配ant风格的路径</a><br/>
注:/**/中不能写其它任意字符
八、针对value属性,SpringMVC支持路径中的占位符
-
两种风格对比
原始方式:/deleteUser?id=1
RESTful方式:/deleteUser/1
-
当请求路径中将
某些数据通过路径的方式传输到服务器
中,就可以在相应的**@RequestMapping注解的value属性中通过占位符{xxx} 表示传输的数据**,再
通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参
,且只能通过@PathVariable获取 -
代码示例
html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>首页</h1> <a th:href="@{/test/1}">测试value属性匹配ant风格的路径</a><br/> </body> </html>
java
@Controller public class RequestMappingController { @RequestMapping(value = {"/test/{id}"}) public String toSuccess1(@PathVariable("id")Integer id) { System.out.println(id); return "success"; } }