02、SpringMVC进阶:@RequestMapping使用详解

@RequestMapping

我们只要编写一个Controller接口,就轻松的实现了请求响应,其中@RequestMapping注解起到了至关重要的作用。

@RestController
@RequestMapping("/mvc")
public class MvcController {
   
     

    @RequestMapping("/test")
    public Object test() throws IOException {
   
     
        return "test";
    }
}

@RequestMapping翻译过来就是请求映射,它可以将请求和处理请求的控制器方法关联起来,建立映射关系。接收到指定的请求时,就会来找到在映射关系中对应的控制器方法来处理这个请求。

@RequestMapping注解源码:

@Target({
   
     ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
   
     
    String name() default "";

    @AliasFor("path")
    String[] value() default {
   
     };

    @AliasFor("value")
    String[] path() default {
   
     };

    RequestMethod[] method() default {
   
     };

    String[] params() default {
   
     };

    String[] headers() default {
   
     };

    String[] consumes() default {
   
     };

    String[] produces() default {
   
     };
}

注解位置

@RequestMapping可以作用于类和方法上,作用类时表示请求路径的初始信息,作用方法时表示请求路径的具体信息。

比如文档开头代码中,完整的请求路径为类上配置的路径加上方法上的路径,即 “/mvc/test”。

value和path属性

可以看到value和path配置项互为别名,并且可以配置多个。

    @AliasFor("path")
    String[] value() default {
   
     };
    @AliasFor("value")
    String[] path() default {
   
     };

可以配置多个value,下面代码表示可以通过/test、/aaa、/bbb来访问。

    @RequestMapping(value = {
   
     "/test","/aaa","/bbb"})
    public Object test() {
   
     
        return "test";
    }

method属性

可以通过method属性配置请求方式。

配置项为RequestMethod类型的数组,表示该请求映射能够匹配多种请求方式。未配置时,表示支持所有的请求方式,在实际开发中,应该配置具体的请求方式,mvc也提供了对应的Restful风格解决方案,后续会介绍。

    RequestMethod[] method() default {
   
     };

RequestMethod 是一个枚举,定义了所有的Http请求方式。

public enum RequestMethod {
   
     
    GET,
    HEAD,
    POST,
    PUT,
    PATCH,
    DELETE,
    OPTIONS,
    TRACE;
    private RequestMethod() {
   
     
    }
}

下面的代码表示当前请求支持GET、Post请求。

    @RequestMapping(value = {
   
     "/test","/aaa","/bbb"},method = {
   
     RequestMethod.GET, RequestMethod.POST})

当请求方式错误时,会抛出HttpRequestMethodNotSupportedException异常:
*

params属性

params属性,是一个字符串数组,用于对请求参数进行限制。

    String[] params() default {
   
     };

使用方式主要有以下几种

1、 直接写参数,表示必须携带当前参数访问;

    @RequestMapping(value = "/test001",params = {
   
     "name"})
    public Object test001(String name,Integer id) {
   
     
        return "test";
    }
}

1、 参数先加个“!”,表示不能携带这个参数访问;

@RequestMapping(value = "/test001",params = {
   
     "!name"})

1、 使用“=”表达式,表示这个参数必须为等号右边的值,才能访问;

    @RequestMapping(value = "/test001",params = {
   
     "name=lisi"})

1、 使用“!=”表达式,表示这个参数不能为等号右边的值,才能访问;

    @RequestMapping(value = "/test001",params = {
   
     "name!=lisi"})

当不符合params配置的表达式时,会抛出UnsatisfiedServletRequestParameterException异常。

*

headers属性

headers属性也是一个字符串数组,和params使用方法一致,是对请求头进行匹配限制。

    String[] headers() default {
   
     };

常用的表达式和params一样,这里只演示一种。

以下代码表示,请求头中不能携带Host属性。

 @RequestMapping(value = "/test001",headers = {
   
     "!Host"})

当请求头不满足配置规则时,这里抛出是的404异常
*

produces和consumes属性

produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回。

consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html。

以下代码表示提交的Content-Type和返回值类型都必须为application/json。

    @RequestMapping(value = "/test002",produces="application/json",consumes="application/json")
    public Object test002() {
   
     
        return "test";
    }

Ant风格支持

什么是Ant风格

Ant风格,是请求路径的一种匹配方式。

通配符 描述
表示任意的单个字符
* 表示任意的0个或多个字符
** 表示任意的一层或多层目录

以下代码表示,匹配“/mvc”加任意一个字符串的访问路径。

  • /mvc : 404异常
  • /mvc/a : 正常访问
  • /mvc/aa: 404异常
@RequestMapping("/mvc/?")

以下代码表示,匹配“/mvc/”加任意字符串的访问路径。

  • /mvc : 404异常
  • /mvc/a/sss/ : 404异常
  • /mvc/a : 正常访问
  • /mvc/aa: 正常访问
@RequestMapping("/mvc/*/")

以下代码表示,匹配“/mvc/”加任意一层或多层的访问路径,没有添加层也是可以的。

  • /mvc : 正常访问
  • /mvc/a : 正常访问
  • /mvc/a/sss/: 正常访问
@RequestMapping("/mvc/**/")

占位符URL支持

可以在@RequestMapping注解配置的访问路径中,通过{}占位符,映射某个参数的值,然后通过@PathVariable(“参数名称”) 传递给方法。常用于RESTful风格中。

以下代码中,直接访问“/test003/adsad/111”,可以将URL中的参数传递给test003方法。

    @RequestMapping(value = "/test003/{name}/{id}")
    public Object test003(@PathVariable String name,@PathVariable Integer id) {
   
     
        return "test003";
    }

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: