Skip to content

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>

核心逻辑解释

  1. 执行规则

    • ${user.name} 不为 null 时:th:text 会渲染 ${user.name} 的值,覆盖原型文本;
    • ${user.name}null 时:?: _ 触发“无操作”,th:text 不做任何处理,直接显示标签内的原型文本 no user authenticated
  2. 与 Elvis 运算符的等价性th:text="${user.name} ?: _" 等价于:“如果 user.name 非空则显示它,否则保留标签原有内容”。这和传统写法的最终效果一致,但:

    • 原型文本直接写在标签内,前端设计师修改默认文本时无需改动表达式,更友好;
    • 代码少了一层单引号包裹,更简洁。
  3. 适用场景: 任何支持 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="_" 会渲染出下划线字符 _,而非无操作。

总结

  1. 无操作令牌 _ 是 Thymeleaf 专为“保留原型文本作为默认值”设计的语法,配合 Elvis 运算符 ?: _ 使用;
  2. 核心效果:表达式结果为 null 时,跳过当前 th:* 属性的处理,直接显示标签内的原型文本;
  3. 相比传统的 Elvis 运算符默认值写法,更简洁、对前端原型设计更友好,是模板原型开发的优选方式。