【Spring】渲染Web视图
前言
前面学习了编写
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
,此时需要设置解析器的viewClass
为JstlView.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视图解析器
首先需要配置TilesConfigurer
的bean
,它负责定位和加载Tile
定义并协调生成Tiles
,再者需要TilesViewResolver
的bean
将逻辑视图名称解析为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
模板。
添加bean
至WebConfig
中如下。
@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视图的更多相关文章
- Spring实战第六章学习笔记————渲染Web视图
Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...
- Spring学习(六)--渲染Web视图
一.将模型数据渲染为Html 在上一篇文章中,我们所编写的控制器方法都没有直接产生浏览器中渲染所需的HTML.这些方法只是将数据填充到模型中,然后将模型传递给一个用来渲染的视图.这些方法会返回一个St ...
- Spring Boot☞ 使用Thymeleaf模板引擎渲染web视图
静态资源访问 在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /s ...
- 第06章-渲染Web视图
1. 理解视图解析 将控制器中请求处理的逻辑和视图中的渲染实现解耦是Spring MVC的一个重要特性.如果控制器中的方法直接负责产生HTML的话,就很难在不影响请求处理逻辑的前提下,维护和更新视图. ...
- SpringMVC之四:渲染Web视图
理解视图解析 在前面的例子中,我们看到控制器返回的都是一个逻辑视图的名称,然后把这个逻辑视图名称交给view resolver,然后返回渲染后的 html 页面给 client. 将控制器中请求处理的 ...
- SpringBoot:2.SpringBoot整合Thymeleaf模板引擎渲染web视图
在Web开发过程中,Spring Boot可以通过@RestController来返回json数据,那如何渲染Web页面?Spring Boot提供了多种默认渲染html的模板引擎,主要有以下几种: ...
- Spring 学习笔记(十)渲染 Web 视图 (Apache Tilesa 和 Thymeleaf)
使用Apache Tiles视图定义布局 为了在Spring中使用Tiles,需要配置几个bean.我们需要一个TilesConfigurer bean,它会负责定位和加载Tile定义并协调生成Til ...
- Spring Boot☞ 使用velocity渲染web视图
效果图: 代码 <!DOCTYPE html><html><head lang="en"> <meta charset="UTF ...
- Spring Boot☞ 使用freemarker模板引擎渲染web视图
效果图 代码 package com.wls.integrateplugs.hello.controller; /** * Created by wls on 2017/8/24. */ import ...
随机推荐
- MyBatis框架(三)动态SQL,分页,二进制存入数据库图片
一.动态sql语句,分页 1, <if>条件 <if test="key!=null"> 拼接sql语句 </if> 2, <choose ...
- Lodop 动态加载模板,动态加载数据
最近需要使用Lodop打印控件,所以就研究了一下,期间从网上找了诸多的东西,基本全是对HTML进行打印的,没有找到我想要的,就只好自己动手丰衣足食. 这篇文章主要讲述的是Lodop与数据的结合使用,官 ...
- Hive如何添加第三方JAR
以加入elsaticsearch-hadoop-2.1.2.jar为例,讲述在Hive中加入第三方jar的几种方式. 1,在hive shell中加入 [hadoop@hadoopcluster78 ...
- Java环境配置小记
今年新开Java课程第一步就是-配置环境 博客开坑,就从Java的环境配置开始好了 以下是正式的步骤 首先,从Oracle的官网下载jdk的安装包 点我下载Java SE开发套件 先点接受许可协议,然 ...
- 关于Android路由的实现
先说一下背景,目前有需求从外部包括其他应用和WEB跳转到我们自己的APP,就这么个简单的需求-- 要实现这种外部跳转的功能,我们可以理解为打算跳转的一方有多少方式通知到APP进行相对的响应行为.所以, ...
- myeclipse的快捷键
------------------------------------MyEclipse 快捷键1(CTRL)-------------------------------------Ctrl+1 ...
- 用java编写一个微博登陆页面
上次也写了一个微博登陆页面,不过功能还不够完善.今天重新完善了一些功能,分享出来给大家. 基本功能如下: (1)具有类似新浪微博的用户注册图形界面. (2)使用用户名或手机号注册,注册时需要提供新密码 ...
- iOS在类内部怎么访问实例变量比较好?
OC在类文件的内部访问实例变量,有直接访问和使用getter/setter方法访问两种方式,它们的区别有: 1.直接访问不经过OC的方法分发(method dispatch),所以访问速度比较快,在这 ...
- 一步一个坑 - WinDbg调试.NET程序
引言 第一次用WinDbg来排查问题,花了很多时间踩坑,记录一下希望对后面的同学有些帮助. 客户现场软件出现偶发性的界面卡死现象一直找不出原因,就想着让客户用任务管理器生成了一个dump文件发给我,我 ...
- swift实现与OC的混编
swift与OC的混编 现在写swift,很多的类库还不是很全,很多的第三方还是只有OC版的,这个时候swift想用,通常都是采用的swift和OC混编的方式.这里给大家演示一下混编是如何做的. sw ...