点击查看杂货店的过滤器 GTVGFilter.java 源码。
杂货店 GTVGFilter 过滤器中的 init(final FilterConfig filterConfig) 方法包含以下代码行:
@Override public void init(final FilterConfig filterConfig) throws ServletException { this.application = JakartaServletWebApplication.buildApplication(filterConfig.getServletContext()); this.templateEngine = buildTemplateEngine(this.application); }
这意味着 GTVGFilter 过滤器类负责创建和配置 Thymeleaf 应用程序中最重要的对象之一:TemplateEngine 实例(ITemplateEngine 接口的实现)。
我们的 org.thymeleaf.TemplateEngine 对象是在 GTVGFilter 类的 buildTemplateEngine() 方法中进行初始化的,代码如下:
package thymeleafexamples.gtvg.web.filter; import java.io.IOException; import java.io.Writer; import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.FilterConfig; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.thymeleaf.ITemplateEngine; import org.thymeleaf.TemplateEngine; import org.thymeleaf.templatemode.TemplateMode; import org.thymeleaf.templateresolver.WebApplicationTemplateResolver; import org.thymeleaf.web.IWebApplication; import org.thymeleaf.web.IWebExchange; import org.thymeleaf.web.IWebRequest; import org.thymeleaf.web.servlet.JakartaServletWebApplication; import thymeleafexamples.gtvg.business.entities.User; import thymeleafexamples.gtvg.web.controller.IGTVGController; import thymeleafexamples.gtvg.web.mapping.ControllerMappings; /** * 过滤器 * @author Administrator */ public class GTVGFilter implements Filter { private ITemplateEngine templateEngine; private JakartaServletWebApplication application; //... /** * 构建模板引擎 * @param application * @return */ private static ITemplateEngine buildTemplateEngine(final IWebApplication application) { final WebApplicationTemplateResolver templateResolver = new WebApplicationTemplateResolver(application); // HTML是默认模式,但为了更好地理解代码,我们将对其进行设置 templateResolver.setTemplateMode(TemplateMode.HTML); // 这会将 “home” 转换为 “/WEB-INF/Templates/home.html” templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html"); // 将模板缓存TTL设置为1小时。如果未设置,条目将驻留在缓存中,直到被LRU驱逐 templateResolver.setCacheTTLMs(Long.valueOf(3600000L)); // 默认情况下,缓存设置为 true。如果希望模板在修改时自动更新,请设置为 false。 templateResolver.setCacheable(false); final TemplateEngine templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(templateResolver); return templateEngine; } }
其实,配置 TemplateEngine 对象的方法有很多,但上面方法中的这些代码就足以让我们了解所需的 Thymeleaf 知识。
让我们从模板解析器开始:
final WebApplicationTemplateResolver templateResolver = new WebApplicationTemplateResolver(application);
模板解析器是实现了 Thymeleaf API 中名为 org.tymeleaf.templateresolver.ITemplateResolver 接口的对象,该接口的其他实现如下图:
接口定义如下:
public interface ITemplateResolver { //... /* * 模板通过它们的名字(或内容)和它们的所有者模板(可选)进行解析, * 以防我们试图为另一个模板解析一个片段。如果模板不能被这个模板解析器处理,将返回null。 */ public TemplateResolution resolveTemplate( final IEngineConfiguration configuration, final String ownerTemplate, final String template, final Map<String, Object> templateResolutionAttributes); }
这些对象负责决定我们的模板如何被访问,在这个 GTVG 应用中,org.thymeleaf.templateresolver.WebApplicationTemplateResolver 意味着我们将从 Servlet Context 中检索我们的模板文件作为资源:一个应用范围的 javax.servlet.ServletContext 对象,它存在于每个 Java Web 应用中,并从 Web 应用根中解析资源。
但这并不是关于模板解析器的全部内容,因为我们可以在模板解析器上设置一些配置参数。首先,模板模式:
templateResolver.setTemplateMode(TemplateMode.HTML);
HTML 语言是 ServletContextTemplateResolver 的默认模板模式,但最好还是建立它,以便我们的代码清楚地记录正在发生的事情。
templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html");
前缀(setPrefix)和后缀(setSuffix)配置将修改我们将传递给 Thymeleaf 引擎以获取要使用的真实资源名称的模板名称。
使用此配置时,模板名称“product/list”将对应于:
servletContext.getResourceAsStream("/WEB-INF/templates/product/list.html")
或者,通过 cacheTTLMs 属性在模板解析器中配置已解析的模板可以在缓存中存活的时间量:
templateResolver.setCacheTTLMs(3600000L);
如果达到缓存的最大大小并且模板是当前缓存的最旧的条目,则任然可以在达到该 TTL 之前将模板从缓存中删除。
注意:用户可以通过实现 ICacheManager 接口或通过修改 StandardCacheManager 对象来管理默认缓存来定义缓存行为和大小。
关于模板解析器,还有很多需要了解的内容,但现在让我们来看看模板引擎对象的创建。
模板引擎对象是 org.thymeleaf.ITemplateEngine 接口的实现。
其中一个实现是由 Thymeleaf 核心提供的:org.thymeleaf.TemplateEngine,我们在这里创建它的一个实例:
final TemplateEngine templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(templateResolver);
很简单,不是吗?我们所需要的就是创建一个实例并将模板解析器设置为它。模板解析器是 TemplateEngine 需要的唯一必需参数,尽管还有许多其他参数将在后面讨论(消息解析器、缓存大小等)。
就目前而言,这就是我们所需要的。
我们的模板引擎现在已经准备好了,我们可以开始使用 Thymeleaf 创建页面了。