视图解析器
将控制器中请求处理的逻辑和视图中的渲染实现解耦是Spring MVC的一个重要特性,如果在控制器的方法中直接产生HTML的话,就很难在不影响请求处理逻辑的前提下维护和更新视图。控制器方法和视图的实现会在模型内容上达成一致,这是两者最大的关联,除此之外两者应该保持足够的距离。
但是如果控制器只通过逻辑视图名来了解视图的话,Spring该如何确定使用哪个视图实现来渲染模型呢,这就是Spring视图解析器的任务了。Spring提供了多大13个的视图解析器,能够将逻辑视图名转换为物理实现。本章将会讲解三种视图解析器,包括InternalResourceViewResolver用于JSP,TilesViewResolver用于Apache
Tiles视图,还有一种是Thymeleaf是用来替代JSP的新兴技术。
JSP视图
JSP作为Web应用程序的视图技术已经超过15年了,JSP这些年在不断进步,包含了对表达式语言和自定义标签库的支持。Spring提供了两种方式支持JSP视图。
- InternalResourceViewResolver会将视图名解析为JSP文件。如果在JSP页面中使用了JSTL的话,他能够将视图名解析为JstlVIew形式的JSP文件
- Spring提供两个JSP标签库,一个用于表单到模型的绑定,另一个提供了通用的工具类特性。
尽管Spring还有其他几个视图解析器都能够将视图名映射为JSP文件,但是就这项任务来说,InternalResourceViewResolver是最简单和最常用的视图解析器。
配置适用于JSP的视图解析器
通常我们将所有的JSP文件放在web应用的/WEB-INF/目录下,假设现在我们有一个视图名为home,那么将会把这个视图名解析为/WEB-INF/home.jsp。
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver resolver =
new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/");
resolver.setSuffix(".jsp");
return resolver;
}<bean id="viewResolver"
class="org.springframework.web.servlet,view.InternalResourceViewResolver"
p:prefix="/WEB-INF/"
p:suffix=".jsp" />这样视图解析器就会将视图名解析为JSP文件了。到目前为止,我们对InternalResourceViewResolver的配置很基础也很简单,他最终会将逻辑视图名解析为InternalResourceView实例,这个实例会引用JSP文件。但是如果这些JSP使用JSTL标签来处理格式化和信息的话,我们希望InternalResourceViewResolver将视图解析为JstlView。那么我们只需要这是他的viewClass属性即可,接上面的代码只要增加resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);即可。使用Spring的JSP标签库
Spring提供了两个JSP标签库,用来帮助定义Spring MVC Web的视图,其实一个标签库会用来渲染HTML的表单标签,这些标签可以绑定model中的某个属性。另一个标签库包含了一些工具类标签。
将表单绑定到模型上
Spring的表单绑定JSP标签库包含了14个标签他们中的大多数都用来渲染HTML中的表单标签。但是他们于原生的HTML标签的区别就是他们会绑定模型中的一个对象,能够根据模型中对象的属性填充值。为了使用表单绑定库,需要在JSP页面对其声明
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>你可以指定任意你自己喜欢的前缀。借助Spring表单绑定标签库中包含的标签,我们能够将模型对象绑定到渲染后HTML表单中。<sf:form>会渲染一个HTML<form>表单,通过他的commandName属性构建针对某个模型对象的上下文,在其他的表单标签中,会引用这个模型对象的属性。在之前的代码中我们有一个spitter的控制器,现在我们将commandName属性设置为spitter,因此我们必须要有一个key为spitter的对象,否则表单不能正常渲染。
<sf:form method="POST" commandName="spitter">
First Name <sf:input path="firstName"/>
Password <sf:password path="password"/>
</sf:form><input>标签的value属性值将会设置为模型对象中的path属性所对应的值,例如在模型中spitter对象的firstName属性值为Jack,那么渲染到<input>标签中会存在value="Jack"Apache Tiles视图
我们很少关心应用中Web页面的布局问题,每个JSP完全负责定义自身的布局,假设我们想为应用中的所有页面定义一个通用的头部和底部,最原始的方式是查找每个JSP模板并为其添加头部和底部的HTML。但这种方式的扩展性并不好难以维护,更好的方式是使用布局引擎,如Apache Tiles,定义适用于所有页面的通用页面布局。Spring MVC以视图解析器的形式为Apache Tiles提供了支持,这个视图解析器能够将逻辑视图名解析为Tiles定义。
配置TIles视图解析器
为了在Spring中使用Tiles需要配置几个bean,TilesConfigurer负责定位和加载Tile定义并协调生成Tiles,除此之外还需要TilesViewsResolver将逻辑视图名解析为Tile定义。
@Bean
public TilesConfigurer tilesConfigurer(){
TilesConfigurer tiles = new TilesConfigurer();
//指定Tile定义的为止
tiles.setDefinitions(new String[] {"/WEB-INF/layout/tiles.xml"});
//启用刷新功能
tiles.setCheckRefresh(true);
}
@Bean
public ViewResolver viewResolver(){
return new TilesViewResolver();
}
指定好了Tile之后,我们来具体定义一个tiles.xml文件<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<definition name="base" template="/WEB-INF/layout/page.jsp">
<put-attribute name="header" value="/WEB-INF/layout/header.jsp" />
<put-attribute name="footer" value="/WEB-INF/layout/footer.jsp" />
</definition>
<definition name="home" extends="base">
<put-attribute name="body" value="/WEB-INF/views/home.jsp" />
</definition>
<definition name="registerForm" extends="base">
<put-attribute name="body" value="/WEB-INF/views/registerForm.jsp" />
</definition>
<definition name="profile" extends="base">
<put-attribute name="body" value="/WEB-INF/views/profile.jsp" />
</definition>
<definition name="spittles" extends="base">
<put-attribute name="body" value="/WEB-INF/views/spittles.jsp" />
</definition>
<definition name="spittle" extends="base">
<put-attribute name="body" value="/WEB-INF/views/spittle.jsp" />
</definition>
</tiles-definitions>每个<definition>元素都定义了一个Tile,他最终引用的是一个JSP模板。Thymeleaf视图
JSP已经存在很长时间了,但是他却存在很多缺陷,大多数JSP模板都是采用XML的形式,但是又参杂上了各种JSP标签库的标签变得混乱,同时JSP规范是与Servlet规范紧密耦合的,只能用在Servlet的Web应用中。多年来JSP出现了很多挑战者,其中就有Thymeleaf,Thymeleaf模板是原生的,不依赖标签库。他能够在接受原始HTML的地方进行编辑和渲染,因为他没有与Servlet规范耦合,所以Thymeleaf能够进入JSP所无法涉足的领域。我们来看一下如何在Spring
MVC中使用Thymeleaf。
配置Thymeleaf视图解析器
我们需要配置三个启动Thymeleaf与Spring继承的bean
- ThymeleafViewResolver将逻辑视图名解析为Thymeleaf模板视图
- SpringTemplateEngine处理模板并渲染结果
- TemplateResolver加载Thymeleaf模板
//Thymeleaf视图解析器
@Bean
public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine);
return viewResolver;
}
//模板引擎
@Bean
public SpringTemplateEngine templateEngine(TemplateResolver templateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
return templateEngine;
}
//模板解析器
@Bean
public TemplateResolver templateResolver() {
TemplateResolver templateResolver = new ServletContextTemplateResolver();
templateResolver.setPrefix("/WEB-INF/views/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML5");
return templateResolver;
}定义Thymeleaf模板
Thymeleaf在很大程度上就是HTML文件,与JSP不同他没有什么特殊的标签或标签库
结束
处理请求只是Spring MVC功能的一部分,如果控制器产生的结果想要让人看到,那么他产生的模型数据就要渲染到视图中,并展现到用户的Web浏览器中。Spring的视图渲染是很灵活的,提供了多个内置的可选方案,包括JSP、Apache Tiles布局引擎还有Thymeleaf模板技术。
本文介绍了Spring MVC中视图解析器的作用及配置方法,包括InternalResourceViewResolver、TilesViewResolver和Thymeleaf视图解析器。InternalResourceViewResolver用于JSP视图,能够将视图名解析为JSP文件;TilesViewResolver用于Apache Tiles布局引擎,能够定义通用页面布局;Thymeleaf视图解析器则用于Thymeleaf模板技术。
352

被折叠的 条评论
为什么被折叠?



