SpringSts中整合Thymeleaf到SpringMVC
1. 当Tomcat启动时通过OnStart方法首先通过getRootConfigClasses()方法加载自定义的Root WebApplicationContext容器,其次通过getServletConfigClasses()方法再加载其他相关配置(SpringMVC配置)
2. 因此创建一个AppRootConfig 类用于声明ITemplateResolver模板解析器接口的Bean对象和SpringTemplateEngine模板引擎的Bean对象,并且能够加载到Root WebApplicationContext容器中
@Configuration
public class AppRootConfig {
// 模板解析器 : 用于解析"模板文件
@Bean
public ITemplateResolver templateResolverBean() {
// 模板解析器对象(Spring整合专用)
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
// 前缀路径(模板文件的存储位置)
templateResolver.setPrefix("/WEB-INF/templates/");
// 模板文件后缀名
templateResolver.setSuffix(".html");
// 模板文件语法类型
templateResolver.setTemplateMode(TemplateMode.HTML);
//关闭模板解析器的缓存,方便开发,上线后需要开启
templateResolver.setCacheable(false);
// 模板文件字符编码集
templateResolver.setCharacterEncoding("utf-8");
return templateResolver;
}
// 模板引擎:用于加载模板文件,并调用模板解析器进行解析执行
@Bean
public SpringTemplateEngine templateEngineBean(ITemplateResolver resolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
// 注入"模板解析器"
templateEngine.setTemplateResolver(resolver);
return templateEngine;
}
}
3.配置springmvc,通过自定义类SpringMvcConfig 实现WebMvcConfigurer接口重写configureViewResolvers方法将Thymeleaf视图解析器注册到容器中,这时就需要把上面的模板引擎Bean对象注入到ThymeleafViewResolver 视图解析器中,通过ContextLoader.getCurrentWebApplicationContext()方法获取Root WebApplicationContext容器,然后通过getBean(SpringTemplateEngine.class)方法从容器中获取模板引擎Bean再将器注入
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer{
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
ApplicationContext applicationContext = ContextLoader.getCurrentWebApplicationContext();
SpringTemplateEngine bean = applicationContext.getBean(SpringTemplateEngine.class);
resolver.setTemplateEngine(bean);
resolver.setCharacterEncoding("utf-8");
registry.viewResolver(resolver);
}
4.到此Thymeleaf配置完成,当Tomcat启动就会加载上面的配置
public class DispatcherServletConfig
extends AbstractAnnotationConfigDispatcherServletInitializer{
// 加载Spring容器:Root WebApplicationContext(Spring)
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { AppRootConfig.class };
}
// 加载Spring容器:Serlvet WebApplicationContext(Spring MVC)
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { SpringMvcConfig.class };
}
}
5.在HTML文件中加入命名空间,就可以使用Thymeleaf的功能
<html class="no-js" lang="en" xmlns:th="http://www.thymeleaf.org">
6.Thymeleaf需要的依赖
<!-- thymeleaf-spring5整合依赖 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>