Thymeleaf 模板布局 th:fragment、th:replace、th:insert、th:remove

SpringBoot系列教材 (三十)- Thymeleaf - thymeleaf 如何通过 fragment 包含另一个文件举例 把你自己做的项目文件夹,和我的可运行项目文件夹进行比较。在页面底部可以看到如图所示的版权信息,这个版权信息就是包含另一个页面的内容而来的。的可运行项目,配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。th:replace :不要自己的主标签,保留th:fragment的主标签。th:insert :保留自己的主标签,保留th:fragment的主标签。,可以较为明显地提升学习速度,跨过学习路上的各个槛。 阅读详情

Thymeleaf 模板布局 th:fragment、th:replace、th:insert、th:remove

th:fragment 模板布局

模板片段说明

模板中,经常希望从其他模板中包含⼀些部分,如⻚眉,⻚脚,公共菜单等部分,为了做到这⼀点,Thymeleaf 可以使⽤th:fragment 属性来定义被包含的模版⽚段,以供其他模版包含。

如下所示定义模板片段:

<div th:fragment="copy">
      &copy; 2011 The Good Thymes Virtual Grocery
</div>

上⾯的代码定义了⼀个名为 copy 的⽚段,然后可以使⽤ th:insert 或 th:replace属性轻易地包含进需要的页面中。

<div th:insert="~{commons :: copy}"></div>
<div th:replace="~{commons :: copy}"></div>
  • commons:表示模板名称,就是 html 文件的名称,如果是 springboot 开发,则根据 Spring Boot 配置的 Thymeleaf 映射查找。
  • copy:表示模板片段名称,即 th:fragment=“copy” 的名称

th:insert、th:replace 中的 〜{…} 表示⽚段表达式,它是可选的,上⾯的代码等价于如下所示写法,这也是实际开发中常用的写法:

<div th:insert="commons :: copy"></div>
<div th:replace="commons :: copy"></div>

⽚段表达式语法

1、被引用的 th:fragment 模板片段与引用的 th:insert 或 th:replace 可以是在同一个 Html 文件中,也可以不在同一个 html 中。

⽚段表达式语法⾮常简单,有如下三种不同的格式:

  • 1)〜{templatename :: selector} -:- templatename 表示模板名称(html 文件名称),springboot 项目中就是 “templates”目录下的 html 文件名称,它根据 springboot 对 thymeleaf 的规则进行映射。selector 即可以是 th:fragment 定义的片段名称,也可以选择器,如标签的 id 值、CSS 选择器、或者 XPath 等。
  • 2)〜{templatename} -:- 包含名为 templatename 的整个模板。
  • 3)〜{:: selector} 或 〜{this :: selector}:包含在同⼀模板中的指定选择器的⽚段

模板名 templatename 和选择器 selector 都可以是表达式(甚⾄是条件表达式!)如:

<div th:replace="commons :: (${isAdmin}? f1 : f2)"></div>

<div th:fragment="f1">
    <p>f111111111111</p>
</div>

<div th:fragment="f2">
    <p>f22222222222</p>
</div>
================== fragment语法 ============================= 
<!--  语法说明  "::"前面是模板文件名,后面是选择器 -->
<div th:include="template/footer::copy"></div>
<!-- 只写选择器,这里指fragment名称,则加载本页面对应的fragment -->
<div th:include="::#thispage"></div>
<!-- id选择器 -->
<div th:insert="~{footer :: #copy-section}"></div>
<!-- 只写模板文件名,则加载整个页面 -->
<div th:include="template/footer"></div>
================= 加载块 ============================
<span id="thispage">
    div in this page.
</span>

th:insert 与 th:replace 区别

  • th:insert:将被引用的模板片段插⼊到自己的标签体中
  • th:replace:将被引用的模板片段替换掉自己
<!--1、比如抽取的公用代码片段如下-->
<footer th:fragment="copy">
    &copy; 2011 The Good Thymes Virtual Grocery
</footer>
 
<!--2、采用如下三种方式进行引用-->
<div th:insert="footer :: copy"></div>
<div th:replace="footer :: copy"></div>
<div th:include="footer :: copy"></div>
 
<!--3、则三种引用方式的效果分别对应如下-->
<div>
    <footer>
        &copy; 2011 The Good Thymes Virtual Grocery
    </footer>
</div>
 
<footer>
    &copy; 2011 The Good Thymes Virtual Grocery
</footer>
 
<div>
    &copy; 2011 The Good Thymes Virtual Grocery
</div>

th:insert 、th:replace、th:include 在标签中进行引用时可以不用片段表达式 〜{…} ,但是行内写法时,必须要用片段表达式,如:[[{}]]、[({})]

参数化片段签名

为了使模板⽚段具有类似函数的功能,th:fragment 定义的⽚段可以指定⼀组参数:

<div th:fragment="frag (onevar,twovar)">
     <p th:text="${onevar} + ' - ' + ${twovar}">...</p>
</div>

于是在 th:insert、th:replace 引用模板片段的时候,就可以传递参数过去:

//按参数定义时的顺序进行传递
<div th:replace="templatename :: frag (${value1},${value2})">...</div> 
//按参数名称传递,此时与参数定义的顺序无关
<div th:replace="templatename :: frag (onevar=${value1},twovar=${value2})">...</div>     

比如公共菜单中高亮显示当前菜单时就可以使用这种传递参数的方式进行标识当前活动的菜单。

结合layui布局后台管理系统

1、静态文件目录
在这里插入图片描述
2、编写公共模板(commons.html)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

<head lang="en">
    <meta charset="UTF-8">
    <title>公共模板</title>
</head>

<!--定义公共的头部,commonHeader 为模板片段名称-->
<header th:fragment="commonHeader">
    <link type="text/css" rel="stylesheet" th:href="@{/layui/css/layui.css}">
    <script th:src="@{/layui/layui.all.js}"></script>
    <div class="layui-header">
        <div class="layui-logo"><a href="">后台管理系统</a></div>
    </div>
</header>

<!-- 定义公共的左侧菜单,commonMenu 表示片段名称,index 为传递进来的参数-->
<menu th:fragment="commonMenu(index)">
    <div class="layui-side layui-bg-black">
        <div class="layui-side-scroll">
            <ul class="layui-nav layui-nav-tree">
                <li class="layui-nav-item layui-nav-itemed">
                    <dl class="layui-nav-child">
                        <!-- 根据传递的参数 index 来设置当前活动的菜单样式;三元运算符,第三个参数缺省,当 ? 判断为 false 时返回 null-->
                        <dd th:class="${index}==0?'layui-this'"><a th:href="@{/content1}">菜单1</a></dd>
                        <dd th:class="${index}==1?'layui-this'"><a th:href="@{/content2}">菜单2</a></dd>
                        <!-- 同理如果还有其它更多的菜单时,可以依次往下传递参数-->
                    </dl>
                </li>
            </ul>
        </div>
    </div>
</menu>

<!--定义公共的底部,这里使用 id 选择器,当然也可以用片段名,如 th:fragment="commonFooter"-->
<footer id="commonFooter">
    <div class="layui-footer">
        <p>Copyright © 1998 - 2018 YYServer. All Rights Reserved</p>
    </div>
</footer>

</html>

3、编写内容主体
content1.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>后台管理</title>
</head>
<body class="layui-layout-body">
    <div class="layui-layout layui-layout-admin">
        <header th:replace="commons :: commonHeader"></header>

        <menu th:replace="commons :: commonMenu(0)"></menu>

        <div class="layui-body">
            <!-- 内容主体区域 -->
            <div style="padding: 15px;">
                <p>内容主体区域1</p>
            </div>
        </div>

        <footer th:replace="commons :: #commonFooter"></footer>
    </div>

</body>
</html>

content2.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>后台管理</title>
</head>
<body class="layui-layout-body">
    <div class="layui-layout layui-layout-admin">
        <header th:replace="commons :: commonHeader"></header>

        <menu th:replace="commons :: commonMenu(1)"></menu>

        <div class="layui-body">
            <!-- 内容主体区域 -->
            <div style="padding: 15px;">
                <p>内容主体区域2</p>
            </div>
        </div>

        <footer th:replace="commons :: #commonFooter"></footer>
    </div>
</body>
</html>

4、编写控制器

@Controller
public class HelloController {

    @RequestMapping("/content1")
    public String content1(Map<String, Object> paramMap) {
        System.out.println("content1");
        return "content1";
    }

    @RequestMapping("/content2")
    public String content2(Map<String, Object> paramMap) {
        System.out.println("content2");
        return "content2";
    }
}

5、测试效果图
在这里插入图片描述
在这里插入图片描述

单细胞轨迹分析实战:基于Monocle和CytoTRACE的细胞分化潜能与状态解析 本文提供了基于Monocle和CytoTRACE的单细胞轨迹分析实战指南。通过乳腺癌数据集,详细演示了从数据准备、伪时序分析、细胞分化潜能评估到分支点功能挖掘的全流程。结合两种工具的优势,能有效解析细胞状态动态演变,为发育和疾病研究提供关键见解。 阅读详情

相关推荐

JW01二氧化碳传感器实战:5分钟搞定Arduino环境监测系统(附完整代码)

本文详细介绍了如何使用JW01二氧化碳传感器与Arduino快速搭建环境监测系统。通过简单的硬件连接和完整的代码示例,读者可以在5分钟内实现CO2浓度实时监测,并了解数据解析、常见问题解决及进阶应用扩展。JW01传感器的高精度和易用性使其成为创客和嵌入式开发者的理想选择。

kite3的博客 383

5)Thymeleaf 模板布局 th:fragment、th:replace、th:insert、th:remove

目录 th:fragment 模板布局 模板片段说明 ⽚段表达式语法 th:insert 与 th:replace 区别 参数化片段签名 编码示例 commons.html 公共模板 user/home.html 引入模板片段 运行效果 th:remove 删除模版片段 th:fragment 模板布局 模板片段说明 模板中,经常希望从其他模板中包含⼀些部...

蚩尤后裔-汪茂雄 4万+

华为OD机试真题 - 矩阵匹配 牛客网

2024华为OD机试真题,代码包含语言java、js、python、c 代码基本都有详细注释。 题目描述 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式: N M K N*M矩阵 输出描述 N*M 的矩阵中可以选出 M! / N! 种组合数组,每个组合数组种第 K 大的数中的最小值。无需考虑重复数字,直接取字典排序结果即可。

2301_76543445的博客 498

thymeleaf

Springboot默认是不支持JSP的,默认使用thymeleaf模板引擎 模板(template fragments) 日常开发中,我们经常会将导航栏,页尾,菜单等部分提取成模板供其它页面使用。 在Thymeleaf 中,我们可以使用th:fragment属性来定义一个模板。 <!DOCTYPE html> <html xmlns:th="http:...

全栈者也的博客 4116

已过tiktok校招客户端,面经分享

面试的话, 一天面完3面, 效率很高, 三天之后就发了offer 字节邮件里面也说了不能泄露面试题, 那我就把我秋招参与美团,字节,腾讯,阿里面试被问到的全部问题总结着写出来了, 这其实是我每一轮面试完之后我都会总结哪里答对了, 哪里没有答对, 总结了一大堆问题出来. 答案未必正确, 我只是给自己写了个简单的一句话概括, 可能不够完善, 建议看官自行回答一下这些问题 二本非科班, 暑假在字节实习过, 不过不是tiktok部门, 因此秋招就没啥时间准备面试了, 只投了几个大厂, 顺便也在字节跨部门转正,

a1472750149的博客 1308

100多台物理GPU服务器,每台服务器上有8张GPU卡,组网

计算网用 IB/RoCEv2 保证低延迟高带宽,支撑 800+GPU 的分布式训练;管理网和存储网独立部署,避免干扰核心通信;全链路冗余和规范布线,确保集群稳定运行;搭配 Slurm/K8s 和监控工具,实现高效管理。该方案可支撑千亿参数大模型训练,且具备极强的扩展性,未来可平滑扩容至 200 + 台服务器。

weixin_42795092的博客 2022

Thymeleaf中th:include、th:replace、th:insert、th:fragment用法及区别

Thymeleaf中页面布局 首先,几个标签的定义 th:fragment 布局标签,定义一个代码片段,方便其它地方引用 <div th:fragment="alert"> th:include 布局标签,替换内容到引入的文件 <head th:include="layout :: htmlhead" th:with="title='xx'"&gt...

spurs611的博客 1万+

机器人视觉伺服控制入门:从IBVS到PBVS的实战指南(附Python代码示例)

本文深入解析机器人视觉伺服控制,对比了基于图像的视觉伺服和基于位置的视觉伺服两大核心方法。通过实战案例与Python代码示例,详细阐述了从误差计算、交互矩阵到速度控制的全流程,帮助读者掌握如何利用视觉反馈实现机器人的实时闭环控制,提升其在动态环境中的作业能力。

weixin_29061997的博客 260

Thymeleaf 模板

Thymeleaf 模板布局 th:fragment、th:replace、th:insert、th:remove th:fragment 模板布局 模板片段说明 模板中,经常希望从其他模板中包含⼀些部分,如⻚眉,⻚脚,公共菜单等部分,为了做到这⼀点,Thymeleaf 可以使⽤th:fragment 属性来定义被包含的模版⽚段,以供其他模版包含。 如下所示定义模板片...

weixin_30367543的博客 270

【2025软考高级架构师】基础知识部分——6、软件架构设计

(1)架构是对系统的抽象(2)架构由多个结构组成(3)任何软件都存在架构(4)元素及其行为的集合构成架构的内容(5)架构具有“基础”性(6)架构隐含有“决策”

qq837993702的博客 1万+

Open3D (C++) 使用点云创建数字高程模型DEM

Open3D (C++) 使用点云创建数字高程模型DEM

点云侠的博客 1392

Thymeleaf使用记录

模板布局 th:include 加载指定文件内容(Thymeleaf 3.0 之后不再推荐使⽤ th:include.),例如 <div th:include="/common/select::server"></div> 加载common目录下select(.html, 因为项目里配了匹配后缀,这里不需要加)的 server 部分,server部分是啥嘞? <div th:fragment="server1">是这个</div> th:fragm

纸上得来终觉浅,绝知此事要躬行 152

MaxScript批量修改材质、贴图名称

MaxScript批量修改材质、贴图名称1 实现效果1.1 修改前材质、贴图名称1.2 修改后2 代码 1 实现效果 1.1 修改前材质、贴图名称 1.2 修改后 2 代码 prefixName = "prefiname" maxFile = "maxfilepath" makeDir "newBitmappath" mapsPath = newbitmappath + "\\" fn formatStr index = ( str = index as string newS

郑德帅 3241

Thymeleaf 学习笔记 (4)~~~~

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34355715的博客 105

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

thymeleaf标签

th:fragment="body" th:remove="tag" th:action="@{/aBcd/eee}" th:object="\${xxForm}" th:text="\${message}" th:block th:if="${#fields.hasErrors('*')}" th:each="err : ${#fields.errors('*')}" th:if="${not #strings.isEmpty(err)}" th:text="${err}" th:checked="${

LuckyGuyy的博客 662

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

十五、SpringBoot2核心技术——web开发(模块引擎Thymeleaf)_下

一、thymeleaf语法说明 1.2、作用域对象的获取 作用域对象包括:request、session、application。 获得方式就是在变量表达式里面使用${#request}、${#esssion}、${#servletContext} <!--获取请求URL:--> <span th:text="${#request.getRequestURL()}"></span><br /> <!--获取会话超时时间:--> <span t

付之一笑的专栏 1350

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

3)Thymeleaf th:* 设置/修改属性值详解

目录 属性汇总 th:text 与th:utext th:attr 设置任意属性值 设置指定属性值 th:alt-title 和 th:lang-xmllang 固定值布尔属性 默认属性处理器 属性汇总 <html xmlns:th="http://www.thymeleaf.org"> 编号 属性 描述 示例 1 th:text ...

蚩尤后裔-汪茂雄 2万+

别再写JSP了!Spring Boot项目用Thymeleaf做页面开发,这5个实用技巧让你效率翻倍

本文介绍了在Spring Boot项目中使用Thymeleaf替代JSP进行页面开发的五大实用技巧。通过动静结合开发模式、模块化设计、与Spring Security深度集成、高级表达式应用以及现代化前端工作流整合,Thymeleaf显著提升了开发效率和代码可维护性,是Java Web开发的更优选择。

weixin_30599769的博客 413

Thymeleaf 学习笔记 (2)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33881050的博客 82

thymeleaf中的fragment使用

fragment介绍fragment类似于JSP的tag,在html中文件中,可以将多个地方出现的元素块用fragment包起来使用。fragment使用定义fragment所有的fragment可以写在一个文件里面,也可以单独存在,例如<footer th:fragment="copy"> the content of footer </footer> fragment的引用 th:i

jonathan的专栏 2万+

SpringBoot 利用 th:fragment 实现代码复用

定义和引用模板片段 在多数项目中,我们经常会写很多重复代码,如导航栏、侧边栏等,为实现代码复用,Thymeleaf 需要我们定义这些部分“⽚段”(相当于抽取出来)以供其他模版包含,可以使⽤th:fragment属性来定义被包含的模版⽚段。 示例如下: 将待重用的代码单独放入html文件中;(不放也可以,目的是方便日后区分); 这里单独放入commons文件夹下: 将待重用代码中加入 th:fragment:“name”,导入thymleaf引擎; thymleaf引擎: <!DOCTYPE ht

weixin_44627672的博客 2008

Thymeleaf th:fragment局部刷新

⏹Thymeleaf th:fragment局部刷新

菜鸟记录 1812

thymleaf之fragment使用

fragment片段的意思,是thymleaf为了消除前端代码的重复性而设计出来的。 用法: 1.th:insert:保留自己的主标签,保留th:fragment的主标签。 将远处需要引入用的片段插入到当前的标签 内 ,如: <div><th:insert>将远处整个片段插入到此div中,本div标签保留</div> 2.th:replace:不要自己的主标签,保留th:fragment的主标签。 将远处需要引入用的片段替换 当前的标签 ,如: <div>

weixin_38568503的博客 2546

thymeleaf的简单用法-布局标签

最近简单学习使用了thymeleaf模板引擎,现在把一些理解写出来,可能理解的很浅或者有偏差,希望读者理解,并评论对我指正,让我能够有所进步,并改正偏差。一.eclipse或myeclipse 设置HTML模板Window-&gt;Preferences-&gt;输入templates-&gt;选择HTML下的HTML Source 下的Templates-&gt;New-&gt;Name中填写t...

malimingwq的博客 2278

[Thymeleaf] th:fragment局部刷新具体代码实现

th:fragment局部刷新具体代码实现

HelloWorld, GraspWorld! 1137

thymeleaf th:fragment引用问题

th:fragment=”自定义片段名” /**这里我定义的是head th:replace=”thymeleaf的根目录+片段的html名+ :: +自定义的片段名” th:replace 会替换掉当前标签及其子标签的所有信息; th:include 只会替换当前标签的子标签的信息;...

正在看的博客 8843
上一篇: Thymeleaf th:each 循环迭代与 th:if、th:switch 条件判断
下一篇: Thymelead th:with 局部变量 与 属性优先级
yyangqqian
博客等级 码龄15年 406粉丝 406原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值