深色模式
进阶:片段的条件化插入
空片段(~{})和无操作令牌(_)的组合使用,让我们能以简洁、优雅的方式实现片段的条件化插入——按需决定是否插入片段、插入空内容,或保留原有标记。
例如:我们可以用三元表达式判断条件,满足则插入目标片段,不满足则传入空片段(~{}),对应位置无任何内容。仅当用户是管理员时,插入 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>总结
- 空片段(
~{})和无操作令牌(_)是实现片段条件插入的核心工具:~{}清空内容,_保留原有标记; - 三元表达式+片段表达式可实现“条件插入/空内容”“条件插入/保留原生内容”两种核心场景;
- 开启
checkExistence后,可通过?: _实现“片段存在则插入,否则保留原生内容”,提升模板兼容性。
