概述
前端控制器 Dispatcherservlet 截获请求后做了什么工作呢?DispatcherServlet 又是如何分派请求的呢?
分析DispatcherServlet 源码如下:
protected void initStrategies(ApplicationContext context) {
//初始化文件上传文件解析器
initMultipartResolver(context);
//初始化本地化解析器
initLocaleResolver(context);
//初始化主题解析器
initThemeResolver(context);
//初始化处理器映射器
initHandlerMappings(context);
//初始化处理器适配器
initHandlerAdapters(context);
//初始化异常处理解析器
initHandlerExceptionResolvers(context);
//初始化请求路径转换为ViewName 的视图名称解析器
initRequestToViewNameTranslator(context);
//初始化视图解析器,通过ViewResolver解析逻辑视图名到具体视图实现
initViewResolvers(context);
//初始化flash影射管理器 主要管理flashmap,比如RedirectAttributes 的属性会放到这个里面,默认使用的是SessionFlashMapManager
initFlashMapManager(context);
}
initStrategies 方法WebApplicationContext 初始化后自动执行,自动扫描上下文的Bean,根据名称或类型匹配机制查找自定义的组件,如若没有则会装配一套Sopring默认组件。在org.springframework.web.servlet路径下有一个DispatcherServlet.properties 配置文件,该文件指定了 DispatcherServlet 使用的默认组件。
如果想要使用自定义类型的组件,则只需要在Spring 配置文件中配置自定义Bean 组件即可。SpringMVC 如果发现上下文中有用户自定义的组件,就不会使用默认的组件了。
以下是DispatcherServlet装配每种组件的细节:
本地化解析器。(只允许一个实例)
查找名为localeResolver、类型为.LocaleResolver的Bean 作为该类型的组件。如果没有找到,则使用默认的AcceptHeaderLocaleResolver作为该类型的组件。
主题解析器。(只允许一个实例)
查找名为themeResolver、类型为ThemeResolver的Bean作为该类型的组件,如果没有找到,则使用默认的FixedThemeResovler作为该类型组件。
处理器映射器。(允许多个实例)
当detectAllHandlerMappings 的属性为true(默认为true),则查找所有类型为HandlerMapping 的Bean,将它们作为该类型组件。当detectAllHandlerMappings 的属性为false ,则查找名为handlerMapping、类型为HandlerMapping 的Bean 作为该类型组件。如果通过以上两种方式都未找到,则使用BeanNameUrlHandlerMapping实现创建该类型组件。
处理器适配器。(允许多个实例)
当detectAllHandlerMappings 的属性为true,则查找所有类型为HandlerAdapter 的Bean,将它们作为该类型的组件。当detectAllHandlerMappings 的属性为false,则查找名为 handlerAdapter、类型为HandlerAdapter 的Bean。如果通过以上两种方式都未找到,则使用DispatcherServlet.properties 配置文件中指定的三个实现类分别创建一个适配器,并将其添加到适配器列表中。
处理器异常解析器。(允许多个实例)
当detectAllHandlerExceptionResovlers 的属性为true(默认为true),则查找所有类型为HandlerExceptionResovler 的Bean,将它们作为该类型的组件。当detectAllHandlerExceptionResolvers 的属性为false,则查找名为 handlerExceptionResolver、类型为HandlerExceptionResolver 的Bean。如果通过以上两种方式都未找到,则使用DispatcherServlet.properties 配置文件中定义的默认实现类(该文件没有默认的实现类,需要用户自定义实现类,将其添加到DispatcherServlet.properties配置文件中)。
视图名称解析器。(只允许一个实例)
查找名为viewNameTranslator、类型为RequestToViewNameTranslator的Bean作为该类型组件,如果没找到,则使用默认的实现类 DefaultRequestToViewNameTranslatro 作为该类型的组件。
视图解析器(允许多个实例)
当detectAllViewResolvers 的属性为true(默认为true),则查找所有类型为ViewResolver 的Bean,将它们作为该类型的组件。当detectAllViewResovlers 的属性为false ,则查找名为 viewResovlers 、类型为ViewResolver 的Bean。如果通过以上两种方式都未找到,则查找 DispatcherServlet.properties 配置文件中定义的默认实现类 InternalResourceViewResolver 作为该类型的组件。
文件上传解析器。(只允许一个实例)
查找名为muliipartResolver、类型为MuliipartResolver 的Bean 作为该类型的组件,如果用户没有在上下文中显式定义MuliipartResolver 类型的组件,则 DispatcherServlet将不会加载该类型的组件。
FlashMap映射管理器
查找名为 FlashMapManager、类型为SessionFlashMapManager 的Bean 作为该类型的组件,用于管理FlashMap,即数据默认存储在HttpSession 中。
DispatcherServlet装配的各种组件有些只允许一个实例,有些则允许多个实例,需要注意这点。
如果同一类型的组件存在多个,那么它们将通过Order属性确定优先级的顺序,值越小的优先级越高。
最后
以上就是喜悦蜻蜓为你收集整理的SpringMVC学习(三)详解 Dispatcher的全部内容,希望文章能够帮你解决SpringMVC学习(三)详解 Dispatcher所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复