深色模式
4.13 无操作令牌
无操作令牌由下划线符号 _ 表示。
它的核心作用是:指定表达式的预期结果为“不执行任何操作”——也就是说,效果完全等同于该可处理属性(如 th:text)根本不存在。
这个标记的一大优势是允许开发者直接将原型文本作为默认值,让代码更简洁,且从设计角度更灵活。 传统写法(用 Elvis 运算符指定默认文本):
html
<span th:text="${user.name} ?: 'no user authenticated'">...</span>我们可以直接将 “no user authenticated”(未认证用户)用作原型演示文本,如此一来,从设计角度而言,代码会变得更简洁且适用性更强。
html
<span th:text="${user.name} ?: _">no user authenticated</span>核心逻辑解释
执行规则:
- 当
${user.name}不为null时:th:text会渲染${user.name}的值,覆盖原型文本; - 当
${user.name}为null时:?: _触发“无操作”,th:text不做任何处理,直接显示标签内的原型文本no user authenticated。
- 当
与 Elvis 运算符的等价性:
th:text="${user.name} ?: _"等价于:“如果user.name非空则显示它,否则保留标签原有内容”。这和传统写法的最终效果一致,但:- 原型文本直接写在标签内,前端设计师修改默认文本时无需改动表达式,更友好;
- 代码少了一层单引号包裹,更简洁。
适用场景: 任何支持 Thymeleaf 表达式的属性(
th:text/th:value/th:href等)都可使用,尤其适合“原型文本即默认值”的场景:html<!-- 输入框默认值:user.name 非空则显示,否则显示 '请输入姓名' --> <input type="text" th:value="${user.name} ?: _" value="请输入姓名"> <!-- 链接默认值:user.link 非空则跳转,否则保留原型链接 --> <a th:href="${user.link} ?: _" href="/default/link">默认链接</a>
关键注意事项
- 仅跳过当前属性处理:
_只对当前th:*属性生效,不会影响标签内的其他属性或内容; - 区别于 null/空字符串:
_不是返回null或空字符串,而是“不修改原有内容”——比如标签内原型文本是no user,则显示no user,而非空; - 不能单独使用:
_必须配合 Elvis 运算符(?: _)使用,直接写th:text="_"会渲染出下划线字符_,而非无操作。
总结
- 无操作令牌
_是 Thymeleaf 专为“保留原型文本作为默认值”设计的语法,配合 Elvis 运算符?: _使用; - 核心效果:表达式结果为 null 时,跳过当前
th:*属性的处理,直接显示标签内的原型文本; - 相比传统的 Elvis 运算符默认值写法,更简洁、对前端原型设计更友好,是模板原型开发的优选方式。
