Thymeleaf模版引擎
Thymeleaf是面向Web和独立环境的现代服务器端Java模版引擎,能够处理HTML、XML、JavaScript、CSS甚至纯文本。Thymeleaf旨在提供一个优雅的、高度可维护的创建模版的方式。为了实现这一目标,Thymeleaf建立在自然模版的概念上,将其逻辑注入到模版文件中,不会影响模版设计原型,从而改善了设计的沟通,弥合了设计和开发团队之间的差距。
Thymeleaf特点
- Thymeleaf在有网络和无网络的环境下均可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持HTML原型,然后再HTML标签里增加额外的属性来达到模版+数据的展示方式。浏览器解释HTML是会忽略未定义的标签属性,所以Thymeleaf的模版可以静态地运行;当有数据返回到页面是,Thymeleaf会动态地替换掉静态内容,使页面动态显示
- Thymeleaf开箱即用的特性。它支持标准方言和Spring方言,可以直接套用模版实现JSTL、OGNL表达式效果,避免每天套模板、改JSTL、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言
- Thymeleaf提供Spring标准方言和一个与SpringMVC完美集成的可选模块,可以快速地实现表单绑定、属性编辑器、国际化等功能
添加依赖(启动器)
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
application.properties添加配置
springthymeleaf.cache=false
spring.thymeleaf.cache=false 是关闭Thymeleaf的缓存,不然在开发环境中修改页面不会立刻生效需要重启,生产可配置为true
Model准备(参考SpringBoot:Web开发(基于SpringBoot使用MyBatis-Plus+JSP开发)中使用MyBatisX快捷生成)
实体类
package com.ktjiaoyu.thymeleaf.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;/*** * @TableName sys_user*/
@TableName(value ="sys_user")
@Data
public class User implements Serializable {/*** 编号*/@TableId(type = IdType.AUTO)private Long usrId;/*** 姓名*/private String usrName;/*** 密码*/private String usrPassword;/*** 角色编号*/private Long usrRoleId;
// private String roleName;/*** 状态*/private Integer usrFlag;@TableField(exist = false)private static final long serialVersionUID = 1L;@Overridepublic boolean equals(Object that) {if (this == that) {return true;}if (that == null) {return false;}if (getClass() != that.getClass()) {return false;}User other = (User) that;return (this.getUsrId() == null ? other.getUsrId() == null : this.getUsrId().equals(other.getUsrId()))&& (this.getUsrName() == null ? other.getUsrName() == null : this.getUsrName().equals(other.getUsrName()))&& (this.getUsrPassword() == null ? other.getUsrPassword() == null : this.getUsrPassword().equals(other.getUsrPassword()))&& (this.getUsrRoleId() == null ? other.getUsrRoleId() == null : this.getUsrRoleId().equals(other.getUsrRoleId()))&& (this.getUsrFlag() == null ? other.getUsrFlag() == null : this.getUsrFlag().equals(other.getUsrFlag()));}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((getUsrId() == null) ? 0 : getUsrId().hashCode());result = prime * result + ((getUsrName() == null) ? 0 : getUsrName().hashCode());result = prime * result + ((getUsrPassword() == null) ? 0 : getUsrPassword().hashCode());result = prime * result + ((getUsrRoleId() == null) ? 0 : getUsrRoleId().hashCode());result = prime * result + ((getUsrFlag() == null) ? 0 : getUsrFlag().hashCode());return result;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();sb.append(getClass().getSimpleName());sb.append(" [");sb.append("Hash = ").append(hashCode());sb.append(", usrId=").append(usrId);sb.append(", usrName=").append(usrName);sb.append(", usrPassword=").append(usrPassword);sb.append(", usrRoleId=").append(usrRoleId);sb.append(", usrFlag=").append(usrFlag);sb.append(", serialVersionUID=").append(serialVersionUID);sb.append("]");return sb.toString();}
}
数据访问层
package com.ktjiaoyu.thymeleaf.mapper;import com.ktjiaoyu.thymeleaf.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.PathVariable;import java.util.List;/**
* @author Administrator
* @description 针对表【sys_user】的数据库操作Mapper
* @createDate 2024-09-09 09:10:40
* @Entity com.ktjiaoyu.thymeleaf.entity.User
*/
public interface UserMapper extends BaseMapper<User> {}
业务逻辑层
接口
package com.ktjiaoyu.thymeleaf.service;import com.ktjiaoyu.thymeleaf.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;import java.util.List;/**
* @author Administrator
* @description 针对表【sys_user】的数据库操作Service
* @createDate 2024-09-09 09:10:40
*/
public interface UserService extends IService<User> {}
实现类
package com.ktjiaoyu.thymeleaf.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ktjiaoyu.thymeleaf.entity.User;import com.ktjiaoyu.thymeleaf.service.UserService;
import com.ktjiaoyu.thymeleaf.mapper.UserMapper;
import jakarta.annotation.Resource;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;import java.util.List;/**
* @author Administrator
* @description 针对表【sys_user】的数据库操作Service实现
* @createDate 2024-09-09 09:10:40
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>implements UserService{}
控制器开发
package com.ktjiaoyu.thymeleaf.controller;import com.ktjiaoyu.thymeleaf.entity.User;
import com.ktjiaoyu.thymeleaf.service.UserService;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;import java.util.Date;
import java.util.List;/*** @author cuishujian* @date 2024/9/13*/
//@Controller
public class ExampleController {@Resourceprivate UserService userService;@GetMapping("/hello/{id}")public String getUser(@PathVariable("id") Long usrId, Model model){User user = userService.getUser(usrId);model.addAttribute("user",user);return "demo/hello";}}
页面开发
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Hello</title>
</head>
<body>欢迎您,<span th:text="${user.usrName}">usrName</span>!
</body>
</html>
效果图

Thymeleaf的常用标签及其用法:
1. 数据绑定与文本替换
-
th:text:用于替换标签体内的文本内容。
<span th:text="${user.name}">用户名</span> -
th:utext:与
th:text类似,但会处理HTML标签。<p th:utext="${htmlContent}">这里会展示HTML内容</p>
2. 条件判断
-
th:if:用于条件判断,如果条件为真,则显示标签体内容。
<span th:if="${user.admin}">管理员</span> -
th:unless:与
th:if相反,条件为假时显示标签体内容。<a th:href="@{/login}" th:unless="${session.user != null}">Login</a>
3. 循环遍历
- th:each:用于遍历集合、数组或Map等。
<ul>
<li th:each="user : ${userList}" th:text="${user.name}"></li>
</ul>
4. URL与链接
-
th:href:用于构建URL。
<a th:href="@{/user/{id}(id=${user.id})}">查看用户</a> -
th:action:用于表单的提交地址。
<form th:action="@{/submit}"> ... </form>
5. 样式与属性
-
th:style:用于设置标签的style属性。
<div th:style="'background-color: ' + ${bgColor} + ';'">...</div> -
th:attr:用于设置标签的任意属性。
<img th:attr="src=@{/images/logo.png},alt=${altText}" />
6. 布局与片段
-
th:fragment:定义一个可以复用的片段(Fragment)。
<div th:fragment="header">页眉内容</div> -
th:include 和 th:replace:用于引入其他模板文件中的片段。
<!-- 引入片段,但保留自己的标签 --> <div th:include="header :: header"></div> <!-- 替换整个标签为引入的片段 --> <div th:replace="footer :: footer"></div>
7. 表达式与内置对象
Thymeleaf支持多种表达式,包括选择变量表达式${...}、选择表达式*{...}、消息表达式#{...}等。此外,它还提供了许多内置对象,如#strings、#numbers、#dates等,用于执行字符串、数字、日期等的操作。
8. 其他常用标签
- th:id:用于替换HTML元素的id属性。
- th:value:用于设置表单元素的value属性。
- th:selected:用于设置下拉框(
<select>)中选中的项。 - th:checked:用于设置复选框(
<input type="checkbox">)或单选按钮(<input type="radio">)的选中状态。 - th:switch 和 th:case:用于多路选择,类似于Java中的
switch语句。
Thymeleaf的标签库非常丰富,上述只是其中的一部分常用标签。在实际开发中,可以根据项目需求选择合适的标签来简化页面开发。
表达式
1. 变量表达式
- 语法:
${...} - 用途:用于在模板中输出变量的值。
- 示例:
<h1 th:text="${pageTitle}">Page Title</h1>
2. 选择变量表达式
- 语法:
*{...} - 用途:用于从选定对象中选择属性或调用方法,类似于JSP中的EL表达式。
- 示例:
<p th:text="*{user.name}">Default Name</p>
3. 消息表达式
- 语法:
#{...} - 用途:用于获取国际化内容,根据当前环境选择合适的文本。
- 示例:
<span th:text="#{welcome.message}">Welcome!</span>
4. 链接URL表达式
- 语法:
@{...} - 用途:用于生成链接或动态URL,支持相对路径和绝对路径。
- 示例:
- 绝对URL:
<a th:href="@{http://www.thymeleaf.org}">Thymeleaf</a> - 相对URL:
<a th:href="@{/product/{id}(id=1)}">Product Details</a>
- 绝对URL:
5. 字面量
- 文本:
'one text', 'another one!' - 数值:
0, 34, 3.0, 12.3 - 布尔类型:
true, false - 空值:
null
6. 文本操作
- 字符串连接:使用
+操作符。 - 示例:
<span th:text="'Welcome to our application, ' + ${user.name} + '!'">
7. 算术运算
- 支持的运算符:
+, -, *, /, % - 示例:
<p th:text="${number1} + ${number2}"></p>
8. 布尔操作
- 支持的运算符:
and, or - 非操作符:
!, not
9. 关系操作符
- 比较运算符:
>, <, >=, <=(HTML中转义为gt, lt, ge, le) - 相等运算符:
==, !=(或eq, ne)
10. 条件表达式
- If-then:
(if) ?(then) - If-then-else:
(if) ?(then) : (else) - 示例:
<tr th:class="${row.even}?'even':'odd'"></tr>
相关文章:
Thymeleaf模版引擎
Thymeleaf是面向Web和独立环境的现代服务器端Java模版引擎,能够处理HTML、XML、JavaScript、CSS甚至纯文本。Thymeleaf旨在提供一个优雅的、高度可维护的创建模版的方式。为了实现这一目标,Thymeleaf建立在自然模版的概念上,将其逻辑注入到模…...
jpa适配mysql切换达梦可能的坑
1、liquibase脚本 (1)达梦数据库不支持,修改字段varchar改成blob <changeSet author"ly" id"v3.0_4_202307111505_101"><renameColumn tableName"PC_SS_ZRQD" oldColumnName"BHNR" newCo…...
922. 按奇偶排序数组 II 双指针 力扣
922. 按奇偶排序数组 II 已解答 简单 相关标签 相关企业 给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。 对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时…...
Vue接入高德地图并实现基本的路线规划功能
目录 一、申请密钥 二、安装依赖 三、代码实现 四、运行截图 五、官方文档 一、申请密钥 登录高德开放平台,点击我的应用,先添加新应用,然后再添加Key。 如图所示填写对应的信息,系统就会自动生成。 二、安装依赖 npm i am…...
linux网络编程4
24.9.20学习目录 一.UDP(续)1.广播广播流程 2.多播多播流程 一.UDP(续) 1.广播 由一台主机向该主机所在子网内的所有主机发送数据的方式; 广播只能用UDP或原始IP实现,不能使用TCP; 其作用是将…...
Spring模块详解Ⅳ(Spring ORM和Spring Transaction)
目录 Spring ORM(Object-Relational Mapping)作用核心组件使用步骤事务管理代码演示优点挑战总结 Spring Transaction(Spring事务管理)事务的基本概念Spring事务管理的类型声明式事务管理事务的传播行为(Propagation&a…...
深度图可视化显示(kitti)
文章目录 前言一、读取深度值与图像1、深度值读取2、图像读取 二、深度图可视化1、深度图可视化代码2、深度图可视化结果展示 三、深度图在图像上可视化1、可视化代码2、可视化坐标显示 四、完整代码 前言 kitti数据是一个通用数据,有关kitti的深度图像内容我已有博…...
【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容?
【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容? 目录 1 概念 1.1 什么是HPA1.2 Deployment 与 HPA 的关系 1.2.1 工作原理 1.3 StatefulSet 与 HPA 的关系 1.3.1 工作原理 2 实验案例:HPA 控制 StatefulSet 进行扩缩容 2.1 部署一个有状态…...
adb devices不显示连接设备怎么解决
adb devices不显示设备,首先用老办法检查。假如是显示adb这个命令不认识,那就是系统路径问题。假如能认识adb这个命令,那就检查一下手机有没有开usb调试。 但是我遇到了更奇怪的问题:我把网上的攻略都试了一遍,设备驱…...
经典sql题(一)求连续登录不少于三天用户
示例数据 假设我们的 test 表有以下数据: iddate12023-10-01 08:00:0012023-10-01 09:00:0012023-10-02 10:00:0012023-10-03 11:00:0022023-10-01 10:00:0022023-10-02 12:00:0022023-10-03 14:00:0022023-10-04 15:00:0032023-10-01 16:00:00 第一步࿱…...
2024java面试-软实力篇
为什么说简历很重要? 一份好的简历可以在整个申请面试以及面试过程中起到非常好的作用。 在不夸大自己能力的情 况 下,写出一份好的简历也是一项很棒的能力。为什么说简历很重要呢? 、 先从面试来说 假如你是网申,你的简历必然…...
「OC」present和push操作区别以及混合推出的实现
「OC」present和push操作区别以及混合推出的实现 文章目录 「OC」present和push操作区别以及混合推出的实现前言present用途while循环越级返回通知越级返回添加present动画 push模态视图和push视图混合跳转操作一:控制器Apresent控制器B,控制器B再将控制…...
【高分系列卫星简介】
高分系列卫星是中国国家高分辨率对地观测系统(简称“高分工程”)的重要组成部分,旨在提供全球范围内的高分辨率遥感数据,广泛应用于环境监测、灾害应急、城市规划、农业估产等多个领域。以下是对高分系列卫星及其数据、相关参数和…...
八股文-多线程、并发
八股文-多线程、并发 最近学到了一种方法,可以用于简历项目经验编写以及面试题目的回答 STAR法则:在什么背景下,你需要解决什么问题,你做了啥,得到了什么结果 情境(Situation): 描…...
xtu oj 折纸
折纸# 题目描述# 一个长为a,宽为b矩形的纸,我们沿b边(左边)的中点与右上顶点的边折叠,求左上顶点在折叠以后离下边的距离? 输入# 第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个样例,为两个整数1≤a,b≤1000。…...
传知代码-多示例AI模型实现病理图像分类
代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本文将基于多示例深度学习EPLA模型实现对乳腺癌数据集BreaKHis_v1的分类。EPLA模型是处理组织病理学图像的经典之作。EPLA模型是基于多示例学习来进行了,那么多示例学习模型对处理病理学图像具有…...
Java知识点小结3:内存回收
文章目录 对象引用强引用软引用(SoftReference)弱引用(WeakReference)考一考 虚引用(PhantomReference)总结 垃圾回收新生代老年代永生代 内存管理小技巧尽量使用直接量使用StringBuilder和StringBuffer进行…...
LeetCode746:使用花费最小爬楼梯
题目链接:746. 使用最小花费爬楼梯 - 力扣(LeetCode) 代码如下 class Solution { public:int minCostClimbingStairs(vector<int>& cost) {int m cost.size();if(m 1) return min(cost[1], cost[0]);if(m 0) return cost[0]…...
列表、数组排序总结:Collections.sort()、list.sort()、list.stream().sorted()、Arrays.sort()
列表类型 一.Collections.sort() Collections.sort()用于List类型的排序,其提供了两个重载方法: 1.sort(List<T> list) (1)List指定泛型时只能指定引用数据类型,也就是说无法用于基本数据类型的排序。 &am…...
【资料分析】刷题日记3
第一套 √ 考点:基期比重差很温柔的题 普通专科女生 占比 52.5% - 1.7% 50.8% 成人本专科女生 占比 57.8% - 4.6% 53.2% 相比降低了2.4% 知比重和部分量,求整体在花生老师的解法中体会啥叫适当约分 0.1899 / 47.8% / 87.5% 》0.19 / (4…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
