Skip to content

无操作令牌(_)的使用

Thymeleaf 提供了一个特殊的「无操作令牌(no-operation token)_」,当把它作为片段参数传递时,会让片段中对应位置的表达式完全不执行,直接保留片段的默认标记内容。结合 common_header 通用头部片段的示例,我们可以精准控制是否使用片段的默认值。

html
<!-- 调用 common_header 片段,title 参数传无操作令牌 _,links 参数传自定义链接 -->
<head th:replace="~{base :: common_header(_,~{::link})}">
  <title>Awesome - Main</title>
  <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}">
  <link rel="stylesheet" th:href="@{/themes/smoothness/jquery-ui.css}">
</head>

由于 title 参数被设为 _,common_header片段中 <title th:replace="${title}">The awesome application</title> 这一行的 th:replace 逻辑完全不执行,直接保留 <title> 标签的默认文本;而 links 参数正常接收自定义链接。

html
<!-- 调用 common_header 片段,title 参数传无操作令牌 _,links 参数传自定义链接 -->
<title th:replace="${title}">The awesome application</title>

最终渲染结果如下:

html
<head>
  <!-- 保留片段的默认标题,不替换为调用模板的 title -->
  <title>The awesome application</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>

  <!-- 正常渲染自定义链接 -->
  <link rel="stylesheet" href="/awe/css/bootstrap.min.css">
  <link rel="stylesheet" href="/awe/themes/smoothness/jquery-ui.css">
</head>

3. 关键说明

  • 无操作令牌 vs 空片段
    令牌/表达式作用效果适用场景
    _(无操作)片段中对应 th:replace 逻辑不执行,保留默认内容希望使用片段默认值,不替换
    ~{}(空片段)片段中对应位置渲染空内容,删除默认占位希望完全清空对应位置的内容
  • 简化写法:无操作令牌 _ 可直接使用,无需包裹在片段表达式中,语法简洁;
  • 适用场景
    • 仅需自定义部分参数,其余参数保留片段默认值;
    • 动态控制是否替换片段内容:结合条件表达式,按需使用默认值或自定义内容:
      html
      <!-- 仅当页面有自定义标题时替换,否则用片段默认标题 -->
      <head th:replace="base :: common_header(
        ${#strings.isEmpty(pageTitle) ? _ : ::title},
        ::link
      )">
        <title th:text="${pageTitle}">默认标题</title>
        <link rel="stylesheet" th:href="@{/css/custom.css}">
      </head>

4. 核心价值

无操作令牌 _ 让片段参数的控制更精细:既可以传递自定义标记、传递空内容,也可以主动选择保留片段默认内容,无需修改片段定义,就能灵活适配不同页面的布局需求。

总结

  1. 无操作令牌 _ 作为片段参数时,会让片段中对应 th:replace 逻辑不执行,直接保留默认标记内容;
  2. 与空片段 ~{} 互补:_ 保留默认值,~{} 清空内容;
  3. 常结合条件表达式使用,实现“按需替换/保留默认”的灵活布局。