Sprnig中的视图以名字为标识,视图解析器通过名字来解析视图。Spring提供了多种视图解析器。我们将举例加以说明。
表 13.5. 视图解析器
ViewResolver | 描述 |
---|---|
AbstractCachingViewResolver | 抽象视图解析器实现了对视图的缓存。在视图被投入使用之前,通常需要进行一些准备工作。从它继承的视图解析器将对要解析的视图进行缓存。 |
XmlViewResolver | XmlViewResolver实现ViewResolver ,支持XML格式的配置文件。该配置文件必须采用与Spring XML Bean Factory相同的DTD。默认的配置文件是 /WEB-INF/views.xml 。 |
ResourceBundleViewResolver | ResourceBundleViewResolver实现ViewResolver ,在一个ResourceBundle 中寻找所需bean的定义。这个bundle通常定义在一个位于classpath中的属性文件中。默认的属性文件是views.properties 。 |
UrlBasedViewResolver | UrlBasedViewResolver实现ViewResolver ,将视图名直接解析成对应的URL,不需要显式的映射定义。如果你的视图名和视图资源的名字是一致的,就可使用该解析器,而无需进行映射。 |
InternalResourceViewResolver | 作为UrlBasedViewResolver 的子类,它支持InternalResourceView (对Servlet和JSP的包装),以及其子类JstlView 和TilesView 。通过setViewClass 方法,可以指定用于该解析器生成视图使用的视图类。更多信息请参考UrlBasedViewResolver 的Javadoc。 |
VelocityViewResolver / FreeMarkerViewResolver | 作为UrlBasedViewResolver 的子类,它能支持VelocityView (对Velocity模版的包装)和FreeMarkerView 以及它们的子类。 |
举例来说,当使用JSP作为视图层技术时,就可以使用UrlBasedViewResolver
。这个视图解析器会将视图名解析成URL,并将请求传递给RequestDispatcher来显示视图。
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
当返回的视图名为test
时,这个视图解析器将请求传递给RequestDispatcher
,RequestDispatcher
再将请求传递给/WEB-INF/jsp/test.jsp
。
当在一个web应用中混合使用不同的视图技术时,你可以使用ResourceBundleViewResolver
:
<bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> <property name="basename" value="views"/> <property name="defaultParentView" value="parentView"/> </bean>
ResourceBundleViewResolver
通过basename所指定的ResourceBundle
解析视图名。对每个待解析的视图,ResourceBundle里的[视图名].class
所对应的值就是实现该视图的类。同样,[视图名].url
所对应的值是该视图所对应的URL。从上面的例子里你也可以发现,你可以指定一个parent view,其它的视图都可以从parent view扩展。用这种方法,你可以声明一个默认的视图。
关于视图缓存的注意事项 --继承AbstractCachingViewResolver
的解析器可以缓存它曾经解析过的视图。当使用某些视图技术时,这可以大幅度的提升性能。你也可以关掉缓存功能,只要把cache
属性设成false
就可以了。而且,如果你需要在系统运行时动态地更新某些视图(比如,当一个Velocity模板被修改了),你可以调用removeFromCache(String viewName, Locale loc)
方法来达到目的。