Thymeleaf

简介: Thymeleaf

✈️Thymeleaf介绍

首先,先贴一个官网地址,Thymeleaf官网:https://www.thymeleaf.org/

image.png


Thymeleaf 是什么?

官网:Thymeleaf is a modern server-side Java template engine for both web and standalone environments.

翻译:Thymeleaf 是一个现代的服务器端Java模板引擎,适用于web和独立环境。


HTML templates written in Thymeleaf still look and work like HTML, letting the actual templates that are run in yourapplication keep working as useful design artifacts.

用Thymeleaf编写的HTML模板的外观和工作方式仍然类似HTML,让运行在您的应用程序中的实际模板继续作为有用的设计工件工作。


Thymeleaf 是一个 XML/XHTML/HTML5 模板引擎,可用于 Web 与非 Web 环境中的应用开发。它是一个开源的 Java 库,基于 Apache License 2.0 许可,由 Daniel Fernández 创建。


Thymeleaf 提供了一个用于整合 Spring MVC 的可选模块,在应用开发中,你可以使用 Thymeleaf 来完全代替 JSP,或其他模板引擎,如 Velocity、FreeMarker 等。Thymeleaf 的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过验证的 XML 与 HTML 模板。相对于编写逻辑或代码,开发者只需将标签属性添加到模板中即可。


✈️为什么选择thymeleaf

静态html嵌入标签属性,浏览器可以直接打开模板文件

非常适合前后端的独立开发

SpringBoot官方推荐的模板

💬举个栗子

th:text="${msg}"是一个动态标签,当传递了msg这个数据,页面就会渲染这个标签,如果没有传递这个参数,就会显示原本的网页结构。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p th:text="${msg}"></p>
</body>
</html>

✈️Thymeleaf简单表达式

变量表达式::${…}

选择变量表达式:*{…}

消息表达式:#{…}

链接表达式:@{…}

片段表达式:~{…}

✈️Thymeleaf的常用属性

image.png

💬准备

创建一个springboot项目,然后添加依赖文件

pom.xml

<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

在使用 Thymeleaf 之前,首先要在页面的 html 标签中声明名称空间。

xmlns:th="http://www.thymeleaf.org"

💬th:text、th:utext

th:text

创建一个控制器方法,将信息传输给页面

@Controller
public class ThymeleafController {
    @GetMapping("/index")
    public String index(Model model){
        model.addAttribute("msg","Hello Thymeleaf!!!");
        return "index";
    }
}

创建一个html页面用来接收显示信息

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p th:text="${msg}"></p>
</body>
</html>

image.png

当然我们也可以通过右击鼠标或Ctrl+U查看一下网页源码,可以看到这里是把表达式的值直接放在了标签里面!

image.png


如果你想把传输到页面的数据通过html标签的方式加粗或着其他操作,就需要使用th:utext来显示文本!!!

格式如下:

model.addAttribute("msg","<b>欢迎访问Thymeleaf</b>");

th:utext

<p th:utext="${msg}"></p>

扩展:拼接字符串

<!--方式一:-->
<p th:text="${msg}+官网"></p>
<!--方式二:-->
<p th:text="|${msg}官网|"></p>

💬th:object

创建一个对象

@Data
public class People {
    private String name;
    private Integer age;
    private Integer sex;
    private Boolean isVip;
    private Date createTime;
    private List<String> tags;
}

新建一个方法,将people对象传给页面

@Controller
public class ThymeleafController {
    @GetMapping("/index")
    public String index(Model model){
        People people = new People();
        people.setName("Thymeleaf");
        people.setAge(20);
        people.setSex(1); // 1表示男  2表示女
        people.setIsVip(true);
        people.setCreateTime(new Date());
        people.setTags(Arrays.asList("Java","Go","Vue"));
        model.addAttribute("people",people);
        return "index";
    }
}

现在,如果让你把people对象的所有信息显示到页面上你会怎么做?

我们刚才学习了th:text,所以你可能会像下面这样的方式来显示!


<p th:text="${people.name}"></p>
<p th:text="${people.age}"></p>
<p th:text="${people.sex}"></p>
<p th:text="${people.isVip}"></p>
<p th:text="${people.createTime}"></p>
<p th:text="${people.tags}"></p>

这么写有问题吗?No problem!但这不是最好的方式,下面再来看一种新的方式,它的格式是这样的:

th:object

<div th:object="${people}">
    <p th:text="*{name}"></p>
    <p th:text="*{age}"></p>
    <p th:text="*{sex}"></p>
    <p th:text="*{isVip}"></p>
    <p th:text="*{createTime}"></p>
    <p th:text="*{tags}"></p>
</div>

这种方式用到了thymeleaf为我们提供的th:object属性以及变量表达式*{...}


💬th:value

比如设置文本框的内容为people的name

<input type="text" th:value="${people.name}">

💬th:if、th:unless

th:if:控制标签是否显示,if表达式的值为 true 则显示,否则不显示;

th:unless:与th:if相反,表达式为fakse时显示,反之,不显示。

th:if

<div th:if="${true}">显示</div>
<!--th:if="${false}" 此时就不会生成这个div标签-->

举个栗子: 判断people是否为会员,是,就在页面显示VIP,不是则不显示。

<div th:if="${people.isVip}">VIP</div>

我们在这里传参时people.setIsVip(true);传的参数为true,下面看效果:

image.png

th:unless

<div th:unless="${true}">不显示</div>

image.png

💬th:switch、th:case

people的sex为1则显示男,2 则显示女,*则显示保密。使用方式如下:

<div th:switch="${people.sex}">
    <p th:case="1">男</p>
    <p th:case="2">女</p>
    <p th:case="*">保密</p>
</div>

注意:* 要放在最后,切记!切记!切记!


💬th:each

th:each

通过循环迭代显示people的tags信息

<ul>
    <li th:each="tag:${people.tags}" th:text="${tag}"></li>
</ul>

image.png


将当前迭代的最后一个颜色设置为红色

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .active{
            color: red;
        }
    </style>
</head>
<body>
<ul>
    <li th:each="tag,iterStat:${people.tags}"
        th:text="${tag}"
        th:classappend="${iterStat.last}?active">
    </li>
</ul>
</body>
</html>

image.png

th:each属性状态变量iterStat


状态变量iterStat包含以下数据:


index属性,当前迭代索引,从0开始

count属性,当前迭代索引,从1开始

size属性,迭代变量中的元素总数

current属性,每次迭代的iter变量。

even/odd布尔属性,当前迭代是偶数还是奇数

first属性,当前迭代是否是第一个,布尔值。

last布尔属性,当前迭代是否是最后一个,布尔值。

💬th:href

index.css
.app{
    height: 100px;
    width:100px;
    background-color: aqua;
}

通过外链的方式连接index.css文件

<link rel="stylesheet" th:href="@{index.css}">
<a th:href="@{https://www.baidu.com/}">百度一下</a>

image.png


✈️内联表达式

[[…]]相当于th:text,即会将HTML代码转义

[(…)]相当于th:utext,不会转义HTML代码

<div>[[${people.age}]]</div>
<div>[(${msg})]</div>

在JavaScript中使用内联表达式

<script th:inline="javascript">
    const people= /*[[${people}]]*/{};
    console.log(people)
</script>

image.png

✈️基本对象

💬#ctx:上下文对象

${#ctx.request}
${#ctx.response}
${#ctx.session}
${#ctx.servletContext}

💬请求/会话属性

${session.xxx}                 
${application.xxx}          
${#request.getAttribute('xxx')}
相关文章
|
7月前
|
监控 算法 Java
深入理解JVM《垃圾收集(GC)机制与算法 - 宇宙的清洁工》
Java通过垃圾收集(GC)实现自动内存管理,避免手动释放内存导致的泄漏或崩溃。主流JVM采用可达性分析算法判断对象生死,结合分代收集理论,使用标记-清除、复制、标记-整理等算法回收内存。G1、ZGC等现代收集器进一步提升性能与停顿控制。
|
10月前
|
消息中间件 供应链 前端开发
如何开发供应商管理系统中的订单协同板块(附架构图+流程图+代码参考)
在现代企业供应链管理中,订单协同是连接采购、销售、供应商与库存的重要环节。本文详解供应商管理系统中订单协同板块的设计与实现,涵盖功能模块、业务流程、技术架构及代码示例,帮助企业提升供应链效率,降低库存风险,优化订单管理流程。
|
存储 算法 Java
算法系列之递归反转单链表
递归反转链表的基本思路是将当前节点的next指针指向前一个节点,然后递归地对下一个节点进行同样的操作。递归的核心思想是将问题分解为更小的子问题,直到达到基本情况(通常是链表末尾)。
517 5
算法系列之递归反转单链表
|
消息中间件 存储 负载均衡
kafka底层原理分析
kafka底层原理分析
425 2
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 的使用
本文介绍了 Thymeleaf 在 Spring Boot 项目中的使用方法,包括访问静态页面、处理对象和 List 数据、常用标签操作等内容。通过示例代码展示了如何配置 404 和 500 错误页面,以及如何在模板中渲染对象属性和列表数据。同时总结了常用的 Thymeleaf 标签,如 `th:value`、`th:if`、`th:each` 等,并提供了官方文档链接以供进一步学习。
921 0
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 的使用
|
机器学习/深度学习 算法
本周推荐 | AB实验低响应情景解决实践
推荐语:本文针对AB实验低响应情景下的增量效果不显著问题,提出通过倾向得分匹配方案来衡量策略增量效果的方法,并将相关方案融入一休平台科学评估体系中。文章理论与实践相结合,深入浅出,强烈推荐。 ——大淘宝技术数据研发工程师 伯略
552 0
本周推荐 | AB实验低响应情景解决实践
|
前端开发 Oracle Java
JSF(JavaServer Face)标签库简介(JavaEE)
JSF(JavaServer Faces)是JavaEE框架,用于简化Web应用开发,采用组件驱动方式和MVC模式确保可维护性。主要实现包括PrimeFaces、Apache MyFaces和ICEFaces。JSF通过JCP标准化,Oracle提供了JSF2.2和2.3的实现库。JSF应用涉及UI设计、前后端分离及JavaBean交互。实现过程包括网站结构创建、库文件配置、Tomcat的JSF标签库设置以及启动验证。通过创建JSF页面如hello.xhtml,展示其工作原理。
914 2
|
SQL Shell 数据库
在TDengine容器中创建初始化数据库的Shell命令实例
以上就是在Docker容器环境中部署并初始化TDengine数据库的全过程,希望对你有所帮助。
647 0
|
小程序 前端开发 UED
详细讲解uniapp转小程序分包教程!!!
详细讲解uniapp转小程序分包教程!!!
|
Dubbo Java 应用服务中间件
微服务框架(二)Spring Boot 集成 Dubbo
  此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。 本文为此Spring Boot通过使用起步依赖dubbo-spring-boot-starter及自动装配的方式集成Dubbo。
微服务框架(二)Spring Boot 集成 Dubbo