Skip to content

无需th:fragment引用片段

得益于「标记选择器(Markup Selector)」的强大能力,我们甚至可以引入没有定义 th:fragment 属性的内容片段——哪怕这段代码来自完全不了解 Thymeleaf 的其他应用,也能轻松复用。

html
<!-- footer.html 中的原生 HTML 片段(无 th:fragment) -->
<div id="copy-section">
  &copy; 2011 The Good Thymes Virtual Grocery
</div>

无需修改原代码,直接通过 id 选择器(#copy-section)引用这段片段,语法和 CSS 选择器完全一致:

html
<body>
  <!-- 页面主体内容 -->
  ...

  <!-- 引用 footer.html 中 id 为 copy-section 的元素 -->
  <div th:insert="~{footer :: #copy-section}"></div>
</body>

核心说明

  • 选择器类型:除了 id 选择器(#xxx),还支持 CSS 风格的其他选择器:
    • 类选择器:footer :: .copyright(引用 footer.html 中 class 为 copyright 的元素);
    • 标签选择器:footer :: div(引用 footer.html 中所有 div 元素);
    • 复合选择器:footer :: div#copy-section.copyright(id 为 copy-section 且 class 为 copyrightdiv)。
  • 无侵入性:无需给原代码添加任何 Thymeleaf 专属属性(如 th:fragment),即可复用第三方/原生 HTML 代码,极大提升灵活性;
  • 简化写法:依然可以省略片段表达式的 ~{} 包裹符,简写为:
    html
    <div th:insert="footer :: #copy-section"></div>

实用价值

这种方式特别适合以下场景:

  • 复用老旧系统/第三方提供的 HTML 代码(无需改造原代码);
  • 快速复用页面中未提前定义 th:fragment 的局部内容;
  • 拆分大型静态 HTML 页面为可复用的片段,无需重构原代码结构。

总结

  1. 借助标记选择器,可直接引用无 th:fragment 的 HTML 片段,选择器语法兼容 CSS 风格(id、class、标签等);
  2. 核心语法为 ~{模板名 :: 选择器}(如 footer :: #copy-section),无需修改原代码,无侵入性;
  3. 该特性让 Thymeleaf 能复用任意原生 HTML 代码,大幅提升模板复用的灵活性。