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属性确定优先级的顺序,值越小的优先级越高。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值