十五、有关配置的更多信息
15.1 模板解析器
对于我们的 Good Thymes 虚拟杂货店,我们选择了一个名为ServletContextTemplateResolver
的ITemplateResolver
实现,该实现使我们能够从 Servlet 上下文中获取模板作为资源。
除了使我们能够通过实现ITemplateResolver,
Thymeleaf 来创建自己的模板解析器之外,还包括以下四种实现:
-
org.thymeleaf.templateresolver.ClassLoaderTemplateResolver
,将模板解析为类加载器资源,例如:return Thread.currentThread().getContextClassLoader().getResourceAsStream(template);
-
org.thymeleaf.templateresolver.FileTemplateResolver
,将模板解析为来自文件系统的文件,例如:return new FileInputStream(new File(template));
-
org.thymeleaf.templateresolver.UrlTemplateResolver
,将模板解析为 URL(甚至是 nonlocal 的 URL),例如:return (new URL(template)).openStream();
-
org.thymeleaf.templateresolver.StringTemplateResolver
,它直接将模板解析为String
被指定为template
(或* template name *,在这种情况下显然不仅仅是一个简单的名称):return new StringReader(templateName);
ITemplateResolver
的所有预 Binding 实现均允许使用相同的配置参数集,其中包括:
-
前缀和后缀(如前所述):
templateResolver.setPrefix("/WEB-INF/templates/");
templateResolver.setSuffix(".html"); -
模板别名允许使用与文件名不直接对应的模板名。如果后缀/前缀和别名都存在,则别名将在前缀/后缀之前应用:
templateResolver.addTemplateAlias("adminHome","profiles/admin/home");
templateResolver.setTemplateAliases(aliasesMap); -
读取模板时要应用的编码:
templateResolver.setCharacterEncoding("UTF-8");
-
使用的模板模式:
// Default is HTML
templateResolver.setTemplateMode("XML"); -
模板缓存的默认模式,以及用于定义特定模板是否可缓存的模式:
// Default is true
templateResolver.setCacheable(false);
templateResolver.getCacheablePatternSpec().addPattern("/users/*"); -
源自此模板解析器的已解析模板缓存条目的 TTL(以毫秒为单位)。如果未设置,则从缓存中删除条目的唯一方法是超过缓存的最大大小(最旧的条目将被删除)。
// Default is no TTL (only cache size exceeded would remove entries)
templateResolver.setCacheTTLMs(60000L);
Thymeleaf Spring 集成软件包提供了
SpringResourceTemplateResolver
实现,该实现使用所有 Spring 基础结构来访问和读取应用程序中的资源,这是在启用 Spring 的应用程序中推荐的实现。
链接模板解析器
此外,模板引擎可以指定多个模板解析器,在这种情况下,可以在它们之间构建 Sequences 以进行模板解析,这样,如果第一个解析器无法解析模板,则要求第二个解析器,依此类推:
ClassLoaderTemplateResolver classLoaderTemplateResolver = new ClassLoaderTemplateResolver();
classLoaderTemplateResolver.setOrder(Integer.valueOf(1));
ServletContextTemplateResolver servletContextTemplateResolver =
new ServletContextTemplateResolver(servletContext);
servletContextTemplateResolver.setOrder(Integer.valueOf(2));
templateEngine.addTemplateResolver(classLoaderTemplateResolver);
templateEngine.addTemplateResolver(servletContextTemplateResolver);
当应用多个模板解析器时,建议为每个模板解析器指定模式,以便 Thymeleaf 可以快速丢弃那些不打算解析模板的模板解析器,从而提高性能。这样做不是必需的,但是建议:
ClassLoaderTemplateResolver classLoaderTemplateResolver = new ClassLoaderTemplateResolver();
classLoaderTemplateResolver.setOrder(Integer.valueOf(1));
// This classloader will not be even asked for any templates not matching these patterns
classLoaderTemplateResolver.getResolvablePatternSpec().addPattern("/layout/*.html");
classLoaderTemplateResolver.getResolvablePatternSpec().addPattern("/menu/*.html");
ServletContextTemplateResolver servletContextTemplateResolver =
new ServletContextTemplateResolver(servletContext);
servletContextTemplateResolver.setOrder(Integer.valueOf(2));
如果未指定这些“可解析模式” ,我们将依靠我们正在使用的每个ITemplateResolver
实现的特定功能。请注意,并非所有实现都能够在解析之前确定模板的存在,因此始终可以将模板视为“可解析” 并 break 解析链(不允许其他解析器检查同一模板),但是无法读取真实资源。
Thymeleaf 核心随附的所有ITemplateResolver
实现都包括一种机制,使我们可以让解析程序在考虑可解析之前,先检查资源是否存在。它是checkExistence
标志,其工作方式如下:
ClassLoaderTemplateResolver classLoaderTemplateResolver = new ClassLoaderTemplateResolver();
classLoaderTemplateResolver.setOrder(Integer.valueOf(1));
classLoaderTempalteResolver.setCheckExistence(true);
这个checkExistence
标志强制解析器在解析阶段对资源是否存在进行“真实检查”(如果存在检查返回 false,则让链中的以下解析器被调用)。虽然这在每种情况下听起来都不错,但在大多数情况下,这将意味着对资源本身的双重访问(一次用于检查是否存在,另一次用于读取它),并且在某些情况下可能是性能问题,例如基于远程 URL 的模板资源–使用模板高速缓存(在任何情况下,仅在首次访问模板时才“解析”它们)可能会大大缓解潜在的性能问题。
15.2 邮件解析器
我们没有为 Grocery 应用程序明确指定 Message Resolver 实现,并且如前所述,这意味着所使用的实现是org.thymeleaf.messageresolver.StandardMessageResolver
对象。
StandardMessageResolver
是IMessageResolver
接口的标准实现,但是如果需要,我们可以创建自己的接口,以适应应用程序的特定需求。
Thymeleaf Spring 集成软件包默认情况下提供
IMessageResolver
实现,该实现使用标准 Spring 方法通过使用在 Spring Application Context 声明的MessageSource
bean 来检索外部消息。
标准邮件解析器
那么StandardMessageResolver
如何查找在特定模板上请求的消息?
如果模板名称为home
且位于/WEB-INF/templates/home.html
,并且请求的语言环境为gl_ES
,则此解析器将按以下 Sequences 在以下文件中查找消息:
/WEB-INF/templates/home_gl_ES.properties
/WEB-INF/templates/home_gl.properties
/WEB-INF/templates/home.properties
有关完整的消息解析机制如何工作的更多详细信息,请参阅StandardMessageResolver
类的 JavaDoc 文档。
配置邮件解析器
如果我们想向模板引擎添加消息解析器(或更多)怎么办?简单:
// For setting only one
templateEngine.setMessageResolver(messageResolver);
// For setting more than one
templateEngine.addMessageResolver(messageResolver);
为什么我们要拥有多个消息解析器?出于与模板解析器相同的原因:Order 了消息解析器,如果第一个无法解析特定的消息,则将询问第二个,然后询问第三个,依此类推。
15.3 转换服务
通过 double-brace 语法(${{...}}
)使我们能够执行数据转换和格式化操作的转换服务实际上是标准方言的功能,而不是 Thymeleaf 模板引擎本身的功能。
因此,配置它的方法是直接将我们自定义的IStandardConversionService
接口设置直接设置到正在模板引擎中配置的StandardDialect
实例中。喜欢:
IStandardConversionService customConversionService = ...
StandardDialect dialect = new StandardDialect();
dialect.setConversionService(customConversionService);
templateEngine.setDialect(dialect);
请注意,thymeleaf-spring3 和 thymeleaf-spring4 软件包包含
SpringStandardDialect
,并且该方言已经预先配置了IStandardConversionService
的实现,该实现将 Spring 自己的* Conversion Service *基础结构集成到 Thymeleaf 中。
15.4 Logging
Thymeleaf 非常重视日志记录,并始终尝试通过其日志记录界面提供尽可能多的有用信息。
所使用的日志记录库是slf4j,
,实际上它充当了我们可能要在应用程序中使用的任何日志记录实现的 bridge 梁(例如log4j
)。
Thymeleaf 类将记录TRACE
,DEBUG
和INFO
级别的信息,具体取决于我们希望的详细程度,除常规记录外,它将使用与 TemplateEngine 类关联的三个特殊 Logger,我们可以分别针对不同目的进行配置:
org.thymeleaf.TemplateEngine.CONFIG
将在初始化期间输出库的详细配置。org.thymeleaf.TemplateEngine.TIMER
将输出有关处理每个模板所需时间的信息(可用于基准测试!)org.thymeleaf.TemplateEngine.cache
是一组 Logger 的前缀,这些 Logger 输出有关缓存的特定信息。尽管缓存 Logger 的名称可由用户配置,因此可以更改,但默认情况下为:-
org.thymeleaf.TemplateEngine.cache.TEMPLATE_CACHE
org.thymeleaf.TemplateEngine.cache.EXPRESSION_CACHE
使用log4j
的 Thymeleaf 日志记录基础结构的示例配置可能是:
log4j.logger.org.thymeleaf=DEBUG
log4j.logger.org.thymeleaf.TemplateEngine.CONFIG=TRACE
log4j.logger.org.thymeleaf.TemplateEngine.TIMER=TRACE
log4j.logger.org.thymeleaf.TemplateEngine.cache.TEMPLATE_CACHE=TRACE
最新评论
Spring Cloud Alibaba 微服务架构实战 https://pan.baidu.com/s/1jF5voFRoeF0lYAzAPBWSbw?pwd=chqk
命令: nload
真是个良心站点哇,大公无私,爱了爱了
还可以直接搞一张映射表,存 uid | time | source_index, 第一次直接查对应的 time 选出前100, 第二次直接用 CompleteFuture 去分别用 source_in
干得漂亮,多个朋友堵条路
2021.2.2版本的不适用吧
现在还可以用么
激活码有用,感谢分享