【Spring Boot】Thymeleaf模板引擎 — 表达式的语法

news2024/11/18 15:31:02

表达式的语法

模板的主要作用是将后台返回的数据渲染到HTML中。那么Thymeleaf是如何解析后台数据的呢?接下来从变量、方法、条件判断、循环、运算(逻辑运算、布尔运算、比较运算、条件运算)方面学习Thymeleaf表达式支持的语法。

1.赋值和拼接

(1)文本赋值

赋值就是通过${}标签将后台返回的数据替换到页面中。

<p th:text="${name}">hello spring boot</p>

(2)文本拼接

Thymeleaf支持将后台返回的值和现有的内容进行拼接,然后替换到页面中。示例代码如下:

<span th:text=" 'Welcome,' + ${username} + '!' "></span>

在上面的示例中,将后台返回的userName的值拼接到“Welcome,”之后,最后统一替换到页面的<span>中。文本文字可以用单引号来包含,如有特殊字符,需要用“\”转义。

除了上面这种写法外,字符串拼接还有另一种简洁的写法:

<span th:text="|Welcome, + ${username} + !|"></span>

在上面的示例中,使用两个竖杠“|”将后台返回的数据与页面中的内容合并。

Thymeleaf标签和HTML的基本一致,在HTML的标签上加上“th:”即可替换HTML标签中原生属性的值。

2.条件判断

Thymeleaf中使用th:if和th:unless属性进行条件判断。在标签中使用th:if属性判断表达式是否成立,成立则显示该标签的内容,不成立则隐藏该标签的内容。th:unless与th:if恰好相反,只有表达式中的条件不成立才会显示其内容。

th:if和th:unless表达式的结果支持boolean、number、character、string及其他类型。下面通过例子演示Thymeleaf中如何使用th:if和th:unless属性进行条件判断。

步骤01 定义HTML页面。

在templates目录下创建if.html页面,示例代码如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head lang="en">
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Thymeleaf模板引擎</h1>
<h3>条件判断</h3>
<a th:if="${flag == 'yes'}" th:href="@{http://www.a.home/}">a.home</a>
<a th:unless="${flag != 'no'}" th:href="@{http://www.b.home/}">b.home</a>
</body>
</html>

在上面的例子中,通过th:if标签进行条件判断,如果flag==yes,就显示a.home的链接,否则显示b.home的链接。

步骤02 定义后端接口,返回数据结果。

    @RequestMapping("/if")
    public String ifunless(ModelMap map) {
        map.addAttribute("flag","yes");
        return "if";
    }

在上面的示例中,定义请求的地址,返回if.html页面,并返回flag的值为yes。

步骤03 启动验证。

启动项目后,在浏览器中输入地址http://localhost:8080/if,如图所示。
在这里插入图片描述
由图可知,后端返回的flag值为yes,th:if="${flag == 'yes'}"条件成立,所以显示a.home的链接。而th:unless="${flag != 'no'}" 条件也成立,所以隐藏b.home的链接。

3.switch

Thymeleaf中使用th:switch、th:case标签进行多条件判断,与Java中的switch语句等效,根据条件显示匹配的内容,如果有多个匹配结果,只选择第一个显示。th:case="*"表示默认选项,即没有case的值为true时显示th:case="*"的内容,对应Java中switch的default。下面以数据状态为例来演示th:switch的用法。

步骤01 创建前端页面。

在templates目录下创建switch.html页面,示例代码如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"></meta>
    <title>Example switch</title>
</head>
<body>
<h1>Thymeleaf模板引擎</h1>
<h3>switch</h3>
<div>
    <div th:switch="${status}">
        <p th:case="'todo'">未开始</p>
        <p th:case="'doing'">进行中</p>
        <p th:case="'done'">完成</p>
        <!-- *case的默认选项 -->
        <p th:case="*">状态错误</p>
    </div>
</div>
</body>
</html>

在上面的示例代码中,使用th:switch、th:case标签根据后台返回的status的值显示匹配数据。

步骤02 添加后端程序。

    @RequestMapping("/switch")
    public String ifunless(ModelMap map) {
        map.addAttribute("status","doing");
        return "switch";
    }

在上面的示例中,后台返回switch.html页面,同时返回status值为doing。

步骤03 运行验证。

启动项目,在浏览器中输入地址http://localhost:8080/switch,页面显示效果如图所示。页面显示“进行中”的状态,可以在后台更改status的值来查看结果。

在这里插入图片描述
由图可知,switch.html页面通过后台返回的status的值来显示不同的内容。

4.循环遍历

循环遍历在日常项目中比较常用,一般用于将后台返回的数据渲染到前端的表格中。Thymeleaf可以使用th:each标签进行数据的迭代循环,语法:th:each="obj,iterStat:${objList}",支持List、Map、数组数据类型等。下面通过简单的例子演示数据循环遍历的过程。

步骤01 定义后端数据。

首先在后端定义一个用户列表,然后传递到前端页面:

    @RequestMapping("/list")
    public String list(ModelMap map) {
        List<User> list = new ArrayList();
        User user1 = new User("spring", 12, "123456");
        User user2 = new User("boot", 6, "123456");
        User user3 = new User("Thymeleaf", 68, "123456");
        list.add(user1);
        list.add(user2);
        list.add(user3);
        map.addAttribute("user", list);
        return "list";
    }

在上面的示例代码中,后台返回list.html页面,同时返回ArrayList类型的用户列表数据。

步骤02 创建前台页面。

在templates目录下创建list.html页面,展示后台的数据,示例代码如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"></meta>
    <title>Example switch</title>
</head>
<body>
<h1>Thymeleaf模板引擎</h1>
<h3>each循环遍历</h3>
<div>
    <table>
        <tr>
            <th>姓名</th>
            <th>年龄</th>
            <th>密码</th>
            <th>变量: index</th>
            <th>变量: count</th>
            <th>变量: size</th>
            <th>变量: even</th>
            <th>变量: odd</th>
            <th>变量: first</th>
            <th>变量: last</th>
        </tr>
        <tr th:each="user,stat : ${users}">
            <td th:text="${user.name}">name</td>
            <td th:text="${user.age}">age</td>
            <td th:text="${user.password}">password</td>
            <td th:text="${iterStat.index}">index</td>
            <td th:text="${iterStat.count}">count</td>
            <td th:text="${iterStat.size}">size</td>
            <td th:text="${iterStat.even}">even</td>
            <td th:text="${iterStat.odd}">odd</td>
            <td th:text="${iterStat.first}">first</td>
            <td th:text="${iterStat.last}">last</td>
        </tr>
    </table>
</div>
</body>
</html>

循环遍历通过th:each实现,语法:th:each="obj,stat:${objList}"

1)${users}是从模板上下文中获取变量。

2)user是${users}变量遍历后的每一个对象。

3)${user.name}可以读取遍历中的变量。

在遍历的同时,也可以获取迭代对象的迭代状态变量stat,它包含如下属性:

  • index:当前迭代对象的index(从0开始计算)。
  • count:当前迭代对象的index(从1开始计算)。
  • size:被迭代对象的大小。
  • even/odd:布尔值,当前循环是不是偶数/奇数(从0开始计算)。
  • first:布尔值,当前循环是不是第一个。
  • last:布尔值,当前循环是不是最后一个。

步骤03 运行验证。

启动项目,在浏览器中输入地址:http://localhost:8080/list,页面显示效果如图所示。

在这里插入图片描述

由图可知,后端返回的list数据被循环遍历并显示在页面中,同时th:each标签还提供了index、count等标签。

5.运算符

Thymeleaf支持在表达式中使用算术运算、逻辑运算、布尔运算、三目运算等各类数据计算功能,实现前端页面根据后台返回数据动态显示页面信息。下面就来一一演示。

5.1算术运算符

算术运算符包括+、-、*、/、%等简单的计算。

<th:with="isEven=(${prodStat.count} / 2 == 0)">

在上面的示例中,通过除以2的算术运算判断奇偶。

5.2关系运算符

关系运算符包括>、<、>=、<=、==、!=,对应的别名为gt、lt、ge、le、eq、ne,使用>、<时需要用它的HTML转义符,所以建议使用gt、lt等别名:

  • gt:great than(大于)。
  • ge:great equal(大于等于)。
  • eq:equal(等于)。
  • lt:less than(小于)。
  • le:less equal(小于等于)。
  • ne:not equal(不等于)。
<th:if="${prodStat.count} gt 1">

使用gt比较count的值是否大于1。

5.3逻辑运算符

通过逻辑运算符实现多个条件判断,包括&&(and)和||(or)。

&&(and)表示“并且”,示例如下:

<div th:if="${age gt 10 && a lt 19}"></div>

<div th:if=" (${age gt 10}) and ${age lt 19} "></div>

上面的示例表示:如果age>10且age <19,实现年龄是否在10~19岁的判断。

|| or表示“或者”,示例如下:

<div th:if="${age gt 10 || age lt 19}"></div>

<div th:if=" (${age gt 10}) or ${age lt 19} "></div>

上面的示例表示:如果age > 10或age < 19,实现年龄大于10岁或者年龄小于19岁的判断。

5.4三目运算符

三目运算符的语法与Java等语言类似,具体使用如下:

<tr th:class="${row.even}? 'even' : 'odd' ">
...
</tr>

在上面的示例中,在前端列表进行数据渲染,实现用颜色隔行显示的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/837542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

eclipse Java Editor Templates

​ Window - Preferences - Java - Editor - Templates ​ date ${currentDate:date(yyyy.MM.dd)}

KubeSphere 社区双周报 | 本周六上海站 Meetup 准时开启 | 2023.7.21-08.03

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.07.21-2023.…

逆向时如何找到MingGW(GNU)编译程序的main函数

编译器是MingGW生成的可执行文件的显著特点是, 最终运行ZwContinue后程序就莫名其妙启动了, 也找不到main函数。 为了探究里面究竟怎么回事, 我找到了wrk-v1.2的源码, 其中包含了ZwContinue的实现, 首先先看一下注释, API界面包含了2个参数, 其中让人感兴趣的是PCONTEXT, 这是…

git merge 和rebase区别

Merge the incoming changes into the current branch 找到两个分支的祖先 commit&#xff0c;然后将公共分支最新版合并到自己的分支&#xff0c;形成一个新的 commit 提交&#xff0c;用图表示如下。 Rebase the current branch on top of the incoming Rebase 则是重新基于…

蓝桥杯上岸每日N题 第八期 (全球变暖)!!!

蓝桥杯上岸每日N题第八期(全球变暖)&#xff01;&#xff01;&#xff01; 同步收录 &#x1f447; 蓝桥杯上岸必背&#xff01;&#xff01;&#xff01;(第五期BFS) 大家好 我是寸铁&#x1f4aa; 冲刺蓝桥杯省一模板大全来啦 &#x1f525; 蓝桥杯4月8号就要开始了 &am…

JVM内存模型结构

什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一个虚构出来的计算机&#xff0c;有着自己完善的硬件架构&#xff0c;如处理器、堆栈等。 为什么需要JVM&#xff1f; Java语言使用Java虚拟机屏蔽了与具体平台相关的信息&…

9 多进程编程

文章目录 进程以及状态进程进程的状态linux下的进程管理pstopbgkillcrontab 进程的创建两个while同时运行示例获取进程pidProcess 结构给子进程指定的函数传递参数进程间是否共享全局变量补充 进程间通信-Queue常用操作Queue 实例 管道通信&#xff08;了解&#xff09;样例 进…

PDM系统的项目跟踪功效

在现代企业管理中&#xff0c;项目跟踪是一个至关重要的环节。PDM系统&#xff08;Product Data Management&#xff0c;产品数据管理&#xff09;作为一款强大的数字化工具&#xff0c;为企业提供了高效的项目跟踪优势。让我们一同深入探讨&#xff0c;看看PDM系统是如何通过项…

JavaWeb 手写Tomcat底层机制

目录 一、Tomcat底层整体架构 1.简介 : 2.分析图 : 3.基于Socket开发服务端的流程 : 4.打通服务器端和客户端的数据通道 : 二、多线程模型的实现 1.思路分析 : 2.处理HTTP请求 : 3.自定义Tomcat : 三、自定义Servlet规范 1. HTTP请求和响应 : 1 CyanServletRequest …

提高测试用例质量的6大注意事项

在软件测试中&#xff0c;经常会遇到测试用例设计不完整&#xff0c;用例没有完全覆盖需求等问题&#xff0c;这样往往容易造成测试工作效率低下&#xff0c;不能及时发现项目问题&#xff0c;无形中增加了项目风险。 因此提高测试用例质量&#xff0c;就显得尤为重要。一般来说…

SQL基础复习与进阶

SQL进阶 文章目录 SQL进阶关键字复习ALLANYEXISTS 内置函数ROUND&#xff08;四舍五入&#xff09;TRUNCATE&#xff08;截断函数&#xff09;SEILING&#xff08;向上取整&#xff09;FLOOR&#xff08;向下取整&#xff09;ABS&#xff08;获取绝对值&#xff09;RAND&#x…

采用 SpringDoc、javadoc 无注解零入侵基于java注释

今天在gitee上学习到一个&#xff0c;个人觉得非常使用的功能。就是采用 SpringDoc、javadoc 无注解零入侵基于java注释&#xff0c;只需把注释写好 无需再写一大堆的文档注解了。 下面是源码的地址 RuoYi-Vue-Plus: 后台管理系统 重写RuoYi-Vue所有功能 集成 Sa-TokenMybati…

【数模】预测模型

一、灰色系统 白色系统&#xff1a;系统信息完全明确灰色系统&#xff1a;系统部分信息已知&#xff0c;部分信息未知 对在一定范围内变化的、与时间有关的灰色过程进行预测。过程&#xff1a;原始数据找规律→生成强规律性的数据序列→建立微分方程来预测未来趋势 黑色系统&a…

企业上云实施路线图

企业上云步骤主要分为规划、设计、实施、验证、运维五个阶段。https://articles.e-works.net.cn/cloud/article144684.htm

idea 2023 新版ui中git的相关操作

前两个月换了新电脑&#xff0c;下了最新版的idea发现可以切换一套新的ui了 切换新ui肯定不太习惯&#xff0c;很多操作都得重新摸索一下 在这里记录几个git相关的操作 忽略我下面截图中当前项目是js的后端项目…… 切换ui 首先说一下怎么切换新旧版ui&#xff0c;我这里就…

【前端实习生备战秋招】—CSS面试题汇总,建议收藏系列

【前端实习生备战秋招】—CSS面试题汇总&#xff0c;建议收藏系列 文章目录 【前端实习生备战秋招】—CSS面试题汇总&#xff0c;建议收藏系列一、CSS基础1. CSS选择器及其优先级2. CSS中可继承与不可继承属性有哪些3. display的属性值及其作用4. display的block、inline和inli…

2023年电赛A题报告模板--可直接使用

任务 图1 任务内容 要求 图2 基本要求内容 图3 发挥部分内容 说明 图4 说明内容 评分标准 图5 评分内容 正文 &#xff08;部分&#xff09; 摘要 本实验旨在设计和制作一个由两个单相逆变器组成的并联系统&#xff0c;用于为电阻负载供电或并入220V电网。采用基于STM…

MobaXterm - 使用技巧

MobaXterm - 使用技巧 介绍安装SSH会话保存密码快捷键 介绍 MobaXterm是一款增强型Windows终端、X 服务器和 Unix 命令集(GNU/ Cygwin)工具箱。有点是功能全&#xff0c;免费&#xff0c;有便携版&#xff0c;支持多标签&#xff0c;同时自带文件传输系统。下文介绍其安装和使…

产险精算GLM-GAM案例

继续使用北美产险精算学会CAS网站上的一个案例&#xff0c;对案例略作修改后进行验证。 ClassAOITerrExposureClaims1Low1762Medium1108443High11791054Low2130625Medium2126826High21291207Low3143848Medium31261019High34046 GLM 模型结果&#xff0c;见文章&#xff1a;产…

特斯拉墨西哥工厂风波:2.5万美金的车型何时开造?

作者 | Amy 编辑 | 德新 去年10月&#xff0c;马斯克闪现墨西哥新莱昂州&#xff0c;会见了当地官员。考虑到新莱昂州是通用和现代工厂所在地&#xff0c;特斯拉第五大工厂花落墨西哥的消息不胫而走。 今年3月&#xff0c;特斯拉正式宣布&#xff0c;将在墨西哥北部新莱昂州的…