深色模式
无操作令牌(_)的使用
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. 核心价值
无操作令牌 _ 让片段参数的控制更精细:既可以传递自定义标记、传递空内容,也可以主动选择保留片段默认内容,无需修改片段定义,就能灵活适配不同页面的布局需求。
总结
- 无操作令牌
_作为片段参数时,会让片段中对应th:replace逻辑不执行,直接保留默认标记内容; - 与空片段
~{}互补:_保留默认值,~{}清空内容; - 常结合条件表达式使用,实现“按需替换/保留默认”的灵活布局。
