从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联
起来,建立映射关系。
SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。
@RequestMapping标识一个类:设置映射请求的请求路径的初始信息
@RequestMapping标识一个方法:设置映射请求请求路径的具体信息
如果类上和类中方法都含有注解,则需要先访问初始信息才能访问到具体信息 。
当有多个控制器时,@RequestMapping所处理的请求地址是一样的、请求路径是一样的,则SpringMVC就不知道该找那个控制器中的方法进行处理。因此,要保证所有控制器里面,@RequestMapping所能匹配到的请求地址是唯一的。通过在类上添加@RequestMapping注解设置请求路径的初始信息解决。
@RequestMapping注解的value属性通过请求的请求地址匹配请求映射
@RequestMapping注解的value属性是一个字符串类型的数组,表示该请求映射能够匹配多个请求地址所对应的请求
@RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射
DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<h1>首页h1>
body>
<a th:href="@{/hello/testRequestMapping}">测试RequestMapping注解的位置a><br>
<a th:href="@{/testRequestMapping}">测试RequestMapping注解的value属性-->/testRequestMappinga><br>
<a th:href="@{/test}">测试RequestMapping注解的value属性-->/testa><br>
html>
@Controller
//@RequestMapping("/hello")
public class RequestMappingController {
@RequestMapping(value = {"/testRequestMapping","/test"})
public String success(){
return "success";
}
}
@RequestMapping注解的method属性通过请求的请求方式(get或post)匹配请求映射
@RequestMapping注解的method属性是一个RequestMethod类型的数组,表示该请求映射能够匹配
多种请求方式的请求
若当前请求的请求地址满足请求映射的value属性,但是请求方式不满足method属性,则浏览器报错
405:Request method ‘POST’ not supported
请求方式不支持,出现这个错误就是当前请求方式不是请求映射所支持的请求方式
get和post的区别:
请求方式不支持(405错误)示例如下:
注:
1、对于处理指定请求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解,派生注解中仍然要添加value值,匹配请求映射。如:@GetMapping(“/testGetMapping”)等价于@RequestMapping(value = {“/testGetMapping”},method = {RequestMethod.GET})
处理get请求的映射–>@GetMapping
处理post请求的映射–>@PostMapping
处理put请求的映射–>@PutMapping
处理delete请求的映射–>@DeleteMapping
2、常用的请求方式有get,post,put,delete
但是目前浏览器只支持get和post,若在form表单提交时,为method设置了其他请求方式的字符
串(put或delete),则按照默认的请求方式get处理
若要发送put和delete请求,则需要通过spring提供的过滤器HiddenHttpMethodFilter,在
RESTful部分会讲到
@RequestMapping注解的params属性通过请求的请求参数匹配请求映射
@RequestMapping注解的params属性是一个字符串类型的数组,可以通过四种表达式设置请求参数
和请求映射的匹配关系:
<a th:href="@{/testParamsHeaders(username='admin',password=123456)}">测试RequestMapping注解的parmas属性-->/testParamsHeadersa>
@RequestMapping(value = "/testParamsHeaders",
params = {"username"})
public String testParamsHeaders(){
return "success";
}
HTTP Status 400 - Parameter conditions “username” not met for actual request parameters:
请求参数不匹配,params设置的请求参数条件不匹配时就会出现400错误
@RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射
@RequestMapping注解的headers属性是一个字符串类型的数组,可以通过四种表达式设置请求头信
息和请求映射的匹配关系
若当前请求满足@RequestMapping注解的value和method属性,但是不满足headers属性,此时页面显示404错误,即资源未找到 。
@RequestMapping(value = "/testParamsHeaders",
params = {"username","password!=123456"},
headers = {"Host=localhost:8081"})
public String testParamsHeaders(){
return "success";
}
以上述代码为例,由于Tomcat配置的地址为localhost:8080,因此headers属性不匹配,会报404错误。
<a th:href="@{/ana/testAnt}">测试@RequestMapping可以匹配ant风格的路径-->使用?a><br>
@RequestMapping("/a?a/testAnt")
public String testAnt(){
return "success";
}
如代码所示,@RequestMapping(“/a?a/testAnt”)可以与请求映射(th:href=“@{/ana/testAnt}”>)进行匹配。
原始传参方式:/deleteUser?id=1,通过?传参将id参数进行传输。
rest方式传参:/deleteUser/1,通过占位符的方式将请求路径中某些数据听过路径的方式传输到服务器中。
此时id=1,name=lyy;
SpringMVC路径中的占位符常用于RESTful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的 @RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,在通过 @PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参