Skip to content

模板解析器

我们先从模板解析器(Template Resolver) 讲起:

java
final WebApplicationTemplateResolver templateResolver = 
        new WebApplicationTemplateResolver(application);

模板解析器是实现了 Thymeleaf API 中 org.thymeleaf.templateresolver.ITemplateResolver 接口的对象:

java
public interface ITemplateResolver {

    ...
  
    /*
     * 模板会根据其名称(或内容)解析,若为其他模板解析片段,还可指定所属模板(owner template)。
     * 如果当前模板解析器无法处理该模板,将返回 null。
     */
    public TemplateResolution resolveTemplate(
            final IEngineConfiguration configuration,
            final String ownerTemplate, final String template,
            final Map<String, Object> templateResolutionAttributes);
}

这些对象负责决定模板的访问方式。在这个 GTVG 应用中,使用 org.thymeleaf.templateresolver.WebApplicationTemplateResolver 意味着我们将从 IWebApplication 对象中获取模板文件(作为资源)——IWebApplication 是 Thymeleaf 的抽象层,在基于 Servlet 的应用中,它本质上是对 Servlet API 的 [javax|jakarta].servlet.ServletContext 对象的封装,能从 Web 应用根目录解析资源。

不过模板解析器的配置远不止这些,我们还可以为它设置一些参数。首先是模板模式

java
templateResolver.setTemplateMode(TemplateMode.HTML);

HTML 是 WebApplicationTemplateResolver 的默认模板模式,但显式声明仍是最佳实践,能让代码的意图更清晰。

java
templateResolver.setPrefix("/WEB-INF/templates/");
templateResolver.setSuffix(".html");

前缀(prefix)和后缀(suffix)会修改我们传给引擎的模板名称,从而得到实际要使用的资源名称。

比如配置后,模板名 product/list 会对应到:

java
servletContext.getResourceAsStream("/WEB-INF/templates/product/list.html")

此外,我们还可以通过 cacheTTLMs 属性在模板解析器中配置解析后的模板在缓存中的存活时间(可选):

java
templateResolver.setCacheTTLMs(3600000L);

即便未达到这个存活时间(TTL),如果缓存达到最大容量,该模板也可能因成为最久未使用(LRU)的条目而被清除。

INFO

用户可以通过实现 ICacheManager 接口,或修改 StandardCacheManager 对象(管理默认缓存),来自定义缓存行为和缓存大小。

关于模板解析器还有很多内容可以深入学习,但现在我们先看看模板引擎(Template Engine) 对象的创建过程。

核心代码解释

  1. TemplateResolver 核心作用:作为模板引擎和模板文件之间的“桥梁”,定义模板的存储位置、格式、缓存规则,核心方法 resolveTemplate 负责将模板名解析为实际的资源路径。
  2. 路径拼接规则prefix + 模板名 + suffix 是 Thymeleaf 定位模板的核心逻辑,/WEB-INF/templates/ 是 Web 应用中模板的常用存放路径(受 Servlet 保护,无法直接通过 URL 访问)。
  3. 缓存TTL配置3600000L 对应 1 小时,设置缓存有效期能减少重复解析模板的性能开销;开发阶段可临时关闭缓存(setCacheable(false)),避免修改模板后重启应用。

总结

  1. 模板解析器(TemplateResolver)是 Thymeleaf 初始化的核心,主要配置模板的访问路径、解析模式、缓存规则。
  2. WebApplicationTemplateResolver 适配 Servlet 环境,通过封装 ServletContext 从应用根目录加载模板资源。
  3. 前缀/后缀配置能简化模板名的使用,缓存配置则是平衡性能和开发便捷性的关键。