Spring MVC:HandlerMapping
Posted 賣贾笔的小男孩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ” 的视图名称。
以上是关于Spring MVC:HandlerMapping的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC 梳理 - 四种HandlerMapping
Spring MVC 学习笔记 handlerMapping和handlerAdapter