点击“牧码小子”关注,和众多大牛一起成长!

关注后,后台回复 java ,领取松哥为你精心准备的技术干货!


虽然现在慢慢在流行前后端分离开发,但是据松哥所了解到的,还是有一些公司在做前后端不分的开发,而在前后端不分的开发中,我们就会需要后端页面模板(实际上,即使前后端分离,也会在一些场景下需要使用页面模板,例如邮件发送模板)。

早期的 Spring Boot 中还支持使用 Velocity 作为页面模板,现在的 Spring Boot 中已经不支持 Velocity 了,页面模板主要支持 Thymeleaf 和 Freemarker ,当然,作为 Java 最最基本的页面模板 Jsp ,Spring Boot 也是支持的,只是使用比较麻烦。

松哥打算用三篇文章分别向大家介绍一下这三种页面模板技术。

今天我们主要来看看 Thymeleaf 在 Spring Boot 中的整合!

Thymeleaf 简介

Thymeleaf 是新一代 Java 模板引擎,它类似于 Velocity、FreeMarker 等传统 Java 模板引擎,但是与传统 Java 模板引擎不同的是,Thymeleaf 支持 HTML 原型。

它既可以让前端工程师在浏览器中直接打开查看样式,也可以让后端工程师结合真实数据查看显示效果,同时,SpringBoot 提供了 Thymeleaf 自动化配置解决方案,因此在 SpringBoot 中使用 Thymeleaf 非常方便。

事实上, Thymeleaf 除了展示基本的 HTML ,进行页面渲染之外,也可以作为一个 HTML 片段进行渲染,例如我们在做邮件发送时,可以使用 Thymeleaf 作为邮件发送模板。

另外,由于 Thymeleaf 模板后缀为 .html,可以直接被浏览器打开,因此,预览时非常方便。

整合

  • 创建项目

Spring Boot 中整合 Thymeleaf 非常容易,只需要创建项目时添加 Thymeleaf 即可:

创建完成后,pom.xml 依赖如下:

org.springframework.boot

spring-boot-starter-thymeleaf

org.springframework.boot

spring-boot-starter-web

当然,Thymeleaf 不仅仅能在 Spring Boot 中使用,也可以使用在其他地方,只不过 Spring Boot 针对 Thymeleaf 提供了一整套的自动化配置方案,这一套配置类的属性在 org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties 中,部分源码如下:

@ConfigurationProperties(prefix = "spring.thymeleaf")

public class ThymeleafProperties {

private static final Charset DEFAULT_ENCODING = StandardCharsets.UTF_8;

public static final String DEFAULT_PREFIX = "classpath:/templates/";

public static final String DEFAULT_SUFFIX = ".html";

private boolean checkTemplate = true;

private boolean checkTemplateLocation = true;

private String prefix = DEFAULT_PREFIX;

private String suffix = DEFAULT_SUFFIX;

private String mode = "HTML";

private Charset encoding = DEFAULT_ENCODING;

private boolean cache = true;

//...

}

  1. 首先通过 @ConfigurationProperties 注解,将 application.properties 前缀为 spring.thymeleaf 的配置和这个类中的属性绑定。

  2. 前三个 static 变量定义了默认的编码格式、视图解析器的前缀、后缀等。

  3. 从前三行配置中,可以看出来, Thymeleaf 模板的默认位置在 resources/templates 目录下,默认的后缀是 html 。

  4. 这些配置,如果开发者不自己提供,则使用 默认的,如果自己提供,则在 application.properties 中以 spring.thymeleaf 开始相关的配置。

而我们刚刚提到的,Spring Boot 为 Thymeleaf 提供的自动化配置类,则是 org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration ,部分源码如下:

@Configuration

@EnableConfigurationProperties(ThymeleafProperties.class)

@ConditionalOnClass({ TemplateMode.class, SpringTemplateEngine.class })

@AutoConfigureAfter({ WebMvcAutoConfiguration.class, WebFluxAutoConfiguration.class })

public class ThymeleafAutoConfiguration {

}

可以看到,在这个自动化配置类中,首先导入 ThymeleafProperties ,然后 @ConditionalOnClass 注解表示当当前系统中存在 TemplateModeSpringTemplateEngine 类时,当前的自动化配置类才会生效,即只要项目中引入了 Thymeleaf 相关的依赖,这个配置就会生效。

这些默认的配置我们几乎不需要做任何更改就可以直接使用了。如果开发者有特殊需求,则可以在 application.properties 中配置以 spring.thymeleaf 开头的属性即可。

  • 创建 Controller

接下来我们就可以创建 Controller 了,实际上引入 Thymeleaf 依赖之后,我们可以不做任何配置。新建的 IndexController 如下:

@Controller

public class IndexController {

@GetMapping("/index")

public String index(Model model) {

List<User> users = new ArrayList<>();

for (int i = 0; i < 10; i++) {

User u = new User();

u.setId((long) i);

u.setName("javaboy:" + i);

u.setAddress("深圳:" + i);

users.add(u);

}

model.addAttribute("users", users);

return "index";

}

}

public class User {

private Long id;

private String name;

private String address;

//省略 getter/setter

}

IndexController 中返回逻辑视图名+数据,逻辑视图名为 index ,意思我们需要在 resources/templates 目录下提供一个名为 index.htmlThymeleaf 模板文件。

  • 创建 Thymeleaf

lang="en" xmlns:th="http://www.thymeleaf.org">

charset="UTF-8">

Title

border="1">

编号

用户名

地址

th:each="user : ${users}">

th:text="${user.id}">

th:text="${user.name}">

th:text="${user.address}">

Thymeleaf 中,通过 th:each 指令来遍历一个集合,数据的展示通过 th:text 指令来实现,

注意 index.html 最上面要引入 thymeleaf 名称空间。

配置完成后,就可以启动项目了,访问 /index 接口,就能看到集合中的数据了:

另外, Thymeleaf 支持在 js 中直接获取 Model 中的变量。例如,在 IndexController 中有一个变量 username

@Controller

public class IndexController {

@GetMapping("/index")

public String index(Model model) {

model.addAttribute("username", "李四");

return "index";

}

}

在页面模板中,可以直接在 js 中获取到这个变量:

<script th:inline="javascript">

var username = [[${username}]];

console.log(username)

script>

这个功能算是 Thymeleaf 的特色之一吧。

手动渲染

前面我们说的是返回一个 Thymeleaf 模板,我们也可以手动渲染 Thymeleaf 模板,这个一般在邮件发送时候有用,例如我在 resources/templates 目录下新建一个邮件模板,如下:

lang="en" xmlns:th="http://www.thymeleaf.org">

charset="UTF-8">

Title

hello 欢迎 th:text="${username}">加入 XXX 集团,您的入职信息如下:

border="1">

职位

th:text="${position}">

薪水

th:text="${salary}">

src="http://www.javaboy.org/images/sb/javaboy.jpg" alt="">

这一个 HTML 模板中,有几个变量,我们要将这个 HTML 模板渲染成一个 String 字符串,再把这个字符串通过邮件发送出去,那么如何手动渲染呢?

@Autowired

TemplateEngine templateEngine;

@Test

public void test1() throws MessagingException {

Context context = new Context();

context.setVariable("username", "javaboy");

context.setVariable("position", "Java工程师");

context.setVariable("salary", 99999);

String mail = templateEngine.process("mail", context);

//省略邮件发送

}

  1. 渲染时,我们需要首先注入一个 TemplateEngine 对象,这个对象就是在 Thymeleaf 的自动化配置类中配置的(即当我们引入 Thymeleaf 的依赖之后,这个实例就有了)。

  2. 然后构造一个 Context 对象用来存放变量。

  3. 调用 process 方法进行渲染,该方法的返回值就是渲染后的 HTML 字符串,然后我们将这个字符串发送出去。

这是 Spring Boot 整合 Thymeleaf 的几个关键点,关于 Thymeleaf 这个页面模板本身更多的用法,大家可以参考 Thymeleaf 的文档:https://www.thymeleaf.org。

总结

本文主要向大家简单介绍了 Spring Boot 和 Thymeleaf 整合时的几个问题,还是比较简单的,大家可以阅读 Thymeleaf 官方文档学习 Thymeleaf 的更多用法。本文案例我已上传到 GitHub ,欢迎大家 star :https://github.com/lenve/javaboy-code-samples

关于本文,有问题欢迎留言讨论。

●另一种缓存,Spring Boot 整合 Ehcache

●Spring Boot 整合 Shiro ,两种方式全总结!

●Docker 入门及安装[Docker 系列-1]

●Spring Boot 中 10 行代码构建 RESTful 风格应用

●Nginx 极简入门教程!

●Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!

●Spring Boot 操作 Redis,三种方案全解析!

●面试干货 | Java 能否自定义一个类叫 java.lang.System?

●这一次,我连 web.xml 都不要了,纯 Java 搭建 SSM 环境

●没有一条路是容易的,特别是转行计算机这条路

你点的每个赞,我都认真当成了喜欢

java 模板引擎_极简 Spring Boot 整合 Thymeleaf 页面模板相关推荐

  1. Spring Boot整合Thymeleaf模板引擎

    转载自 Spring Boot整合Thymeleaf模板引擎 什么是Thymeleaf Thymeleaf是一款用于渲染XML.XHTML.HTML5内容的模板引擎.类似Velocity,FreeMa ...

  2. spring boot整合Thymeleaf简单运用与入坑水贴

    1.1 Thymeleaf是什么 Thymeleaf是面向Web和独立环境的现代服务器端Java模板引擎,能够处理HTML,XML,JavaScript,CSS甚至纯文本. 1.2 Thymeleaf ...

  3. springboot java获取版本号_深入实践Spring Boot 实战篇,大佬整理出的PDF文档

    如何使用Spring Boot 本文章将会详细介绍如何使用Spring Boot.它覆盖了构建系统,自动配置和运行/部署选项等主题.我们也覆盖了一些Spring Boot最佳实践.尽管Spring B ...

  4. java option请求_如何在Spring Boot中处理HTTP OPTIONS请求?

    选项1:Spring Boot属性(仅限Spring Boot 1.3.0) 从Spring Boot 1.3.0开始,可以使用以下属性配置此行为: spring.mvc.dispatch-optio ...

  5. java 数据源调用_实战分享: Spring boot 调用之间实现动态数据源

    需求: 根据项目部署在不同的域名,在同一套系统下,分别访问不同的数据库 (当然在看别人帖子的时候,也发现了不同接口访问不同数据源问题,就是分库动态数据源需求了,其实实现都一样) 业务描述: 部署的时候 ...

  6. Spring Boot整合thymeleaf

    转载自面皮大师的简书 https://www.jianshu.com/p/8d2cc7207fb2

  7. Spring Boot整合thymeleaf异常 —— 无法通过th:text=“${xxx}“取到值的解决方法

    问题 前端页面 index.html ${msg}处爆红,无法取到值. <!doctype html><!--注意:引入thymeleaf的名称空间--> <html l ...

  8. java 模板引擎_Spring Boot 如何快熟整合Thymeleaf模板引擎

    前面介绍了Spring Boot的优点,然后介绍了如何快速创建Spring Boot 项目.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/ ...

  9. freemarker ftl模板_Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

    今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...

最新文章

  1. UVa563 - Crimewave
  2. php必须掌握的库,PHP初學者必須掌握的10個知識點
  3. Linux系统编程(七)消息队列
  4. 关于VB.NET 菜单栏ToolStripMenu 下拉菜单单选功能的实现
  5. 配置Nginx不同域名访问不同项目
  6. Laravel关联模型中过滤结果为空的结果集(has和with区别)
  7. 2019.04.07 电商12 登录界面的验证
  8. c#读取文本文件出现乱码
  9. oracle row number (),Oracle 分析函数 ROW_NUMBER() 使用
  10. java爆炸图片切换,jQuery实现图片爆炸效果
  11. 投屏索尼电视显示访问服务器,索尼电视投屏如何设置 苹果手机投屏索尼电视...
  12. 浅谈SSD,eMMC,UFS
  13. 燕山大学软件测试,工程技术研究期刊版面费_软件测试期刊_燕山大学学报版面费...
  14. playframework 笔记——搭建自己的paly工程
  15. 马尔代夫的华为“新4军”
  16. 热闹之后,香港是否会成为Web3的“应许之地”?
  17. 04741计算机网络原理2018年版-第八章 网络安全基础 知识要点
  18. 如何更改Code::Blocks背景颜色(懒人版)
  19. 【历史上的今天】9 月 2 日:互联网的“诞生日”;三星逐步跌落神坛;世界上第一个ATM自动取款机
  20. Thinkpad X200 换屏记

热门文章

  1. c语言 线程a每隔10秒执行一次,线程b每隔100秒执行一次,线程池执行时多线程每隔100ms执行一次线程任务 求解答...
  2. centos llvm安装_在CentOS上编译安装llvm-3.8.1详细教程
  3. java 部分正确性_深入理解java快速排序的正确性
  4. c语言 结构数组读取,有关文件读写到结构体数组问题;
  5. sftp shell 批量上传文件_shell脚本进行sftp、ftp文件批量上传与下载
  6. scala与python混合调用实验
  7. 可疑文件_Windows 10 Defender误删除了我的文件,用这个方法,轻松恢复
  8. 先考一键还是先学java_是先考C还是先考JAVA
  9. mysql router手册_mysql router
  10. java数组 序列化_程序猿的日常——Java基础之clone、序列化、字符串、数组