SpringMVC组件概览
这里要介绍的是DispatchServlet中直接初始化的九大组件
HandlerMapping
HandlerMapping只有一个接口那就是getHandler
DispatchServlet中查找Handler的方式是按顺序遍历所有的HandlerMapping,当找到一个HandlerMapping后立即停止查找并返回
HandlerAdapter
HandlerAdapter一共有三个接口:support判定是否可以使用某个Handler;handler方法是用来具体使用Handler干活;getLastModified获取资源的LastModified,LastModified是资源最后一次修改的时间。
之所以要使用HandlerAdapter时因为SpringMVC中并没有对处理器做任何限制,处理器可以以任意合理的方式来表现,可以是一个类,也可以是一个方法,还可以是别的合理的方式,从handler方法可以看出它是Object的类型。这种模式给开发者提供了极大的自由。
在看一下SpringMVC自己的HandlerAdapter——SimpleControllerHandlerAdapter
HandlerExceptionResolver
HandlerExceptionResolver是一个专门对异常情况进行处理的类。该组件根据异常情况设置ModelAndView,之后再交给render方法进行渲染。render只负责将ModelAndView渲染成页面,至于ModelAndView是怎么来的并不关心。这个是SpringMVC设计中分工明确的优点。
从doDispatch中可知HandlerExceptionResolver只是用于解析对请求做处理的过程中产生的异常,而渲染环节产生的异常不归它管。所以render中的异常不归HandlerExceptionResolver管。
其接口非常简单,只要一个接口,只需要从异常中解析出ModelAndView,具体的实现可以用一个Map,key为Exception,value为View。
给两个参考文章:
HandlerExceptionResolver
通过自定义HandlerExceptionResolver处理异常
ViewResolver
ViewResolver用来将Spring类型的视图名和Locale解析为View类型的视图,其接口也非常简单,只有一个方法:
从接口中看是将视图名和Locale对应到View,不过一般情况下只需要视图名,如果做国际化支持也是将要显示的内容或者主题使用国际化支持,不过SpringMVC的确有这样的功能,可以让不同地区显示不同的View。
View是用来渲染页面的,通俗点说就是要将程序返回的参数填入模板里,生成html文件。这里有两个关键问题:
使用哪个模板
用什么技术(规则)填入参数
这个就是ViewResolver所做的工作,常用的ViewResolver都是针对单一视图类型(技术,规则)来进行渲染,比如InternalResourceViewResolver针对jsp。
InternalResourceViewResolver是SpringMVC默认的ViewResolver,不过其比较复杂这里举个简单的例子,BeanNameViewResolver
通过代码可知,其原理是根据viewName从Spring容器中查找Bean,如果找不到或者查找后不是View类型则返回null,否则返回容器中的bean。当然这种方式是需要将View以Bean的形式注册到Spring之中的。
RequestToViewNameTranslator
从request中获取View,可配置规则,待续
LocaleResolver
本地化解析,待续
ThemeResolver
主题解析,待续
MultipartResolver
用于处理上传请求,待续
FlashMapManager
用于管理FlashMap,待续