用来将视图名(viewName)和Locale解析为View类型的视图;
resolveViewName(String viewName, Locale locale);
Locale用来表示不同的区域;
ViewResolver用来选择用哪种模板以及何种方式填入数据到模板中;
四种类型:
AbstractCachingViewResolver、BeanNameViewResolver
ContentNegotiatingViewResolver、ViewResolverComposite
BeanNameViewResolver:
1、实现了Order接口,可以进行排序;
2、方法:resolveViewName,从applicationContext中获取名字为viewName的Bean;
3、applicationContext是从WebApplicationObjectSupport中获取的;
ViewResolverComposite:
1、实现了Order接口,可以排序;
2、实现了InitializingBean接口,可以调用afterPropertiesSet方法;
3、实现ApplicationContextAware,setApplicationContext获取到当前ApplicationContext;
4、实现ServletContextAware,setServletContext获取当前的ServletContext;
5、内部容器List<ViewResolver> viewResolvers,存放ViewResolver;
6、resolveViewName方法,循环判断viewResolvers中,返回能解析的解析器,否则返回null;
ContentNegotiatingViewResolver:
1、在别的解析器解析的结果上增加了对MediaType和后缀的支持;
2、属性List<ViewResolver> viewResolvers
①用来循环解析视图,解析成功即返回;
②初始化方式分为手动和自动;initServletContext;
3、实现InitializingBean,初始化ContentNegotiationManager;
4、属性ContentNegotiationManagerFactoryBean,用来初始化第3点;
5、实现Order接口,排序;
6、resolveViewName,根据MediaType以及ViewResolver选出View,进而选出bestViewResolver;
AbstractCachingViewResolver:
1、提供统一的缓存功能,只要视图被解析过一次就会被缓存起来;
2、子类:ResourceBoundleViewResolver、XmlViewResolver、UrlBasedViewResolver;
3、属性viewAccessCache、viewCreationCache,用来缓存解析过的视图;
①先查询viewAccessCache(底层为ConcurrentHashMap)缓存,再查询viewCreationCache(由LinkedHashMap实现);
②viewAccessCache查询速度快,viewCreationCache用来控制缓存的数量;
③为什么viewCreationCache能够控制缓存的数量?
LinkedHashMap重写了afterNodeInsertion,viewCreationCache重写了removeEldestEntry;
InternalResourceViewResolver:
1、默认的实现类;
2、用来解析jsp类型的视图;