Skip to content

空片段表达式(~{})的使用

Thymeleaf 提供了一个特殊的片段表达式——空片段 ~{},用于明确指定「不传递任何标记内容」。结合之前的通用头部片段示例,我们可以更灵活地控制片段参数的渲染。

html
<!-- 调用 common_header 片段,links 参数传入空片段 -->
<head th:replace="~{ base :: common_header(~{::title},~{}) }">
  <!-- 仅传递自定义标题,无自定义链接 -->
  <title>Awesome - Main</title>
</head>

由于 links 参数被设为空片段,通用片段中 <th:block th:replace="${links}" /> 这一行不会渲染任何内容,最终结果仅保留通用头部的公共内容和自定义标题:

html
<head>
  <!-- 来自调用模板的自定义标题 -->
  <title>Awesome - Main</title>

  <!-- 通用样式/脚本(片段自带) -->
  <link rel="stylesheet" type="text/css" media="all" href="/awe/css/awesomeapp.css">
  <link rel="shortcut icon" href="/awe/images/favicon.ico">
  <script type="text/javascript" src="/awe/sh/scripts/codebase.js"></script>

  <!-- links 参数为空,无额外自定义链接 -->
</head>

3. 关键说明

  • 空片段 vs 不传参
    • 空片段 ~{} 是「主动指定无内容」,片段中对应 th:replace="${参数}" 的位置会直接忽略,不生成任何标签;
    • 若不传该参数,片段会尝试使用上下文变量(若不存在则可能报错),或渲染默认占位符(如果定义了);
  • 简化写法:空片段也可省略 ~{},直接写 ''null,效果一致:
    html
    <!-- 等价写法:用空字符串替代空片段 -->
    <head th:replace="base :: common_header(::title,'')">
      <title>Awesome - Main</title>
    </head>
  • 适用场景
    • 页面无需自定义某类内容(如无自定义样式链接、无自定义脚本);
    • 统一参数传递格式,避免因“不传参数”导致的模板异常;
    • 动态控制片段渲染:结合条件表达式,按需传递内容或空片段:
      html
      <!-- 仅当用户是管理员时传递自定义链接,否则传空片段 -->
      <head th:replace="base :: common_header(
        ::title,
        ${user.isAdmin} ? ::link : ~{}
      )">
        <title>Admin - Dashboard</title>
        <link rel="stylesheet" th:href="@{/css/admin.css}">
      </head>

4. 对比示例:传参 vs 空片段

调用方式渲染结果特点
common_header(::title,::link)包含自定义标题 + 自定义链接
common_header(::title,~{})仅包含自定义标题,无自定义链接
common_header(~{},::link)仅包含自定义链接,标题用片段默认

总结

  1. 空片段表达式 ~{} 用于明确指定“无标记内容”,传递给片段参数后,对应位置不会渲染任何内容;
  2. 相比“不传参数”,空片段更可控,能避免模板因参数缺失报错,且语义更清晰;
  3. 常结合条件表达式使用,实现“按需传递自定义标记”,进一步提升布局的灵活性。