前言

前面学习了编写Web请求的控制器,创建简单的视图,本篇博文讲解控制器完成请求到结果渲染到用户的浏览器的过程。

渲染Web视图

理解视图解析

前面所编写的控制器方法都没有直接产生浏览器中渲染所需要的HTML,只是将数据填充到模型中,然后将模型传递给视图,方法返回值是String类型的值,其是视图的逻辑名称,不会直接引用具体的视图实现。将控制器中请求处理的逻辑和视图中的渲染解耦是Spring MVC的重要特征,控制器只通过逻辑视图名了解视图,而视图解析器用于确定使用哪个视图实现来渲染模型。前面在WebConfig中,使用了InternalResourceViewResolver,其配置了prefix/WEB-INF/views/suffix.jsp用于确定渲染模型的jsp文件的物理位置。Spring自带了12个视图解析器用于将逻辑视图名转化为物理实现。

对于不同的视图解析器,一般对应某种特定的视图技术,如InternalResourceViewResolver一般用于JSP视图、TilesViewResolver用于Apache Tiles视图、FreeMarkerViewResolver用于FreeMarker视图、VelocityViewResolver用于Velocity视图。

创建JSP视图

Spring提供了两种支持JSP视图的方式。

  • InternalResourceViewResolver会将视图名解析为JSP文件。
  • Spring提供了两个JSP标签库,一个用于表单到模型的绑定,一个用于提供了通用的工具类特性。

配置适用于JSP的视图解析器

InternalResourceViewResolver会在视图名上添加前缀和后缀,进而确定Web应用中的视图资源的物理路径,如下代码使用@Bean注解,并设置了前缀和后缀的解析器。


@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}

也可使用XML的配置如下。


<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/views/"
p:suffix=".jsp" />

配置视图解析器后,home会被解析为/WEB-INF/views/home.jsp/books/detail会被解析为/WEB-INF/views/books/detail.jsp

InternalResourceViewResolver最终会将逻辑视图名解析为InternalResourceView实例,该实例会引用JSP文件,如果JSP文件中使用JSTL标签处理信息和格式化时,需要将其解析为JSTLView,此时需要设置解析器的viewClassJstlView.class即可。

使用Spring的JSP库

Spring提供了两个用来帮助定义Spring MVC Web视图的JSP标签库,其中一个标签库会用来渲染HTML表单标签,另一个标签库包含工具类标签。

Spring的表单绑定JSP标签库包含了14个标签,其中大多数用来渲染HTML的表单标签,其能够根据模型中对象的属性填充值,还包含展现用户错误的的标签,其会将错误信息渲染到最终的HTML中,可通过如下方式指定。


<%@ taglib uri="http://www.springframework.org/tags/form" prefix="cf" %>

在声明后,即可使用如下14个标签库。

针对不同地区展示不同信息已是国际化的重要组成部分,其关键在于使用<s:message>标签,如在home.jsp中添加<s:message code="spittr.welcome" />标签,然后在WebConfig中添加如下代码。


@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource();
resourceBundleMessageSource.setBasename("messages");
return resourceBundleMessageSource;
}

最后在resources/下添加messages.properties文件,并配置内容如下spitter.welcome=welcome!,启动,显示welcome!,还可配置message_zh.properties文件,内容配置如下spitter.welcome=china welcome!,启动,会显示china wecome!,即会根据本地时区选择合适的messages文件显示。

使用Apache Tiles视图定义布局

前面我们并未关注Web页面的布局问题,每个jsp完全负责定义自身的布局,假定需要为所有页面定义一个通用的头部和底部,这时可使用布局引擎如Apache Tiles,定义适用于所有页面的通用页面布局。

配置Tiles视图解析器

首先需要配置TilesConfigurerbean,它负责定位和加载Tile定义并协调生成Tiles,再者需要TilesViewResolverbean将逻辑视图名称解析为Tile定义。


@Bean
public TilesConfigurer tilesConfigurer() {
TilesConfigurer tilesConfigurer = new TilesConfigurer();
tilesConfigurer.setDefinitions("/WEB-INF/layout/tiles.xml");
tilesConfigurer.setCheckRefresh(true); return tilesConfigurer;
}

然后再定义tils.xml文件和对应的文件即可。

使用Thymeleaf

配置Thymeleaf视图解析器

需要配置如下三个bean

  • ThymeleafViewResolver,将逻辑视图名解析为Thymeleaf模版视图。
  • SpringTemplateEngine,处理模板并渲染结果。
  • TemplateResolver,加载Thymeleaf模板。

添加beanWebConfig中如下。


@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;
}

总结

Spring的视图渲染十分灵活,有传统的jsp方案(InternalResourceViewResolver),还有Tiles(TilesViewResolver)Thymeleaf(ThymeleafViewResolver)的布局引擎,开发者可根据自身需求选择合适的视图解析器。

【Spring】渲染Web视图的更多相关文章

  1. Spring实战第六章学习笔记————渲染Web视图

    Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...

  2. Spring学习(六)--渲染Web视图

    一.将模型数据渲染为Html 在上一篇文章中,我们所编写的控制器方法都没有直接产生浏览器中渲染所需的HTML.这些方法只是将数据填充到模型中,然后将模型传递给一个用来渲染的视图.这些方法会返回一个St ...

  3. Spring Boot☞ 使用Thymeleaf模板引擎渲染web视图

    静态资源访问 在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /s ...

  4. 第06章-渲染Web视图

    1. 理解视图解析 将控制器中请求处理的逻辑和视图中的渲染实现解耦是Spring MVC的一个重要特性.如果控制器中的方法直接负责产生HTML的话,就很难在不影响请求处理逻辑的前提下,维护和更新视图. ...

  5. SpringMVC之四:渲染Web视图

    理解视图解析 在前面的例子中,我们看到控制器返回的都是一个逻辑视图的名称,然后把这个逻辑视图名称交给view resolver,然后返回渲染后的 html 页面给 client. 将控制器中请求处理的 ...

  6. SpringBoot:2.SpringBoot整合Thymeleaf模板引擎渲染web视图

    在Web开发过程中,Spring Boot可以通过@RestController来返回json数据,那如何渲染Web页面?Spring Boot提供了多种默认渲染html的模板引擎,主要有以下几种: ...

  7. Spring 学习笔记(十)渲染 Web 视图 (Apache Tilesa 和 Thymeleaf)

    使用Apache Tiles视图定义布局 为了在Spring中使用Tiles,需要配置几个bean.我们需要一个TilesConfigurer bean,它会负责定位和加载Tile定义并协调生成Til ...

  8. Spring Boot☞ 使用velocity渲染web视图

    效果图: 代码 <!DOCTYPE html><html><head lang="en"> <meta charset="UTF ...

  9. Spring Boot☞ 使用freemarker模板引擎渲染web视图

    效果图 代码 package com.wls.integrateplugs.hello.controller; /** * Created by wls on 2017/8/24. */ import ...

随机推荐

  1. Oracle的trim( )、ltrim( )、rtrim( )三个函数的用法及注意事项

    学习一下用法整理trim().ltrim().rtrim()的用法 trim().ltrim().rtrim()三个函数有两个作用,分别是: 一.去除字符串前后空格(基本用法) trim(string ...

  2. popOver 弹出框简单使用

    1.仿QQ弹出框 1.1用到的知识点 1.1.1如何调整弹出框的大小(这里弹出的也是控制器) 这里已经有讲解过http://blog.csdn.net/iostiannan/article/detai ...

  3. 使用 Dawn 构建 React 项目

    开发一个 React 项目,通常避免不了要去配置 Webpack 和 babel 之类,以支持 commonjs 或 es 模块及各种 es 新语法,及及进行 jsx 语法的转义.当然也可以用 cre ...

  4. JS 数据处理技巧及小算法汇总( 一)

    前言: 金秋九月的最后一天,突然发现这个月博客啥也没更新,不写点什么总觉得这个月没啥长进,逆水行舟,不进则退,前进的路上贵在坚持,说好的每个月至少一到两篇,不能半途而废!好多知识写下来也能加深一下自身 ...

  5. Java公开课-01.类和对象

    一,类和对象的含义 1.类:类是具有相同属性(静态特征)和行为(功能 )的一系列事物的集合. eg:以下俩者是不是类 1)汽车  √ 2)小胖桌子上那个红色的杯子  × 2.对象:被精确限定到一个特殊 ...

  6. windows访问控制列表 --ACL(Access Control List)

    1.定义 ACL是一个windows中的表示用户(组)权限的列表. Access Control List(ACL) Access Control Entry(ACE) ... 2.分类 ACL分为两 ...

  7. asp.net中利用Jquery+Ajax+Json实现无刷新分页(二)

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="PageTest.aspx.cs ...

  8. 【学习】js学习笔记:数组(一)

    1.创建数组并赋值 //对象方式 var arr=new Array(1,2,3,4); //隐形声明方式 var arr2=[5,6,7,8]; 2.数组可以存储任何类型的数据 3.访问数组,是用下 ...

  9. 理解HTTPS

    总结HTTPS HTTPS要使客户端与服务器端的通信过程得到安全保证,必须使用的对称加密算法,但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全, ...

  10. 要让CLR挂掉的话……

    http://rednaxelafx.iteye.com/blog/460893 (Disclaimer:如果需要转载请先与我联系. 作者:RednaxelaFX -> rednaxelafx. ...