带着几个问题来了解Handler Mapping.
什么是HandlerMapping, 它在Spring mvc 的处理流程中充当什么角色?
Spring MVC 自带哪几种类型的HandlerMapping? 这些是针对什么情况设计的?
怎样自定义HandlerMapping?
HandlerMapping 怎样获取HandlerExecutionChain, 即它的工作流程是什么?
问题1: 什么是HandlerMapping, 它在Spring mvc 的处理流程中充当什么角色?
HandlerMapping 用来根据http请求选择合适的controller & Interceptor。从下图中可以看出HM 在Spring MVC 中所处的位置。
问题2,Spring MVC 自带哪几种类型的HandlerMapping? 这些是针对什么情况设计的?
Spring MVC 自带4种HM, 他们是:DefaultAnnotationHandlerMapping, SimpleUrlHandlerMapping, BeanNameUrlHandlerMapping, ControllerClassNameHandlerMapping
如果没有在配置文件中指定 HandlerMapping, 就会使用spring 自带配置文件中的配置信息, 该配置文件是:DispatcherServlet.properties , 该配置文件中还有 theme, adapter 等的默认配置。 代码如下(Spring 版本:4.3.9):
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
详细介绍上面的四种HandlerMapping之前, 先说下HandlerMapping 的继承关系。
SimpleUrlHandlerMapping: 是通过配置mappings的参数,显示的指定url和Controller关联。
DefaultAnnotationHandlerMapping: 扫描具体的包下使用了@Controller注解的类。这样能实现请求和Controller的关联。(在spring 3.2 版本时被弃用,被RequestMappingHandlerMapping 取代)
BeanNameUrlHandlerMapping: 是URL就是Controller这个bean的name。需要规范url.
ControllerClassNameHandlerMapping: 是URL就说Controller这个bean的类名去掉Controller后的String。也需要规范url. (在spring 4.3版本时被弃用, in favor of annotation-driven handler methods)
问题3. 怎样自定义HandlerMapping, 并使之生效?
自定义:public class MyHandlerMapping extends AbstractDetectingUrlHandlerMapping, 也可以根据上面的类图根据不同的需求,继承不同的类。
在配置文件中使扫描路径包含MyHandlerMapping 所在package.
问题4. HandlerMapping 怎样获取HandlerExecutionChain, 即它的工作流程是什么?