最近开发当中需要在SpringBoot配置多个不同Thymeleaf位置,特此记录下相关过程
默认Thymeleaf配置
当我们集成thymeleaf后,会有一个默认的配置信息,可以在配置文件当中配置默认的信息,修改路径,前后缀等等参数
spring:
thymeleaf:
prefix: classpath:/templates/
mode: HTML
cache: true
check-template: true
encoding: UTF-8
suffix: .html
template-resolver-order:
具体实现则是通过ThymeleafAutoConfiguration类中进行的自动配置
@Bean
SpringResourceTemplateResolver defaultTemplateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(this.applicationContext);
resolver.setPrefix(this.properties.getPrefix());
resolver.setSuffix(this.properties.getSuffix());
resolver.setTemplateMode(this.properties.getMode());
if (this.properties.getEncoding() != null) {
resolver.setCharacterEncoding(this.properties.getEncoding().name());
}
resolver.setCacheable(this.properties.isCache());
Integer order = this.properties.getTemplateResolverOrder();
if (order != null) {
resolver.setOrder(order);
}
resolver.setCheckExistence(this.properties.isCheckTemplate());
return resolver;
}
配置多个thymeleaf模板位置
由于默认配置只能设置一个thymeleaf模板位置,所以当需要配置多个模板位置的时候就需要自行定义模板解析即可
@Configuration
public class ThymeleafConfig {
/**
* 这里重写默认的解析配置
*/
@Bean
public SpringResourceTemplateResolver defaultTemplateResolver(){
SpringResourceTemplateResolver springResourceTemplateResolver = new SpringResourceTemplateResolver();
springResourceTemplateResolver.setOrder(1); //解析匹配优先级 从1开始进行匹配
springResourceTemplateResolver.setCacheable(false); //是否缓存
springResourceTemplateResolver.setTemplateMode(TemplateMode.HTML); //模板类型
springResourceTemplateResolver.setSuffix(".html"); //匹配后缀
springResourceTemplateResolver.setPrefix("classpath: /theme/"); //匹配前缀
springResourceTemplateResolver.setCharacterEncoding("UTF-8"); //文件编码
springResourceTemplateResolver.setCheckExistence(true); //匹配前是否检查文件是否存在 如果需要存在多个TemplateResolver解析器 这里需要设置成true 不然不会进入到后面的解析器
return springResourceTemplateResolver;
}
/**
* 这里写第二个解析配置
*/
@Bean
public SpringResourceTemplateResolver springResourceTemplateResolver(){
SpringResourceTemplateResolver springResourceTemplateResolver = new SpringResourceTemplateResolver();
springResourceTemplateResolver.setOrder(2);
springResourceTemplateResolver.setCacheable(false);
springResourceTemplateResolver.setTemplateMode(TemplateMode.HTML);
springResourceTemplateResolver.setSuffix(".html");
springResourceTemplateResolver.setPrefix("file: d:/test/");
springResourceTemplateResolver.setCharacterEncoding("UTF-8");
springResourceTemplateResolver.setCheckExistence(false); //最后一个解析器需要设置为false
return springResourceTemplateResolver;
}
}
注意事项
- ClassLoaderTemplateResolver,FileTemplateResolver,UrlTemplateResolver,SpringResourceTemplateResolver 这四个解析器都可以解析thymeleaf模板,不过根据名称就能知道什么情况下使用什么解析器,就不详细说明了。
- defaultTemplateResolver 是否一定要重写?不一定,如果不重写也没关系只是还能解析到默认配置而已
- order和checkExistence,如果前一个order的TemplateResolver设置checkExistence为false,后续order的TemplateResolver将无法正常解析。