要理解DispatcherServlet,首先看一下他的做用,先摘一段开涛的原话:
前端
DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,并且负责职责的分派,并且与Spring IoC容器无缝集成,从而能够得到Spring的全部好处。设计模式
何为前端控制器设计模式呢?下面是一段摘自百度找到的文字:
app
前端控制器(front controller)主要提供一种能够集中式管理请求的控制器,一个前端控制器能够接受全部的客户请求,将每一个请求递交给相应的请求句柄,并适当地响应用户。jsp
前端控制器也是表示层的设计模式,它的出现主要是因为表示层一般须要控制和协调来自不一样用户的多个请求,而这种控制机制又根据不一样的须要,可能会集中式控制或分散式控制。换句话说,就是应用系统须要对于表示层的请求提供一个集中式控制模块,以提供各类系统服务,包括内容提取、视图管理和浏览,若是系统中没有这种集中式控制模块或控制机制,每一个不一样的系统服务都须要进行单独的视图处理,这样代码的重复性就会提升,导致系统开发代价提升。同时,若是没有一个固定模块管理视图之间的浏览机制,导致其浏览功能下放于每一个不一样的视图中,最终必将使得系统的可维护性受到破坏。spa
你们不要在乎这些细节,大概知道这个设计模式的做用就是集中客户请求,并负责职责的分派就行。重点在于,它与Spring IOC容器无缝集成,没得说,同一家公司的东西,确定是无缝的。设计
如今来看下他的做用,摘自开涛的原文:orm
DispatcherServlet主要用做职责调度工做,自己主要用于控制流程,主要职责以下:对象
一、文件上传解析,若是请求类型是multipart将经过MultipartResolver进行文件上传解析;blog
二、经过HandlerMapping,将请求映射处处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);接口
三、经过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
四、经过ViewResolver解析逻辑视图名到具体视图实现;
五、本地化解析;
六、渲染具体的视图等;
七、若是执行过程当中遇到异常将交给HandlerExceptionResolver来解析。
欲知后事如何,请看http://jinnianshilongnian.iteye.com/blog/1602617
分解。再加点料:
DispatcherServlet默认使用WebApplicationContext做为上下文,所以咱们来看一下该上下文中有哪些特殊的Bean:
1、Controller:处理器/页面控制器,作的是MVC中的C的事情,但控制逻辑转移到前端控制器了,用于对请求进行处理;
2、HandlerMapping:请求处处理器的映射,若是映射成功返回一个HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象;如BeanNameUrlHandlerMapping将URL与Bean名字映射,映射成功的Bean就是此处的处理器;
3、HandlerAdapter:HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持不少类型的处理器;如SimpleControllerHandlerAdapter将对实现了Controller接口的Bean进行适配,而且掉处理器的handleRequest方法进行功能处理;
4、ViewResolver:ViewResolver将把逻辑视图名解析为具体的View,经过这种策略模式,很容易更换其余视图技术;如InternalResourceViewResolver将逻辑视图名映射为jsp视图;
5、LocalResover:本地化解析,由于Spring支持国际化,所以LocalResover解析客户端的Locale信息从而方便进行国际化;
6、ThemeResovler:主题解析,经过它来实现一个页面多套风格,即常见的相似于软件皮肤效果;
7、MultipartResolver:文件上传解析,用于支持文件上传;
8、HandlerExceptionResolver:处理器异常解析,能够将异常映射到相应的统一错误界面,从而显示用户友好的界面(而不是给用户看到具体的错误信息);
9、RequestToViewNameTranslator:当处理器没有返回逻辑视图名等相关信息时,自动将请求URL映射为逻辑视图名;
10、FlashMapManager:用于管理FlashMap的策略接口,FlashMap用于存储一个请求的输出,当进入另外一个请求时做为该请求的输入,一般用于重定向场景,后边会细述。