Spring 4.x官方参考文档中文版——第21章 Web MVC框架(15)

21.5 视图的解析

       所有web应用的MVC框架都提供了指定视图地址的方法。Spring提供了视图解析器,这可以让你在浏览器里渲染model(模型),而不必与其他视图技术绑定。不止如此,Spring还允许你使用如:JSP,Velocity模板和XSLT视图等技术,需要了解更多关于怎样与不同的视图技术交互,详见”第22章 视图技术”。

Spring里,处理视图时最重要的2个接口就是ViewResolver和View。ViewResolver提供了在视图名和具体视图之间的映射。View接口是用来预备好指定request请求的地址,并且把请求发到其中一种视图技术上进行处理。

 

21.5.1 使用ViewResolver接口进行视图解析

       就像”21.3 实现控制器”一章说到过的,在Spring MVC的Controller里的所有处理器方法必须解析成视图名,可以是显式的(如:指定返回一个String, View或者ModelAndView)或者隐式的(比如:基于惯例来处理),在Spring中的视图根据视图名和被视图解析器解析了的结果来指定视图的地址。Spring提供了多种试图解析器,下面的列表列出了大部分,列表之后,有一些例子:

 

表21.3 视图解析器

ViewResolver

描述

AbstractCachingViewResolver

缓存视图的抽象视图解析器。一般来讲,视图能够使用前世需要做出准备的;集成这个视图解析器能够提供视图的缓存。

XmlViewResolver

使用在有DTD的XML配置文件(就如Spring的XML bean工厂,默认文件为/WEB-INF/views.xml)的ViewResolver实现。

ResourceBundleViewResolver

使用在ResourceBundle中bean绑定的基本名称来定义的ViewResolver的实现。一般来说,你在propertie文件中来定义这个绑定,并把它放在classpath(类的路径)中,默认的文件名为views.properties。

UrlBasedViewResolver

ViewResolver接口比较简单的实现,影响了逻辑视图名到URL的直接解析,这个解析不需要定义显式的映射。这比较适合在逻辑视图名与你的视图资源名相匹配的情况下使用,这样就不用显示地指定映射了。

InternalResourceViewResolver

UrlBasedViewResolver的子类,这个类支持InternalResourceView(在Servlet和JSP下生效),还有InternalResourceView的下属类,如JstlView和TilesView。你能定义这个视图类,使用它的setViewClass(..)方法来整合所有视图。详见UrlBasedViewResolver的javadoc文档。

VelocityViewResolver/

FreeMarkerViewResolver

UrlBasedViewResolver比较方便的子类,能够支持VelocityView(对Velocity模板生效)或者FreeMarkerView,并能够自定义它们的子类。

ContentNegotiatingViewResolver

ViewResolver接口的实现,可以解析基于请求文件名或Accept报头的视图,详见”21.5.4 ContentNegotiaingViewResolver”

 

        使用JSP作为视图技术时,可以使用UrlBasedViewResolver。这个视图解析器可以把视图名转换成URL,并把请求发到RequestDispacher来渲染这个视图。下面是一个例子:

<bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

        当把”test”作为逻辑视图名返回时,这个试图解析器把请求forward(转送)到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,对于每个需要解析的视图,它会使用[视图名].(class)这个样子的属性值作为视图类,[视图名].url这个样纸的属性值作为视图url。相关例子可以在下一章(介绍视图技术的一章)中找到。如上所述,你能够从”extend”这个属性文件中的所有视图里分辨出视图的父级。这就可以使你定义一个默认的视图类。

 

请注意:

       AbstractCachingViewResolver的子类可以缓存它所解析的视图实例。缓存能够改善某些特定的视图技术的表现。可以通过把cache属性设置为false来停用缓存。除此之外,如果你需要在运行时刷新特定视图(比如:当一个Velocity模板被修改了),可以使用removeFromCache(String viewName,Locale loc)方法来实现。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值