欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深入理解Spring MVC-处理器映射

程序员文章站 2022-07-15 11:45:14
...

如果Web工程是使用了Spring MVC,那么他在启动阶段就会将注解@RequestMapping所配置的内容保存到处理器映射(HandlerMapping)机制中去,然后等待请求的到来,通过拦截请求信息与handlerMapping进行匹配,找到对应的处理器(它包含控制器的逻辑),并将处理器及其拦截器保存到HandlerExecutionChain对象中,返回给DispatcherServlet,这样DispatcherServlet就可以运行他们了。从上述论述中可以看到,HandlerMapping的主要任务是将请求定位到具体的处理器上。

关于@RequestMapping的配置项不多,这里通过源码来学习,代码清单如下所示


package org.springframework.web.bind.annotation;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
//配置请求映射名称
    String name() default "";
    //通过路径映射
    @AliasFor("path")
    String[] value() default {};
//通过路径返回的path映射
    @AliasFor("value")
    String[] path() default {};
//限制只响应http请求类型,如POST,GET,PUT,OPTIONS,TRACE等
//默认情况下,可以响应全部的请求类型
    RequestMethod[] method() default {};
//当存在对应的http参数才响应请求。
    String[] params() default {};
//限定请求头存在对应的参数时相应请求
    String[] headers() default {};
//限制http请求体提交类型,如"application/json","text/html"
    String[] consumes() default {};
//限制返回的内容类型,仅当http请求头中的(Accept)类型中包含该指定类型时才返回。
    String[] produces() default {};
}

代码中对所有的配置项加入了中文说明。这里可以通过配置项或者path来设置请求URL,从而让对应的请求映射到控制器或者其方法上,在此基础上还可以通过其他配置项来缩小请求映射的范围。当然配置项也可以通过正则式来让方法匹配多个请求。但是从现实的角度来说,如果不是必要,尽量不要这么做。因为这样请求的匹配规则就复杂了,灰度后续开发造成一定困扰。因此在能够明确场景下,都建议一个路径对应一个方法或者让正则表达式的匹配规则简单明了,这样能够提高程序的可读性,以利于后续的维护和改造。

路径是必须的配置项,这里的method配置项可以限定HTTP的请求类型,这是最常用的配置项,可以区分HTTP的GET或者POST等不同的请求。只是在SPring 4.3的版本之后,为了简化method配置项的配置新增了几个注解,如@PutMapping,@GetMapping,@PostMapping,@PatchMapping,@DeleteMapping。本章值讨论@GetMapping和@PostMapping的使用,在后续的REST风格讨论中,才会讨论@PatchMapping,@PutMapping,@DeleteMapping。从名称可以看出@GetMapping对应的是HTTP的GET方法,@PostMapping对应的是HTTP的POST方法,其他配置项则与@REquestMapping并没有太大的区别,通过他们就可以不再设置@RequestMapping的method配置项了。