如何配置Spring与Thymeleaf将模板存放在类所在同包路径下
实现Thymeleaf模板与业务类同包存放的配置方案
要实现Thymeleaf模板和对应业务类存放在同一包路径下,按以下步骤配置即可:
1. Spring & Thymeleaf 视图解析配置
场景1:Spring Boot 项目
直接在application.yml或application.properties中修改Thymeleaf默认前缀即可:
# application.yml 配置示例 spring: thymeleaf: # 前缀指向业务代码根包的类路径 prefix: classpath:/com/example/myapp/ suffix: .html mode: HTML encoding: UTF-8
如果是properties格式:
# application.properties 配置示例 spring.thymeleaf.prefix=classpath:/com/example/myapp/ spring.thymeleaf.suffix=.html spring.thymeleaf.mode=HTML spring.thymeleaf.encoding=UTF-8
场景2:非Spring Boot的Spring MVC项目
手动注册Thymeleaf相关组件的配置类如下:
@Configuration public class ThymeleafCustomConfig { @Bean public SpringResourceTemplateResolver templateResolver() { SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); resolver.setPrefix("classpath:/com/example/myapp/"); resolver.setSuffix(".html"); resolver.setTemplateMode(TemplateMode.HTML); resolver.setCharacterEncoding("UTF-8"); // 开启缓存(生产环境建议开启,开发环境可设为false) resolver.setCacheable(true); return resolver; } @Bean public SpringTemplateEngine templateEngine(SpringResourceTemplateResolver resolver) { SpringTemplateEngine engine = new SpringTemplateEngine(); engine.setTemplateResolver(resolver); return engine; } @Bean public ThymeleafViewResolver viewResolver(SpringTemplateEngine engine) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(engine); resolver.setCharacterEncoding("UTF-8"); resolver.setOrder(1); return resolver; } }
2. 构建工具资源拷贝配置(必做)
默认情况下Maven/Gradle只会打包src/main/java目录下的.class文件,不会把同目录的.html模板文件拷贝到类路径,需要额外配置:
Maven 配置
修改pom.xml的build节点:
<build> <resources> <!-- 拷贝java目录下的html模板文件 --> <resource> <directory>src/main/java</directory> <includes> <include>**/*.html</include> </includes> </resource> <!-- 保留原有resources目录的资源拷贝逻辑 --> <resource> <directory>src/main/resources</directory> </resource> </resources> </build>
Gradle 配置
修改build.gradle的sourceSets配置:
sourceSets { main { resources { // 增加java目录作为资源目录,仅包含html文件 srcDirs += 'src/main/java' includes += '**/*.html' } } }
3. 使用示例
配置完成后,视图名按子包名/模板名(不带后缀)的格式返回即可,比如:
package com.example.myapp.foo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class Foo { @GetMapping("/foo-page") public String getFooPage() { // 对应com/example/myapp/foo/Template.html return "foo/Template"; } }
package com.example.myapp.bar; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class Bar { @GetMapping("/other-page") public String getOtherPage() { // 对应com/example/myapp/bar/OtherTemplate.html return "bar/OtherTemplate"; } }
内容的提问来源于stack exchange,提问作者Pavel Polyakoff
相关产品推荐
相关产品推荐

