返回介绍

6.1 理解视图解析

发布于 2024-08-17 00:45:50 字数 3728 浏览 0 评论 0 收藏 0

在第5章中,我们所编写的控制器方法都没有直接产生浏览器中渲染所需的HTML。这些方法只是将一些数据填充到模型中,然后将模型传递给一个用来渲染的视图。这些方法会返回一个String类型的值,这个值是视图的逻辑名称,不会直接引用具体的视图实现。尽管我们也编写了几个简单的JavaServer Page(JSP)视图,但是控制器并不关心这些。

将控制器中请求处理的逻辑和视图中的渲染实现解耦是Spring MVC的一个重要特性。如果控制器中的方法直接负责产生HTML的话,就很难在不影响请求处理逻辑的前提下,维护和更新视图。控制器方法和视图的实现会在模型内容上达成一致,这是两者的最大关联,除此之外,两者应该保持足够的距离。

但是,如果控制器只通过逻辑视图名来了解视图的话,那Spring该如何确定使用哪一个视图实现来渲染模型呢?这就是Spring视图解析器的任务了。

在第5章中,我们使用名为InternalResourceViewResolver的视图解析器。在它的配置中,为了得到视图的名字,会使用“/WEB-INF/views/”前缀和“.jsp”后缀,从而确定来渲染模型的JSP文件的物理位置。现在,我们回过头来看一下视图解析的基础知识以及Spring提供的其他视图解析器。

Spring MVC定义了一个名为ViewResolver的接口,它大致如下所示:

当给resolveViewName()方法传入一个视图名和Locale对象时,它会返回一个View实例。View是另外一个接口,如下所示:

View接口的任务就是接受模型以及Servlet的request和response对象,并将输出结果渲染到response中。

这看起来非常简单。我们所需要做的就是编写ViewResolver和View的实现,将要渲染的内容放到response中,进而展现到用户的浏览器中。对吧?

实际上,我们并不需要这么麻烦。尽管我们可以编写ViewResolver和View的实现,在有些特定的场景下,这样做也是有必要的,但是一般来讲,我们并不需要关心这些接口。我在这里提及这些接口只是为了让你对视图解析内部如何工作有所了解。Spring提供了多个内置的实现,如表6.1所示,它们能够适应大多数的场景。

表6.1 Spring自带了13个视图解析器,能够将逻辑视图名转换为物理实现

视图解析器

描  述

BeanNameViewResolver

将视图解析为Spring应用上下文中的bean,其中bean的ID与视图的名字相同

ContentNegotiatingViewResolver

通过考虑客户端需要的内容类型来解析视图,委托给另外一个能够产生对应内容类型的视图解析器

FreeMarkerViewResolver

将视图解析为FreeMarker模板

InternalResourceViewResolver

将视图解析为Web应用的内部资源(一般为JSP)

JasperReportsViewResolver

将视图解析为JasperReports定义

ResourceBundleViewResolver

将视图解析为资源bundle(一般为属性文件)

TilesViewResolver

将视图解析为Apache Tile定义,其中tile ID与视图名称相同。注意有两个不同的TilesViewResolver实现,分别对应于Tiles 2.0和Tiles 3.0

UrlBasedViewResolver

直接根据视图的名称解析视图,视图的名称会匹配一个物理视图的定义

VelocityLayoutViewResolver

将视图解析为Velocity布局,从不同的Velocity模板中组合页面

VelocityViewResolver

将视图解析为Velocity模板

XmlViewResolver

将视图解析为特定XML文件中的bean定义。类似于BeanName-ViewResolver

XsltViewResolver

将视图解析为XSLT转换后的结果

Spring 4和Spring 3.2支持表6.1中的所有视图解析器。Spring 3.1支持除Tiles 3 TilesViewResolver之外的所有视图解析器。

我们没有足够的篇幅介绍Spring所提供的13种视图解析器。这其实也没什么,因为在大多数应用中,我们只会用到其中很少的一部分。

对于表6.1中的大部分视图解析器来讲,每一项都对应Java Web应用中特定的某种视图技术。InternalResourceViewResolver一般会用于JSP,TilesViewResolver用于Apache Tiles视图,而FreeMarkerViewResolver和VelocityViewResolver分别对应FreeMarker和Velocity模板视图。

在本章中,我们将会关注与大多数Java开发人员最息息相关的视图技术。因为大多数Java Web应用都会用到JSP,我们首先将会介绍InternalResourceViewResolver,这个视图解析器一般会用来解析JSP视图。接下来,我们将会介绍TilesViewResolver,控制JSP页面的布局。

在本章的最后,我们将会看一个没有列在表6.1中的视图解析器。Thymeleaf是一种用来替代JSP的新兴技术,Spring提供了与Thymeleaf的原生模板(natural template)协作的视图解析器,这种模板之所以得到这样的称呼是因为它更像是最终产生的HTML,而不是驱动它们的Java代码。Thymeleaf是一种非常令人兴奋的视图方案,所以你尽可以先往后翻几页,去6.4节看一下在Spring中是如何使用  它的。

如果你依然停留在本页的话,那么你可能知道JSP曾经是,而且现在依然还是Java领域占主导地位的视图技术。在以前的项目中,也许你使用过JSP,将来有可能还会继续使用这项技术,所以接下来让我们看一下如何在Spring MVC中使用JSP  视图。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文