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…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
