Skip to content

进阶:片段的条件化插入

空片段(~{})和无操作令牌(_)的组合使用,让我们能以简洁、优雅的方式实现片段的条件化插入——按需决定是否插入片段、插入空内容,或保留原有标记。

例如:我们可以用三元表达式判断条件,满足则插入目标片段,不满足则传入空片段(~{}),对应位置无任何内容。仅当用户是管理员时,插入 common :: adminhead 片段;否则插入空内容。

html
<!-- 仅当用户是管理员时,插入 common :: adminhead 片段;否则插入空内容 -->
<div th:insert="${user.isAdmin()} ? ~{common :: adminhead} : ~{}">...</div>

同样的,我们也可以使用无操作令牌(_),当条件满足时插入片段,不满足时传入无操作令牌(_),直接保留 <div> 内的原生标记,不做任何替换。

html
<!-- 管理员:插入 adminhead 片段;非管理员:保留 div 内的欢迎语 -->
<div th:insert="${user.isAdmin()} ? ~{common :: adminhead} : _">
    Welcome [[${user.name}]], click <a th:href="@{/support}">here</a> for help-desk support.
</div>

另外,如果模板解析器开启了 checkExistence 标志(检查模板/片段是否存在),可结合「默认操作符 ?:」实现:片段存在则插入,不存在则保留原有标记

html
<!-- 若 common :: salutation 片段存在 → 插入;不存在/为空 → 保留 div 内的内容 -->
<div th:insert="~{common :: salutation} ?: _">
    Welcome [[${user.name}]], click <a th:href="@{/support}">here</a> for help-desk support.
</div>
  • 前提:需在模板解析器中配置 checkExistence=true(以 Spring 为例):
    java
    @Bean
    public ClassLoaderTemplateResolver templateResolver() {
        ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
        resolver.setCheckExistence(true); // 开启片段存在性检查
        // 其他配置...
        return resolver;
    }
  • 适用场景:适配多环境/多业务线的模板复用,片段存在则用统一内容,不存在则用页面自有内容。

核心语法对比(条件插入的三种方式)

写法条件满足条件不满足适用场景
条件 ? 片段 : ~{}插入片段插入空内容仅在条件满足时显示内容
条件 ? 片段 : _插入片段保留原有标记条件不满足时显示原生内容
片段 ?: _片段存在则插入片段不存在则保留原有标记兼容片段缺失的场景

进阶扩展:多条件组合

可结合多个表达式实现更复杂的条件插入逻辑:

html
<!-- 管理员 → 插入 adminhead;VIP用户 → 插入 viphead;普通用户 → 保留原有内容 -->
<div th:insert="
    ${user.isAdmin()} ? common :: adminhead :
    (${user.isVip()} ? common :: viphead : _)
">
    Welcome [[${user.name}]], click <a th:href="@{/support}">here</a> for help-desk support.
</div>

总结

  1. 空片段(~{})和无操作令牌(_)是实现片段条件插入的核心工具:~{} 清空内容,_ 保留原有标记;
  2. 三元表达式+片段表达式可实现“条件插入/空内容”“条件插入/保留原生内容”两种核心场景;
  3. 开启 checkExistence 后,可通过 ?: _ 实现“片段存在则插入,否则保留原生内容”,提升模板兼容性。