spring 启动无法解析 thymeleaf 模板
spring boot can't resolve thymeleaf templates
我是 spring 5 和 spring 引导的新手。
我正在尝试使用 thymeleaf 创建一个 spring 5/spring 启动应用程序。
我想创建一个 war 而不是使用带 spring 引导的嵌入式网络服务器。
当我部署 war 时,我的应用程序启动,我可以访问 src/main/resources/static/ 中的测试 html 页面,其中 javascript 调用我的控制器。我可以在这些页面上执行到我的控制器和数据库的往返行程。
但是,当我尝试打开位于 src/main/resources/templates/testtemplate 的 thymeleaf 页面时收到 404。html
相关专家:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring5 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.3.5.RELEASE</version>
</dependency>
申请:
@SpringBootApplication(exclude = {HibernateJpaAutoConfiguration.class, DataSourceAutoConfiguration.class})
public class WarApplication extends SpringBootServletInitializer
{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
{
return application.sources(WarApplication.class);
}
public static void main(String[] args) throws Exception
{
SpringApplication.run(WarApplication.class, args);
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(DataServiceConfig.class);
servletContext.addListener(new ContextLoaderListener(rootContext));
AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
dispatcherContext.register(WebConfig.class);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
网络配置:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.myproject")
public class WebConfig implements WebMvcConfigurer
{
@Autowired
ApplicationContext ctx;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
}
@Bean
@Description("Thymeleaf Template Resolver")
public SpringResourceTemplateResolver templateResolver()
{
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver ();
templateResolver.setPrefix("/templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
return templateResolver;
}
@Bean
@Description("Thymeleaf Template Engine")
public SpringTemplateEngine templateEngine()
{
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setEnableSpringELCompiler(true);
templateEngine.setTemplateEngineMessageSource(messageSource());
return templateEngine;
}
@Bean
@Description("Thymeleaf View Resolver")
public ThymeleafViewResolver viewResolver()
{
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setOrder(1);
return viewResolver;
}
@Bean
@Description("Spring Message Resolver")
public ResourceBundleMessageSource messageSource()
{
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
在网络配置中,如果我删除 addResourceHandlers 方法,它不会发生任何变化。我仍然可以在 localhost:8080/ 找到我的静态页面。
我尝试将这一行添加到其中:registry.addResourceHandler("/**").addResourceLocations("classpath:/templates/");
当我这样做时,我可以在 localhost:8080/mytemplate.html 访问 thymeleaf 模板。但是,它显示为静态页面。片段未翻译。 “th”标签似乎被忽略了。
我还尝试从我的 webconfig 中删除 templateResolver、viewResolver 和 templateEngine bean,因为我认为我可能正在覆盖一些自动配置。这没有任何效果。
我认为我的目录结构相当标准:
src/main/
/java/com/myproject/[code here]
/resources/static[web pages here]
/resources/templates[thymeleaf pages here]
我错过了什么?
我是现代 spring 的新手。所以我可能在做一些愚蠢的事情。 springboot 中的所有这些自动配置真的很令人沮丧,因为我不知道如何调试它正在做什么。
以下是使用静态 js/css 资源提供 thymeleaf html 的方法,只需一个简单的 spring @Controller
HTML - 百里香
homePage.html
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello App</title>
<!-- /resources/static/ folder is automatically mapped for static files -->
<script th:src="@{/js/app.js}"></script>
</head>
<body>
<h2 th:text="${msg}"></h2>
</body>
</html>
app.js:
alert("Hello Alert!")
Java 带控制器
package demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@SpringBootApplication
public class WebApp {
public static void main(String[] args) {
SpringApplication.run(WebApp.class, args);
}
}
@Controller
class CtrlA {
@GetMapping({"", "/"})
String home(Model m) {
m.addAttribute("msg", "Hello World");
return "homePage";
}
}
目录结构:
├── pom.xml
├── src
│ └── main
│ ├── java
│ │ └── demo
│ │ ├── DemoApplication.java
│ │ └── WebApp.java
│ └── resources
│ ├── application.properties
│ ├── static
│ │ └── js
│ │ └── app.js
│ └── templates
│ └── homePage.html
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>gt</groupId>
<artifactId>web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
我是 spring 5 和 spring 引导的新手。 我正在尝试使用 thymeleaf 创建一个 spring 5/spring 启动应用程序。 我想创建一个 war 而不是使用带 spring 引导的嵌入式网络服务器。
当我部署 war 时,我的应用程序启动,我可以访问 src/main/resources/static/ 中的测试 html 页面,其中 javascript 调用我的控制器。我可以在这些页面上执行到我的控制器和数据库的往返行程。
但是,当我尝试打开位于 src/main/resources/templates/testtemplate 的 thymeleaf 页面时收到 404。html
相关专家:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring5 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.3.5.RELEASE</version>
</dependency>
申请:
@SpringBootApplication(exclude = {HibernateJpaAutoConfiguration.class, DataSourceAutoConfiguration.class})
public class WarApplication extends SpringBootServletInitializer
{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
{
return application.sources(WarApplication.class);
}
public static void main(String[] args) throws Exception
{
SpringApplication.run(WarApplication.class, args);
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(DataServiceConfig.class);
servletContext.addListener(new ContextLoaderListener(rootContext));
AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
dispatcherContext.register(WebConfig.class);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
网络配置:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.myproject")
public class WebConfig implements WebMvcConfigurer
{
@Autowired
ApplicationContext ctx;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
}
@Bean
@Description("Thymeleaf Template Resolver")
public SpringResourceTemplateResolver templateResolver()
{
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver ();
templateResolver.setPrefix("/templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
return templateResolver;
}
@Bean
@Description("Thymeleaf Template Engine")
public SpringTemplateEngine templateEngine()
{
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setEnableSpringELCompiler(true);
templateEngine.setTemplateEngineMessageSource(messageSource());
return templateEngine;
}
@Bean
@Description("Thymeleaf View Resolver")
public ThymeleafViewResolver viewResolver()
{
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setOrder(1);
return viewResolver;
}
@Bean
@Description("Spring Message Resolver")
public ResourceBundleMessageSource messageSource()
{
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
在网络配置中,如果我删除 addResourceHandlers 方法,它不会发生任何变化。我仍然可以在 localhost:8080/ 找到我的静态页面。
我尝试将这一行添加到其中:registry.addResourceHandler("/**").addResourceLocations("classpath:/templates/");
当我这样做时,我可以在 localhost:8080/mytemplate.html 访问 thymeleaf 模板。但是,它显示为静态页面。片段未翻译。 “th”标签似乎被忽略了。
我还尝试从我的 webconfig 中删除 templateResolver、viewResolver 和 templateEngine bean,因为我认为我可能正在覆盖一些自动配置。这没有任何效果。
我认为我的目录结构相当标准:
src/main/
/java/com/myproject/[code here]
/resources/static[web pages here]
/resources/templates[thymeleaf pages here]
我错过了什么?
我是现代 spring 的新手。所以我可能在做一些愚蠢的事情。 springboot 中的所有这些自动配置真的很令人沮丧,因为我不知道如何调试它正在做什么。
以下是使用静态 js/css 资源提供 thymeleaf html 的方法,只需一个简单的 spring @Controller
HTML - 百里香
homePage.html
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello App</title>
<!-- /resources/static/ folder is automatically mapped for static files -->
<script th:src="@{/js/app.js}"></script>
</head>
<body>
<h2 th:text="${msg}"></h2>
</body>
</html>
app.js:
alert("Hello Alert!")
Java 带控制器
package demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@SpringBootApplication
public class WebApp {
public static void main(String[] args) {
SpringApplication.run(WebApp.class, args);
}
}
@Controller
class CtrlA {
@GetMapping({"", "/"})
String home(Model m) {
m.addAttribute("msg", "Hello World");
return "homePage";
}
}
目录结构:
├── pom.xml
├── src
│ └── main
│ ├── java
│ │ └── demo
│ │ ├── DemoApplication.java
│ │ └── WebApp.java
│ └── resources
│ ├── application.properties
│ ├── static
│ │ └── js
│ │ └── app.js
│ └── templates
│ └── homePage.html
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>gt</groupId>
<artifactId>web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>