我是靠谱客的博主 喜悦蜻蜓,最近开发中收集的这篇文章主要介绍SpringMVC学习(三)详解 Dispatcher,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前端控制器 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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部