百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Thymeleaf入门教程

liuian 2024-12-11 15:45 79 浏览

1. Thymeleaf 简介

Thymeleaf 是新一代 Java 模板引擎,与 Velocity、FreeMarker 等传统 Java 模板引擎不同,Thymeleaf 支持 HTML 原型,其文件后缀为“.html”,因此它可以直接被浏览器打开,此时浏览器会忽略未定义的 Thymeleaf 标签属性,展示 thymeleaf 模板的静态页面效果;当通过 Web 应用程序访问时,Thymeleaf 会动态地替换掉静态内容,使页面动态显示

html<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--th:text 为 Thymeleaf 属性,用于在展示文本-->
<h1 th:text="欢迎您来到Thymeleaf">欢迎您访问静态页面 HTML</h1>
</body>
</html>

当直接使用浏览器打开时,浏览器展示结果如下。

欢迎您访问静态页面HTML

当通过 Web 应用程序访问时,浏览器展示结果如下。

欢迎您来到Thymeleaf

Thymeleaf 的特点:

  • 动静结合:Thymeleaf 既可以直接使用浏览器打开,查看页面的静态效果,也可以通过 Web 应用程序进行访问,查看动态页面效果。
  • 开箱即用:Thymeleaf 提供了 Spring 标准方言以及一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
  • 多方言支持:它提供了 Thymeleaf 标准和 Spring 标准两种方言,可以直接套用模板实现 JSTL、 OGNL 表达式;必要时,开发人员也可以扩展和创建自定义的方言。
  • 与 SpringBoot 完美整合:SpringBoot 为 Thymeleaf 提供了的默认配置,并且还为 Thymeleaf 设置了视图解析器,因此 Thymeleaf 可以与 Spring Boot 完美整合。

2. Thymeleaf 语法规则

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

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

在 html 标签中声明此名称空间,可避免编辑器出现 html 验证错误,但这一步并非必须进行的,即使我们不声明该命名空间,也不影响 Thymeleaf 的使用。

2.1 标准表达式语法

2.1.1 变量表达式

使用${}包裹的表达式被称为变量表达式,该表达式具有以下功能:

  • 获取对象的属性和方法 使用变量表达式可以获取对象的属性和方法,例如,获取 person 对象的 lastName 属性,表达式形式如下:
  • html
  • ${person.lastName}
  • 使用内置的基本对象 使用变量表达式还可以使用内置基本对象,获取内置对象的属性,调用内置对象的方法。 Thymeleaf 中常用的内置基本对象如下: 例如,我们通过以下 2 种形式,都可以获取到 session 对象中的 map 属性:
  • html
  • ${#session.getAttribute('map')} ${session.map}
  • 使用内置的工具对象
  • 例如,我们可以使用内置工具对象 strings 的 equals 方法,来判断字符串与对象的某个属性是否相等,代码如下。
  • html
  • ${#strings.equals('编程帮',name)}

2.1.2 选择变量表达式

选择变量表达式与变量表达式功能基本一致,只是在变量表达式的基础上增加了与 th:object 的配合使用。当使用 th:object 存储一个对象后,我们可以在其后代中使用选择变量表达式(*{...})获取该对象中的属性,其中,“*”即代表该对象。

html<div th:object="${session.user}" >
    <p th:text="*{fisrtName}">firstname</p>
</div>

th:object 用于存储一个临时变量,该变量只在该标签及其后代中有效,在后面的内容“th 属性”中我详细介绍。

2.1.3 链接表达式

不管是静态资源的引用,还是 form 表单的请求,凡是链接都可以用链接表达式 (@{...})。

链接表达式的形式结构如下:

  • 无参请求:@{/xxx}
  • 有参请求:@{/xxx(k1=v1,k2=v2)}

例如使用链接表达式引入 css 样式表,代码如下。

html<link href="asserts/css/signin.css" th:href="@{/asserts/css/signin.css}" rel="stylesheet">

2.1.4 国际化表达式

消息表达式一般用于国际化的场景。结构如下。

htmlth:text="#{msg}"

注意:此处了解即可,我们会在后面的章节中详细介绍。

2.1.5 片段引用表达式

片段引用表达式用于在模板页面中引用其他的模板片段,该表达式支持以下 2 中语法结构:

  • 推荐:~{templatename::fragmentname}
  • 支持:~{templatename::#id}

以上语法结构说明如下:

  • templatename:模版名,Thymeleaf 会根据模版名解析完整路径:/resources/templates/templatename.html,要注意文件的路径。
  • fragmentname:片段名,Thymeleaf 通过 th:fragment 声明定义代码块,即:th:fragment="fragmentname"
  • id:HTML 的 id 选择器,使用时要在前面加上 # 号,不支持 class 选择器。

2.2 th 属性

Thymeleaf 还提供了大量的 th 属性,这些属性可以直接在 HTML 标签中使用,其中常用 th 属性及其示例如下表。

属性

描述

示例

th:id

替换 HTML 的 id 属性

<input id="html-id" th:id="thymeleaf-id" />

th:text

文本替换,转义特殊字符

<h1 th:text="hello,bianchengbang" >hello</h1>

th:untext

文本替换,文本替换,不转义特殊字符

<div th:utext="'<h1>欢迎来到编程帮!</h1>'" >欢迎你</div>

th:object

在父标签选择对象,子标签使用 *{…} 选择表达式选取值。没有选择对象,那子标签使用选择表达式和 ${…} 变量表达式是一样的效果。同时即使选择了对象,子标签仍然可以使用变量表达式。

<div th:object="${session.user}" > <p th:text="*{fisrtName}">firstname</p> </div>

th:value

替换 value 属性

<input th:value = "${user.name}" />

th:with

局部变量赋值运算

<div th:with="isEvens = ${prodStat.count}%2 == 0" th:text="${isEvens}"></div>

th:style

设置样式

<div th:style="'color:#F00; font-weight:bold'">编程帮 www.biancheng.net</div>

th:onclick

点击事件

<td th:onclick = "'getInfo()'"></td>

th:each

遍历,支持 Iterable、Map、数组等。

<table> <tr th:each="m:${session.map}"> <td th:text="${m.getKey()}"></td> <td th:text="${m.getValue()}"></td> </tr></table>

th:if

根据条件判断是否需要展示此标签

<a th:if ="${userId == collect.userId}">

th:unless

和 th:if 判断相反,满足条件时不显示

<div th:unless="${m.getKey()=='name'}" ></div>

th:switch

与 Java 的 switch case语句类似通常与 th:case 配合使用,根据不同的条件展示不同的内容

<div th:switch="${name}"> <span th:case="a">编程帮</span> <span th:case="b">www.biancheng.net</span></div>

th:fragment

模板布局,类似 JSP 的 tag,用来定义一段被引用或包含的模板片段

<footer th:fragment="footer">插入的内容</footer>

th:insert

布局标签;将使用 th:fragment 属性指定的模板片段(包含标签)插入到当前标签中

<div th:insert="commons/bar::footer"></div>

th:replace

布局标签;使用 th:fragment 属性指定的模板片段(包含标签)替换当前整个标签

<div th:replace="commons/bar::footer"></div>

th:selected

select 选择框选中

<select> <option>---</option> <option th:selected="${name=='a'}"> 编程帮 </option> <option th:selected="${name=='b'}"> www.biancheng.net </option></select>

th:src

替换 HTML 中的 src 属性

<img th:src="@{/asserts/img/bootstrap-solid.svg}" src="asserts/img/bootstrap-solid.svg" />

th:inline

内联属性;该属性有 text、none、javascript 三种取值,在 <script> 标签中使用时,js 代码中可以获取到后台传递页面的对象。

<script type="text/javascript" th:inline="javascript"> var name = /*[[${name}]]*/ ianchengbang'; alert(name)</script>

th:action

替换表单提交地址

<form th:action="@{/user/login}" th:method="post"></form>

3. Thymeleaf 公共页面抽取

在 Web 项目中,通常会存在一些公共页面片段(重复代码),例如头部导航栏、侧边菜单栏和公共的 js css 等。我们一般会把这些公共页面片段抽取出来,存放在一个独立的页面中,然后再由其他页面根据需要进行引用,这样可以消除代码重复,使页面更加简洁。

3.1 抽取公共页面

Thymeleaf 作为一种优雅且高度可维护的模板引擎,同样支持公共页面的抽取和引用。我们可以将公共页面片段抽取出来,存放到一个独立的页面中,并使用 Thymeleaf 提供的 th:fragment 属性为这些抽取出来的公共页面片段命名。 示例 1 将公共页面片段抽取出来,存放在 commons.html 中,代码如下。

html<div th:fragment="fragment-name" id="fragment-id">
    <span>公共页面片段</span>
</div>

3.2 引用公共页面

在 Thymeleaf 中,我们可以使用以下 3 个属性,将公共页面片段引入到当前页面中。

  • th:insert:将代码块片段整个插入到使用了 th:insert 属性的 HTML 标签中;
  • th:replace:将代码块片段整个替换使用了 th:replace 属性的 HTML 标签中;
  • th:include:将代码块片段包含的内容插入到使用了 th:include 属性的 HTML 标签中。

使用上 3 个属性引入页面片段,都可以通过以下 2 种方式实现。

  • ~{templatename::selector}:模板名::选择器
  • ~{templatename::fragmentname}:模板名::片段名

通常情况下,{} 可以省略,其行内写法为 [[{...}]] 或 [({...})],其中 [[{...}]] 会转义特殊字符,[(~{...})] 则不会转义特殊字符。

示例 2

  1. 在页面 fragment.html 中引入 commons.html 中声明的页面片段,可以通过以下方式实现。
html<!--th:insert 片段名引入-->
<div th:insert="commons::fragment-name"></div>
<!--th:insert id 选择器引入-->
<div th:insert="commons::#fragment-id"></div>
------------------------------------------------
<!--th:replace 片段名引入-->
<div th:replace="commons::fragment-name"></div>
<!--th:replace id 选择器引入-->
<div th:replace="commons::#fragment-id"></div>
------------------------------------------------
<!--th:include 片段名引入-->
<div th:include="commons::fragment-name"></div>
<!--th:include id 选择器引入-->
<div th:include="commons::#fragment-id"></div>
  1. 启动 Spring Boot,使用浏览器访问 fragment.html,查看源码,结果如下。
html<!--th:insert 片段名引入-->
<div>
    <div id="fragment-id">
        <span>公共页面片段</span>
    </div>
</div>
<!--th:insert id 选择器引入-->
<div>
    <div id="fragment-id">
        <span>公共页面片段</span>
    </div>
</div>
------------------------------------------------
<!--th:replace 片段名引入-->
<div id="fragment-id">
    <span>公共页面片段</span>
</div>
<!--th:replace id 选择器引入-->
<div id="fragment-id">
    <span>公共页面片段</span>
</div>
------------------------------------------------
<!--th:include 片段名引入-->
<div>
    <span>公共页面片段</span>
</div>
<!--th:include id 选择器引入-->
<div>
    <span>公共页面片段</span>
</div>

3.3 传递参数

Thymeleaf 在抽取和引入公共页面片段时,还可以进行参数传递,大致步骤如下: 1.传入参数; 2.使用参数。

3.3.1 传入参数

引用公共页面片段时,我们可以通过以下 2 种方式,将参数传入到被引用的页面片段中: 模板名::选择器名或片段名(参数1=参数值1,参数2=参数值2) 模板名::选择器名或片段名(参数值1,参数值2)

注:若传入参数较少时,一般采用第二种方式,直接将参数值传入页面片段中; 若参数较多时,建议使用第一种方式,明确指定参数名和参数值,。

示例代码如下:

java<!--th:insert 片段名引入-->
<div th:insert="commons::fragment-name(var1='insert-name',var2='insert-name2')"></div>
<!--th:insert id 选择器引入-->
<div th:insert="commons::#fragment-id(var1='insert-id',var2='insert-id2')"></div>
------------------------------------------------
<!--th:replace 片段名引入-->
<div th:replace="commons::fragment-name(var1='replace-name',var2='replace-name2')"></div>
<!--th:replace id 选择器引入-->
<div th:replace="commons::#fragment-id(var1='replace-id',var2='replace-id2')"></div>
------------------------------------------------
<!--th:include 片段名引入-->
<div th:include="commons::fragment-name(var1='include-name',var2='include-name2')"></div>
<!--th:include id 选择器引入-->
<div th:include="commons::#fragment-id(var1='include-id',var2='include-id2')"></div>

3.3.2 使用参数

在声明页面片段时,我们可以在片段中声明并使用这些参数,例如:

java<!--使用 var1 和 var2 声明传入的参数,并在该片段中直接使用这些参数 -->
<div th:fragment="fragment-name(var1,var2)" id="fragment-id">
    <p th:text="'参数1:'+${var1} + '-------------------参数2:' + ${var2}">...</p>
</div>

启动 Spring Boot,使用浏览器访问 fragment.html,结果如下图。

相关推荐

桌面启动命令(电脑桌面启动项命令)

方法一打开C:\Windows\System32目录,找到cmd.exe,单击选中后右键,菜单中选择“以管理员身份运行”。方法二1、点开开始菜单,在搜索框中输入“cmd”,在搜索结果中,对着命令...

miui下载miui官网手机版(小米miui下载官网手机版)

1.打开手机浏览器,输入miui官网地址。2.点击下载页面,选择你手机的型号。3.点击下载,下载完成后双击安装。4.安装完成后,重新启动手机。小米官网下载地址是:http://www.mi.com/s...

win10任务管理器被禁用怎么解除

1.首先,检查是否有管理员权限,只有管理员有权限禁用任务管理器;2.查看任务管理器是否被禁用,可以在注册表中查看,路径为"HKEY_CURRENT_USER\Software\Micros...

flash player有必要安装吗(flash播放器有必要安装吗)

现代的电脑不再需要安装AdobeFlashPlayer,因为许多主流浏览器已经停止对Flash的支持。FlashPlayer是用于播放动画、视频和音频等多媒体内容的插件,但由于安全性问题和技术发...

cmlink欧洲(欧洲联通)

cmlink是一种用于创建和管理内容链接的工具。它可以帮助用户将不同的内容链接在一起,形成一个完整的内容体系,方便用户查看和使用。cmlink可以将多个不同的内容链接整合在一起,形成一个自定义的内容库...

window7截图快捷键(winds7截图快捷键)

win7的截图快捷键如下:1、按Prtsc键截图  这样获取的是整个电脑屏幕的内容,按Prtsc键后,可以直接打开画图工具,接粘贴使用。也可以粘贴在QQ聊天框或者Word文档中,之后再选择保存即可...

万能网卡驱动下载离线版(万能网卡驱动离线版pc win10)
万能网卡驱动下载离线版(万能网卡驱动离线版pc win10)

使用驱动精灵在没有网络的情况下安装驱动,需要安装驱动精灵万能网卡版。安装驱动精灵万能网卡版步骤如下所示:1、点击搜索结果词条,进入驱动精灵官网。2、在驱动精灵官网,选择驱动精灵万能网卡版,点击下载。3、下载完成后,点击安装驱动精灵万能网卡版...

2025-12-20 16:05 liuian

win10 1803版本(window10版本1803)

Windows10version1803版本,也就是“April2018Update”。Win101803正式版版本号为Build17134,资料显示,Build17134即Vers...

资源管理器停止黑屏怎么恢复

作为临时对策,重启“explorer.exe”即可,步骤如下:ctrl+alt+delete,调出任务管理器;选择“进程”,找到“explorer.exe”,结束进程;选择“文件”,之后新建“expl...

win10企业版激活密钥大全(windows10企业版激活密钥在哪)

详细版本号:点击开始——设置——系统——关于。查看密钥:右键点击开始——运行,输入regedit确定。打开注册表编辑器。依次打开:HKEY_LOCAL_MACHINE/SOFTWARE/Micro...

路由器基本设置(路由器基本设置方法)

如何设置路由器?设置路由器并不是很复杂的事情,并且需要设置地方也很少,一般保持默认即可;并且在设置方式上,也不一定使用电脑设置,任何移动终端接入路由器都可以完成设置。一起来看看,究竟该如何设置路由器吧...

迅雷破解版安卓(迅雷破解版安卓版6.0)

去其他电影网站下载屏蔽的那些网站比较正规,现在越来越注重版权了虽然迅雷5.0和皮皮播放器,PPlive中可以修改SP3最大连接数,但是只能对其软件本身有效,而无法对系统和其他软件的最大连接数进行修改...

win7简约主题(windows7主题)

要设置小米手机的全局主题为简约风格,首先进入手机的主题设置界面,选择简约风格的主题并进行下载和安装。接着在桌面设置中调整图标样式、字体和壁纸等元素为简约风格。还可以在系统设置中调整通知栏、锁屏和系统界...

win在键盘上是哪个键(键盘上的win键在哪儿)

在大多数计算机键盘上,Win键是指Windows键,它通常位于键盘的底部,靠近空格键和Ctrl键之间。Win键上通常有Windows徽标,它是微软Windows操作系统的标志。通过按下Win键,可以打...

电脑找不到无线网络连接(电脑找不到无线网络连接图标)
电脑找不到无线网络连接(电脑找不到无线网络连接图标)

1、进入系统按win+i打开Windows设置,点击“个性化”。2、点击“任务栏”-“打开或关闭系统图标”。3、我们可以查看到“网络”开关被关闭了,点击开关将其打开即可。5、返回桌面可以看到任务栏右侧就会显示网络图标了,点击wifi图标即可...

2025-12-20 12:05 liuian