Thymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发。它是一个开源的Java库,基于ApacheLicense2.0许可,由DanielFernández创建,该作者还是Java加密库Jasypt的作者。
Thymeleaf提供了一个用于整合Spring MVC的可选模块,在应用开发中可以使用Thymeleaf来完全代替JSP或其他模板引擎,如Velocity、FreeMarker等。Thymeleaf 最大的特点是即使不启动Web应用,也可以直接在浏览器中打开并正确显示模板页面。Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。可以使用它创建经过验证的XML与HTML模板。相对于编写逻辑或代码,开发者只需将标签属性添加到模板中即可。
Thymeleaf的主要特性:
1、动静结合:Thymeleaf既可以直接使用浏览器打开,查看页面的静态效果,也可以通过Web应用程序进行访问,查看动态页面效果。
2、开箱即用:Thymeleaf提供了Spring标准方言以及一个与SpringMVC完美集成的可选模块,可以快速地实现表单绑定、属性编辑器、国际化等功能。
3、多方言支持:它提供了Thymeleaf标准和Spring标准两种方言,可以直接套用模板实现JSTL、OGNL表达式;必要时开发人员也可以扩展和创建自定义的方言。
4、与SpringBoot完美整合:SpringBoot为Thymeleaf提供了的默认配置,并且还为Thymeleaf设置了视图解析器,因此Thymeleaf可以与Spring Boot完美整合。
下面是SpringBoot整合Thymeleaf的简单示例:
依赖包版本:
<!-- SpringBootThymeleaf依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.7.14</version>
</dependency>
Thymeleaf配置属性:
@Data
@ConfigurationProperties(prefix = "template.thymeleaf")
public class ThymeleafProperties {
/** 是否开启 */
private Boolean enable;
/** 模版解析 */
private List<TemplateResolver> templateResolvers;
@Data
static class TemplateResolver {
/** 前缀 */
private String prefix;
/** 后缀 */
private String suffix;
/** 模版模式 */
private String templateMode;
/** 是否开启 */
private Set<String> resolvablePatterns;
/** 是否缓存 */
private Boolean cacheable = false;
/** 顺序 */
private Integer order;
}
}
SpringBoot整合Thymeleaf自动配置:
@EnableConfigurationProperties({ ThymeleafProperties.class })
@Configuration
public class ThymeleafAutoConfiguration {
private static final String FILE_PREFIX = "file:";
@Bean(name = "thymeleafTemplateEngine")
@ConditionalOnProperty(prefix="template.thymeleaf", name = "enable", havingValue = "true", matchIfMissing = false)
public SpringWebFluxTemplateEngine thymeleafTemplateEngine(ThymeleafProperties thymeleafProperties) {
SpringWebFluxTemplateEngine templateEngine = new SpringWebFluxTemplateEngine();
Set<ITemplateResolver> templateResolvers = new HashSet<>();
if (null == thymeleafProperties || null == thymeleafProperties.getTemplateResolvers()) {
templateResolvers.add(templateResolver(0, "/templates/", ".html", TemplateMode.HTML,
new HashSet<>(Arrays.asList("html/*", "*/html/*")), true));
templateResolvers.add(templateResolver(1, "/templates/", ".xml", TemplateMode.XML,
new HashSet<>(Arrays.asList("xml/*", "*/xml/*")), true));
templateResolvers.add(templateResolver(2, "/templates/", ".txt", TemplateMode.TEXT,
new HashSet<>(Arrays.asList("text/*", "*/text/*")), true));
} else {
thymeleafProperties.getTemplateResolvers().forEach(templateResolver -> {
templateResolvers.add(templateResolver(templateResolver.getOrder(), templateResolver.getPrefix(),
templateResolver.getSuffix(), TemplateMode.parse(templateResolver.getTemplateMode()),
templateResolver.getResolvablePatterns(), templateResolver.getCacheable()));
});
}
templateEngine.setTemplateResolvers(templateResolvers);
return templateEngine;
}
@Bean(name = "thymeleafTemplateService")
@ConditionalOnProperty(prefix="template.thymeleaf", name = "enable", havingValue = "true", matchIfMissing = false)
public TemplateService thymeleafTemplateService(TemplateEngine thymeleafTemplateEngine) {
return new ThymeleafTemplateServiceImpl(thymeleafTemplateEngine);
}
private ITemplateResolver templateResolver(int order, String prefix, String suffix, TemplateMode templateMode,
Set<String> resolvablePatterns, boolean cacheable) {
AbstractConfigurableTemplateResolver templateResolver =
prefix.startsWith(FILE_PREFIX) ? new FileTemplateResolver() : new ClassLoaderTemplateResolver();
templateResolver.setOrder(order);
templateResolver.setPrefix(prefix.startsWith(FILE_PREFIX) ? prefix.substring(FILE_PREFIX.length()) : prefix);
templateResolver.setSuffix(suffix);
templateResolver.setTemplateMode(templateMode);
templateResolver.setResolvablePatterns(resolvablePatterns);
templateResolver.setCharacterEncoding("UTF-8");
templateResolver.setCacheable(cacheable);
return templateResolver;
}
}
spring.factories配置:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.component.template.config.ThymeleafAutoConfiguration
配置文件配置:
template:
thymeleaf:
enable: true
template-resolvers:
- prefix: "/template/"
suffix: ".html"
templateMode: HTML
resolvablePatterns:
- "html/*"
- "*/html/*"
cacheable: true
order: 0
- prefix: "/template/"
suffix: ".xml"
templateMode: XML
resolvablePatterns: ["xml/*","*/xml/*"]
cacheable: true
order: 1
- prefix: "file:D:/template/"
suffix: ".html"
templateMode: HTML
resolvablePatterns:
- "html/*"
- "*/html/*"
cacheable: true
order: 2