zoukankan      html  css  js  c++  java
  • Spring MVC:HandlerMapping

    HandlerMapping 的类图

      Spring中存在两种类型的handlers。第一种是 handler mappings(处理程序映射)。它们的角色定位与前面所描述的功能完全相同。它们尝试将当前请求与相应的 controller 以及其中的方法相匹配。第二种是 handler adapter(处理器适配器)。handler adapter 从 handler mappings 中获取映射的 controllers 和方法并调用它们。这种类型的适配器必须实现org.springframework.web.servlet.HandlerAdapter 接口。下面就来介绍 handler mappings。(Spring 版本:5.18)

    ① RequestMappingHandlerMapping:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,它的映射检测是基于注解的,它会自动在Controller 里面寻找@RequestMapping(...)等注解并解析。(注:在Spring5之前是使用DefaultAnnotationHandlerMapping,这个类在Spring5之后被移除了,一些项目在升级Spring版本时是可能会因为配置而报错)

    例如:

    1 <mvc:annotation-driven />

      告知 Spring启用注解驱动,然后 Spring 会自动为我们注册 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter(这只是我们关注的其中2个)。

    ② SimpleUrlHandlerMapping:org.springframework.web.servlet.handler.SimpleUrlHandlerMapping,通过配置请求路径和 Controller 映射建立关系,找到相应的 Controller。SimpleUrlHandlerMapping 是最灵活的 HandlerMapping 实现。它允许在bean实例和URL之间 或 bean名称和URL之间进行直接和声明性映射。

    例如:把请求“/simpleUrlWelcome”和“/*/simpleUrlWelcome”映射到 welcome 这个bean上。

     1 @Configuration
     2 public class SimpleUrlHandlerMappingConfig {
     3  
     4     @Bean
     5     public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
     6         SimpleUrlHandlerMapping simpleUrlHandlerMapping
     7           = new SimpleUrlHandlerMapping();
     8          
     9         Map<String, Object> urlMap = new HashMap<>();
    10         urlMap.put("/simpleUrlWelcome", welcome());
    11         simpleUrlHandlerMapping.setUrlMap(urlMap);
    12          
    13         return simpleUrlHandlerMapping;
    14     }
    15  
    16     @Bean
    17     public WelcomeController welcome() {
    18         return new WelcomeController();
    19     }
    20 }

    等效的 xml 配置方式:

    1 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    2     <property name="mappings">
    3         <value>
    4             /simpleUrlWelcome=welcome
    5             /*/simpleUrlWelcome=welcome
    6         </value>
    7     </property>
    8 </bean>
    9 <bean id="welcome" class="com.xxx.WelcomeController" />

    或者

    1 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    2     <property name="mappings">
    3         <props>
    4             <prop key="/simpleUrlWelcome">welcome</prop>
    5             <prop key="/*/simpleUrlWelcome">welcome</prop>
    6         </props>
    7     </property>
    8 </bean>

    ③  BeanNameUrlHandlerMapping:org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,通过定义的 beanName 进行查找要请求的Controller。BeanNameUrlHandlerMapping 是默认的 HandlerMapping 实现。BeanNameUrlHandlerMapping 将请求 URL 映射到具有相同名称的bean,这个特定映射支持直接名称匹配以及使用“*”模式的模式匹配。

    例如:传入URL“/ foo”映射到名为“/ foo”的bean 。模式映射的一个示例是将请求从“/ foo *”映射到名称以“/ foo”开头的bean,例如“ / foo2 /”或“ / fooOne /”。

     1 @Configuration
     2 public class BeanNameUrlHandlerMappingConfig {
     3     @Bean
     4     BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() {
     5         return new BeanNameUrlHandlerMapping();
     6     }
     7  
     8     @Bean("/beanNameUrl")
     9     public WelcomeController welcome() {
    10         return new WelcomeController();
    11     }
    12 }

    等效的 xml 配置:

    1 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
    2 <bean name="/beanNameUrl" class="com.xxx.WelcomeController" />

      在这两种配置中,都不需要为 BeanNameUrlHandlerMapping 定义bean,因为 Spring MVC 提供了它。所有对“/ beanNameUrl”的请求都将由 DispatcherServlet 转发到“ WelcomeController ”。WelcomeController 返回一个名为“ welcome ” 的视图名称。

  • 相关阅读:
    opensuse使用zypper安装软件
    补习系列(1)-springboot项目基础搭建课
    补习系列-springboot-使用assembly进行项目打包
    log4j2 使用纪要
    mongos-sharding连接池配置
    maven-代码风格检查工具
    mtools-你可能没用过的mongodb神器
    mongodb分布式集群搭建手记
    mongodb分片扩展架构
    mongodb副本集高可用架构
  • 原文地址:https://www.cnblogs.com/magic-sea/p/11779688.html
Copyright © 2011-2022 走看看