Skip to content

19 附录 B:表达式工具对象

执行信息

#execInfo 是 Thymeleaf 标准表达式中的工具对象,用于获取当前正在处理的模板的各类关键执行信息,其底层对应 org.thymeleaf.expression.ExecutionInfo 类。

java
/*
 * ======================================================================
 * 请查阅 org.thymeleaf.expression.ExecutionInfo 类的 Javadoc API 文档
 * ======================================================================
 */

/*
 * 返回「叶子模板(leaf)」的名称和模式。这里的叶子模板指的是:
 * 当前正在处理的事件所解析自的那个模板。也就是说,如果这段代码
 * 并非位于根模板"A"中,而是在一个从另一个名为"B"的模板插入到"A"的片段里,
 * 那么该表达式会返回"B"作为模板名称,同时返回B的模板模式。
 */
${#execInfo.templateName}
${#execInfo.templateMode}

/*
 * 返回「根模板(root)」的名称和模式。这里的根模板指的是:
 * 模板引擎最初被要求处理的那个模板。也就是说,即便这段代码
 * 不在根模板"A"中,而是在从模板"B"插入到"A"的片段里,
 * 该表达式仍会返回"A"作为模板名称,并返回A的模板模式。
 */
${#execInfo.processedTemplateName}
${#execInfo.processedTemplateMode}

/*
 * 返回正在处理的所有模板的栈信息(实际类型为 List<String> 或 List<TemplateMode>)。
 * 栈中第一个元素是「已处理模板(processedTemplate)」(即根模板),
 * 最后一个元素是「叶子模板(leaf)」;栈中间的元素则是所有以嵌套方式插入的片段模板——
 * 这些片段是从根模板到叶子模板的路径中被引入的。
 */
${#execInfo.templateNames}
${#execInfo.templateModes}

/*
 * 以与 'templateNames' 和 'templateModes' 相同的方式(且顺序一致)
 * 返回正在处理的模板栈,但返回值是包含完整模板元数据的 List<TemplateData> 类型。
 */
${#execInfo.templateStack}

补充说明(贴合 Thymeleaf 技术语境)

1. 核心术语解析

英文术语译法/说明
leaf template叶子模板(当前代码所在的实际模板,即“最底层”模板)
root template根模板(模板引擎入口模板,即“最顶层”模板)
processed template已处理模板(等价于 root template,模板引擎最初触发处理的模板)
template mode模板模式(如 HTML/TEXT/JAVASCRIPT 等,Thymeleaf 对不同类型模板的解析规则)
template stack模板栈(模板嵌套调用的层级记录,按“根→中间片段→叶子”顺序存储)
TemplateData模板元数据类(包含模板名称、模式、资源路径等完整信息,Thymeleaf 内置类)
ExecutionInfo执行信息工具类(Thymeleaf 表达式工具,#execInfo 是其在模板中的简写)

2. 关键逻辑解读

以“根模板 A 引入模板 B 的片段”为例:

  • #execInfo.templateName → 返回 B(叶子模板,代码实际所在位置)
  • #execInfo.processedTemplateName → 返回 A(根模板,引擎入口)
  • #execInfo.templateNames → 返回 [A, B](模板栈,从根到叶子的完整路径)

3. 句式优化说明

  • 把原文长句拆分为符合中文阅读习惯的短句(如将 This means... 拆为“这里的XX指的是:”),避免嵌套晦涩;
  • 补充“即”“也就是说”等连接词,强化“概念定义→举例说明”的逻辑;
  • 保留 ${#execInfo.xxx} 表达式原样(技术规范),同时将注释中的英文注释转为流畅的中文技术描述;
  • 对“stack”译为“栈”(编程领域通用译法),并补充“层级记录”“顺序”等说明,避免新手误解。

总结

  1. #execInfo 核心作用:获取模板引擎处理过程中的模板层级信息,区分「根模板」和「叶子模板」是关键;
  2. 核心属性分类:
    • 叶子模板信息:templateName/templateMode(当前代码所在模板);
    • 根模板信息:processedTemplateName/processedTemplateMode(引擎入口模板);
    • 模板栈信息:templateNames/templateModes(层级列表)、templateStack(含完整元数据的层级列表);
  3. 适用场景:模板嵌套/片段引入时,精准获取当前代码所属模板或入口模板的信息(如日志打印、动态适配模板模式)。