为了便于理解,我们可以将Spring MVC提供的ViewResolver划分为两类,一类称为"面向单一视图类型的ViewResolver,另一类则称为面向多视图类型的ViewResolver。下面是这两类ViewResolver的详细情况。
1. 面向单一视图类型的ViewResolver
该类别ViewResolver的正宗名称应该是UrlBasedViewResolver(它们都直接地或者间接地继承自该类)。使用该类别的ViewResolver,我们不需要为它们配置具体的逻辑视图名到具体View的映射关系。通常只要指定一下视图模板所在的位置,这些ViewResolver就会按照逻辑视图名,抓取相应的模板文件、构造对应的View实例并返回。之所以又将它们称之为面向单一视图类型的ViewResolver,是因为该类别中,每个具体的ViewResolver实现都只负责一种View类型的映射,ViewResolver与View之间的关系是一比一。比如,我们之前一直使用的InternalResourceViewResolver,它通常就只负责到指定位置抓取JSP模板文件,并构造InternalResourceView类型的View实例并返回。而VelocityViewResolver则只关心指定位置的Velocity模板文件(.vm),并会将逻辑视图名映射到视图模板的文件名,然后构造VelocityView类型的View实例返回,诸如此类。
属于该类别的主要ViewResolver实现类为如下几个。
InternalResourceViewResolver。它是我们使用最多的ViewResolver实现类型,它对应InternalResourceView 视图类型的映射,说白了也就是处理JSP模板类型的视图映射。如果DispatcherServlet在初始化的时候,不能在自己的WebApplicationContext中找到至少一个ViewResolver,那么,InternalResourceViewResolver将作为默认的ViewResolver被使用。
FreeMarkerViewResolver/VelocityViewResolver。FreeMarkerViewResolver和Velo- cityViewResolver分别负责对应FreeMarkerView和VelocityView类型视图的查找工作,它们将根据逻辑视图名到指定的位置获取对应的模板文件,并构造FreeMarkerView和VelocityView的实例返回给DispatcherServlet使用。
JasperReportsViewResolver。JasperReportsViewResolver只关心根据逻辑视图名到指定位置查找JasperReport类型模板文件,并返回AbstractJasperReportsView的具体子类型View实例,例如JasperReportsCsvView或者JasperReportsHtmlView等。
XsltViewResolver。只负责根据逻辑视图名查找并返回XsltView类型的View实例。
启用以上这些ViewResolver,与使用InternalResourceViewResolver一样简单。最基本的方法是,使用prefix属性指定模板所在路径,使用suffix属性指定模板文件的后缀名。这样,在获取逻辑视图名之后,相应的ViewResolver内部就能够根据[prefix]+viewName+[suffix]这样的URL找到对应的模板文件,并构造对应的View实例而返回了。以VelocityViewResolver的使用为例,至于其他的几个ViewResolver的使用,你基本上就可以"举一反三"了,更加详尽的配置项,可以参考对应类的Javadoc或者Professional Java Development with the Spring Framework一书中对应视图章节的介绍内容。下面给出了针对VelocityViewResolver的配置代码示例:
<bean id="viewResolver"
class="org.springframework.Web.servlet.view.velocity.VelocityViewResolver">
<property name="prefix" value="../velocity/"/>
<property name="suffix" value=".vm"/>
</bean>
现在DispatcherServlet对视图的请求将会由VelocityViewResolver接管,Velocity- ViewResolver将根据传入的逻辑视图名,到指定目录下查找.vm类型的Velocity模板文件,并构造VelocityView实例返回给DispatcherServlet使用。就跟我们所说的那样,它只负责到指定位置查找对应Velocity的单一视图类型,而不会返回其他,比如Freemarker视图对应的View实例。
注意 关于使用Velocity作为视图技术需要附加的配置内容,可以参考稍后ResourceBundle- ViewResolver部分的附带信息。