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 属性

POST 请求页面示例

请求方法包含: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 规范提供了具大的便利条件。