Spring In Action 05 ---渲染Web视图

本文介绍了Spring MVC中视图解析器的作用及配置方法,包括InternalResourceViewResolver、TilesViewResolver和Thymeleaf视图解析器。InternalResourceViewResolver用于JSP视图,能够将视图名解析为JSP文件;TilesViewResolver用于Apache Tiles布局引擎,能够定义通用页面布局;Thymeleaf视图解析器则用于Thymeleaf模板技术。

视图解析器

将控制器中请求处理的逻辑和视图中的渲染实现解耦是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模板技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值