前面springmvc的程序运行都成功,我们可以看一下前端控制器DispatcherServlet在整个流程中所起的作用
DispatcherServlet源码如下
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);//初始化上传文件解析器
initLocaleResolver(context);//初始化本地解析器
initThemeResolver(context);//初始化主题解析器
initHandlerMappings(context);//初始化处理器映射器,将请求映射到处理器上
initHandlerAdapters(context);//初始化处理适配器
initHandlerExceptionResolvers(context);//初始化异常处理器
initRequestToViewNameTranslator(context);//初始化请求到视图名称解析器
initViewResolvers(context);//初始化视图解析器
initFlashMapManager(context);//初始化flash映射管理器
}
initStrategies方法将在WebApplicationContext初始化后自动执行,自动扫描上下文的Bean,根据名称或类型匹配的机制查找自定义的组件,如果没有找到,则会装配spring默认的组件,org.springframework,web.servlet路径下的DispatcherServlet.properties
# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.
# 本地化解析器
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
# 异常处理器
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
# 视图名称解析器
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
# 视图解析器
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
# FlashMap映射器
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
本地化解析器 只允许一个实例
1、查找名为localeResolver、类型为LocaleResolver的Bean作为该类型组件
2、如果没有找到,则使用默认AcceptHeaderLocaleResolver
主题解析器 只允许一个实例
1、查找名为themeResolver,类型为ThemeResolver的bean作为该类型的组件
2、如果没有找到,则使用默认的FixedThemeResolver
处理器映射器 允许多个实例
1、如果detectAllHandlerMappings的属性为true,则根据类型匹配戒指查找上下文以及Spring容器中的所有类型为HandlerMapping的Bean,将他们作为该类型的组件
2、如果detectAllHandlerMappings的属性为false,则查找名为handlerMappping 类型为HandlerMapping的Bean作为该类型的组件
3、如果以上两种方式都没有,则使用BeanNameUrlHandlerMapping实现类创建该类型的组件
处理器适配器 允许多个实例
1、如果detectAllHandlerAdapters的属性为true,则根据类型匹配机制查找上下文以及Spring容器中所有类型为HandlerAdapter的Bean,将他们作为该类型的组件
2、如果detectAllHandlerAdapters的属性为false,则查找名为handlerAdapter类型为handlerAdapter的bean作为该类型的组件
3、如果以上两种都没有找到,则使用默认配置文件中的三个实现类分别创建适配器,并将其添加到适配器列表中
处理异常解析器 允许多个实例
1、如果detectAllHandlerExceptionResolvers的属性为true,则根据领匹配机制查找上下文以及Spring容器中所有类型为HandlerExceptionResolver的bean,将他们作为该类型的组件
2、如果detectAllHandlerExceptionResolvers的属性为false,则查找名为handlerExceptionResolver,类型为HandlerExceptionResolvers的bean作为该类型的组件
3、如果以上两种都没有找到,则使用默认配置文件中默认实现类
视图名称解析器 只允许一个实例
1、查找名为viewNameTranslator类型为RequestToViewTranslator的bean作为该类型的组件
2、如果没有找到,则使用默认配置文件中的实现类DefaultRequestToViewNameTranslator
视图解析器 允许多个实例
1、如果detectAllViewResolvers的属性为true,则根据类型匹配机制查找上下文以及Spring容器中的所有类型为ViewResolver的bean,将他们作为该类型的组件
2、如果detectAllViewResolvers的属性为false,则查找名为viewResolvers类型为ViewResolver的Bean作为类型的醉娜
3、如果以上两种方式都没有找到的话,就使用配置文件中的默认实现类InternalResourceViewResolver
文件上传解析器 只允许一个实例
1、查找名为muliipartResolver类型为MuliipartResolver的Bean作为该类型组件
2、如果没有找到,则使用配置中加载的组件
FlashMap映射管理器
1、查找名为FlashMapManager 类型为SessionFlashMapManager的bean作为该类型的组件,用于管理FlashMqap,即数据默认存储在HttpSession中
SpringMVC的执行流程
1、用户向服务器发送请求,请求呗前端控制器DispatcherServlet截获
2、DispatcherServlet对请求的URL进行解析,得到URI,然后根据URI调用HandlerMapper获取该Handler配置的所有相关的对象,包括Handler对象以及Handler对象对应的拦截器,这些对象会被封装到一个 HandlerExecutionChain对象中返回
3、DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter,HandlerAdapter会处理多种handler,调用handler实际处理请求的方法
4、提取请求中的数据模型,开始执行Handler(Controller),在填充Handler的入参过程中根据配置,Spring做了一些如下工作
-- a)消息转换。将请求消息(如JSON,XML等数据)转换成一个对象,将对象转换为指定的响应消息
-- b)数据转换 。 对请求消息进行数据转换,如String转换为Integer,Double等
-- c)数据格式化。对请求消息进行格式化。如将字符串转换为格式化数字或格式化日期
-- d)数据验证。验证数据的有效性,验证结果存储在BindingResult或Error中
5、handler执行完之后,向DispatcherServlet返回一个ModelAndVIew对象,ModelAndVIew对象中应该包含视图名或视图名和模型
6、根据返回的ModelAndView对象那个,选择一个合适的ViewResolver(视图解析器),返回给DispatcherServlet
7、ViewResolver结合Model和View来渲染视图
8、将视图渲染结果返回给客户端