22 Spring MVC 视图解析器系列 ViewResolver
22 Spring MVC 视图解析器系列 ViewResolver
一、简介
视图解析器 ViewResolver 是Spring MVC处理流程的最后一个模块,主要职责是根据Controller返回的ModelAndView中的逻辑视图名解析为一个真正的视图,即将逻辑视图的名称解析为具体的View对象。
视图解析器->解析视图->将一个逻辑概念上的视图解析为具体的展示对象(jsp、html)
源码如下:
public interface ViewResolver {
@Nullable
View resolveViewName(String viewName, Locale locale) throws Exception;
}
接口实现类只需要根据resolveViewName()方法中以参数形式传入的逻辑视图名(viewName)和当前Local的值,返回相应的View实例即可。
Spring MVC提供了很多视图解析器类,如下图
二、视图解析器
2.1 AbstractCachingViewResolver
该类是一个抽象类,这种视图解析器会把它曾经解析过的视图保存起来,然后每次要解析视图的时候先从缓存里面找,如果找到了对应的视图就直接返回,如果没有就创建一个新的视图对象,然后把它放到一个用于缓存的map中,接着再把新建的视图返回。使用这种视图缓存的方式可以把解析视图的性能问题降到最低。
2.2 UrlBasedViewResolver
它是对ViewResolver的一种简单实现,而且继承了AbstractCachingViewResolver。通过一种拼接URL的方式来解析视图,它可以让我们通过设置prefix属性指定视图资源所在路径的前缀信息,通过suffix属性指定视图资源的后缀信息(一般是视图文件的格式)。然后把返回的逻辑视图名称加上指定的前缀和后缀就是指定的视图URL了。
2.3 XmlViewResolver
它继承自AbstractCachingViewResolver抽象类,所以也是支持视图缓存的。使用XmlViewResolver需要添加一个xml配置文件,该文件使用和Spring的Bean工厂配置文件一样的DTD定义,用于定义视图的Bean对象。在该文件中定义的每一个视图的Bean对象都给定了一个名字,然后XmlViewResolver将根据Controller处理器方法返回的逻辑视图名称到XmlViewResolver指定的配置文件中寻找对应名称的视图Bean用于处理视图。
2.4 BeanNameViewResolver
该视图解析器跟XmlViewResolver解析器的配置模式类似,也是让返回的逻辑视图名称去匹配配置好的Bean位置。与XmlViewResolver解析器不同的是,XmlViewResolver将视图的Bean配置在外部的xml文件中,而BeanNameViewResolver将视图的Bean配置信息一起配置在Spring MVC的核心配置文件springmvc.xml中。BeanNameResolver要求视图Bean对象都定义在Spring的 应用上下文中。
2.5 InternalResourceViewResolver
它是UrlBasedViewResolver的子类,而且是在日常开发中最常用的视图解析器类型。InternalResourceViewResolver会把返回的视图名称解析为InternalResourceView对象,InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,然后通过RequestDispatcher在服务器端把请求forword重定向到目标URL。
2.6 ResourceBundleViewResolver
它和XmlViewResolver一样,也是继承自AbstractCachingViewResolver,但是它缓存的不是视图,并且同时也需要一个配置文件来定义逻辑视图名称和真正的View对象的对应关系。不同的是ResourceBundleViewResolver的配置文件是一个属性文件,而且必须是放在classpath路径下面。默认情况下这个配置文件是在classpatch根目录下的view.properties文件,如果不使用默认值的话,则可以通过属性baseName或者baseNames来指定。
2.7 FreeMarkerViewResolver
FreeMarkerViewResolver继承自UrlBasedViewResolver,会把controller返回的逻辑视图解析为FreeMarkerViewResolver。