1 @RequestMapping 定义请求规则
@RequestMapping 注解是用来映射请求,也就是通过它来指定控制器可以处理哪些 URL 请求。这个注解的使用非常简单,可以在类和方法上使用。
- 用在类上: 表示初步的请求映射信息,所有响应请求都是以该地址作为父路径。
- 用在方法上: 表示在父路径的基础上进一步细分映射信息。
- 类定义处未标注@RequestMapping:则映射的请求 URL 从方法处开始。
1.1 用在方法上
@Controller
public class HelloController {
//当请求地址为 /show 的时候,这个方法会被执行
@RequestMapping(value = "/show")
public String show1(){
return "success";
}
//请求为 /show1 或者 /show2 都可以访问到该方法
@RequestMapping(value = {"/show1","/show2"})
public String show2(){
return "success";
}
}
1.2 用在类上
一般情况下,可能会有很多类型的页面,如订单页面、用户页面等待。将注解定义在类上,可以进行页面分类处理。如下面 Controller 类处理用户页面的一些访问请求。
@Controller
@RequestMapping(value = "/user")
public class HelloController {
//意味着访问/user/show 返回success.jsp
@RequestMapping(value = "/show")
public String show1(){
return "success";
}
}
1.3 value 属性 —— 请求路径
可以是一个字符串,也可以是一个数组。
@RequestMapping(value = {"/testRequestMapping", "/test"})
public String testRequestMapping(){
return "success";
}对应页面
<a th:href="@{/testRequestMapping}"
>测试@RequestMapping的value属性-->/testRequestMapping</a
><br />
<a th:href="@{/test}">测试@RequestMapping的value属性-->/test</a><br />1.4 method 属性 —— 请求方法限定
method 属性
请求方法包含:get、post、delete、put。针对不同的请求方法,可以有不同的回复结果。
@Controller
@RequestMapping(value = "/user")
public class HelloController {
//表示该方法只能被 GET 请求访问
@RequestMapping(value = "/show",method = RequestMethod.GET)
public String showGet(){
return "success";
}
//表示该方法只能被 POST 请求访问
@RequestMapping(value = "/show",method = RequestMethod.POST)
public String showPost(){
return "success";
}
//表示该方法将同时接收通过 GET 和 POST 方式发来的请求
@RequestMapping(value = "/show3",method = {RequestMethod.GET,RequestMethod.POST})
public String show3(){
return "success";
}
}
注:如果你强行用 POST 请求来访问 GET 请求的话,或报 405 的错误!
后续更新,新增加注解: @PostMapping & @GetMapping & @PutMapping & @DeleteMapping & @PatchMapping。
其作用分别等同于 @RequestMapping(method = RequestMethod.XXX)。
@Controller
@RequestMapping(value = "/user")
public class HelloController {
//表示该方法只能被 GET 请求访问
@GetMapping(value = "/show")
public String showGet(){
return "success";
}
//表示该方法只能被 POST 请求访问
@PostMapping(value = "/show")
public String showPost(){
return "success";
}
}
对应页面:
<a th:href="@{/test}">测试@RequestMapping的value属性-->/test</a><br />
<form th:action="@{/test}" method="post">
<input type="submit" />
</form>1.5 params 属性 —— 请求参数
@RequestMapping 注解的 params 属性通过请求的请求参数匹配请求映射。
@RequestMapping 注解的 params 属性是一个字符串类型的数组,可以通过四种表达式设置请求参数和请求映射的匹配关系:
- “param”:要求请求映射所匹配的请求必须携带 param 请求参数
- “!param”:要求请求映射所匹配的请求必须不能携带 param 请求参数
- “param=value”:要求请求映射所匹配的请求必须携带 param 请求参数且 param=value
- “param!=value”:要求请求映射所匹配的请求必须携带 param 请求参数但是 param!=value
例如下面的表示:请求参数中,必须含有 username 和 password 属性,并且 password 属性的值不能为 123456.
@RequestMapping(
value = {"/testRequestMapping", "/test"}
,method = {RequestMethod.GET, RequestMethod.POST}
,params = {"username","password!=123456"}
)
public String testRequestMapping(){
return "success";
}注:若当前请求满足@RequestMapping 注解的 value 和 method 属性,但是不满足 params 属性,此时页面回报错 400:Parameter conditions “username, password!=123456” not met for actual request parameters: username={admin}, password={123456}
对应页面:
<a th:href="@{/test(username='admin',password=123456)"
>测试@RequestMapping的params属性-->/test</a
><br />1.6 headers 属性 —— 请求头
@RequestMapping 注解的 headers 属性通过请求的请求头信息匹配请求映射
@RequestMapping 注解的 headers 属性是一个字符串类型的数组,可以通过四种表达式设置请求头信息和请求映射的匹配关系
- “header”:要求请求映射所匹配的请求必须携带 header 请求头信息
- “!header”:要求请求映射所匹配的请求必须不能携带 header 请求头信息
- “header=value”:要求请求映射所匹配的请求必须携带 header 请求头信息且 header=value
- “header!=value”:要求请求映射所匹配的请求必须携带 header 请求头信息且 header!=value
若当前请求满足@RequestMapping 注解的 value 和 method 属性,但是不满足 headers 属性,此时页面显示 404 错误,即资源未找到
1.7 支持匹配 ant 风格的路径
?:表示任意的单个字符
*:表示任意的 0 个或多个字符
**:表示任意的一层或多层目录
注意:在使用 ** 时,只能使用 /**/xxx 的方式,否则只会被当作一层目录。如 /a**a/testAnt 只能匹配 /abba/testAnt 这样的路径,但是不能匹配 /abba/aaa/testAnt 双层路径。
@RequestMapping("/a?a/testAnt")
public String testAnt(){
return "success";
}<a th:href="@{/aaa/testAnt}">测试可以匹配 ant 风格的路径</a>1.8 @PathVariable 带占位符的 URL
原始方式:/deleteUser?id=1
rest 方式:/deleteUser/1
SpringMVC 路径中的占位符常用于 RESTful 风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping 注解的 value 属性中通过占位符{xxx}表示传输的数据,在通过@PathVariable 注解,将占位符所表示的数据赋值给控制器方法的形参
占位符用 {} 包裹起来,可以通过 @PathVariable 将 URL 中的占位符绑定到控制器的处理方法的参数中。带占位符的 URL 示例:
@Controller
@RequestMapping(value = "/user")
public class UserController {
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public String show(@PathVariable("id") Integer id) {
return "success";
}
}<a th:href="@{/testRest/1/admin}">测试路径中的占位符-->/testRest</a><br />在这个控制器中 show () 方法将可以接收 user/1、user/2、user/3 等等的路径请求,使用 @PathVariable 为应用实现 REST 规范提供了具大的便利条件。