SpringMVC工作流程
- 用户发送请求至前端控制器
DispatcherServlet
DispatcherServlet
收到请求调用HandlerMapping
处理器映射器- 处理器映射器找到具体的处理器(可根据XML配置、注解进行查找),生成处理器以及处理器拦截器(如果有则生成)一并返回给
DispatcherServlet
DispatcherServlet
调用HandlerAdapter
处理器适配器HandlerAdapter
经过适配调用具体的处理器(Controller
,也叫后端控制器)Controller
执行完成返回ModelAndView
HandlerAdapter
将Controller
执行结果ModelAndView
返回给DispatcherServlet
DispatcherServlet
将ModelAndView
传给ViewReslover
视图解析器ViewReslover
解析后返回具体View
DispatcherServlet
根据View
进行渲染视图(即将模型数据填充到视图中)DispatcherServlet
响应用户
SpringMVC的主要组件
Handler
:也就是处理器,它直接对应着MVC中的C也就是Controller
层,他的具体表现形式有很多种,可以是类,也可以是方法。在Controller
层中@RequestMapping
标注的所有方法都可以看成是一个Handler
,只要可以实际处理请求就可以是Handler
。
HandlerMapping
initHandlerMappings(context)
处理器映射器,根据用户请求的资源url来查找Handler
的,在SpringMVC中会有很多请求,每个请求都需要一个Handler
处理,具体接收到一个请求之后使用哪个Handler
进行处理,这就是HandlerMapping
需要做的事。HandlerAdapter
initHandlerAdapters(context)
,适配器。因为在SpringMVC中的Handler
可以是任何的形式,只要能处理请求就ok,但是servlet
需要的处理方法的结构确是固定的,都是以request
和response
为参数的方法。如何让固定的servlet
处理方法调用灵活的Handler
来进行处理呢?这就是HandlerAdapter
要做的事情。
Handler
是用来干活的工具;HandlerMapping
用于根据需要干的活找到相应的工具;HandlerAdapter
是使用工具干活的人。
HandlerExceptionResolver
initHandlerExceptionResolvers(context)
,其他组件都是用来干活的,在干活的过程中难免会出现问题,出问题后怎么办呢》这就需要一个专门的角色对异常进行处理,在SpringMVC中就是HandlerExceptionResolver
,具体来说,此组件的作用就是根据异常设置ModelAndView
,之后再交给render
方法进行渲染。ViewResolver
initViewResolvers(context)
,ViewResolver
用来将String类型的视图名和Locale
解析为View
类型的视图。View
是用来渲染页面的,也就是将程序返回的参数填入模板中,生成html(也可能是其他类型)文件。这里有两个关键问题:使用哪个模板?用什么技术(规则)填充参数?这其实是ViewResolver
主要做的工作,ViewResolver
需要找到渲染所用的模板和所用的技术(也就是视图的类型)进行渲染,具体的渲染过程则交由不同的视图自己完成。RequestToViewNameTranslator
initRequestToViewNameTranslator(context)
,ViewResolver
是根据ViewName
查找View
,但有的Handler
处理完后并没有设置View
也没有设置ViewName
,这时就需要从request
获取ViewName
了,如何从request
中获取ViewName
就是RequestToViewNameTranslator
要做的事情了。
RequestToViewNameTranslator
在SpringMVC容器里只可以配置一个,所以所有request
到ViewName
的转换规则都要在一个Translator
里面全部实现。LocaleResolver
initLocaleResolver(context)
,解析视图需要两个参数:一是视图名,另一个是Locale
。视图名是处理器返回的,LocaleResolver
要做的是解决Locale
从哪里来的问题,LocaleResolver
用于从request
解析出Locale
,Locale
就是zh-cn之类,表示一个区域,有了这个就可以对不同区域的用户显示不同的结果。SpringMVC主要有两个地方用到Locale
:一是ViewResolver
解析视图的时候;二是用到国际化资源或者主题的时候。ThemeResolver
initThemeResolver(context)
,用于解析主题。SpringMVC中一个主题对应一个properties
文件,里面存放着跟当前主题相关的所有资源:如图片、css样式等。SpringMVC的主题也支持国际化,同一个主题区域也可以显示不同的风格。SpringMVC中跟主题相关的类有ThemeResolver、ThemeSource和Theme
。主题是通过一系列资源来具体体现的,要得到一个主题的资源,首先要得到资源的名称,这是ThemeResolver
要做的工作。然后通过主题名称找到对应的主题(可以理解为一个配置文件),这是ThemeSource
的工作,最后从主题中获取资源就可以了。MultipartResolver
initMultipartResolver(context)
,用于处理上传请求。处理方法是将普通的request
包装成MultipartHttpServletRequest
,后者可以直接调用getFile
方法获取File
,如果上传多个文件,还可以调用getFileMap
得到FileName->File
结构的Map,此组件一共有三个方法,作用分别是判断是不是上传请求,将request
包装成MultipartHttpServletRequest
,处理完后清理上传过程中产生的临时资源。FlashMapManager
initFlashMapManager(context)
,用来管理FlashMap
的,FlashMap
主要用在redirect
中传递参数。