当前位置: 首页 > 知识库问答 >
问题:

spring boot无法解析thymeleaf模板

闻人浩波
2023-03-14

我不熟悉Spring5和SpringBoot。我试图用thymeleaf创建一个Spring5/spring启动应用程序。我想创建一个war,而不是使用带有spring boot的嵌入式Web服务器。

当我部署war时,我的应用程序启动,我可以访问src/main/resources/static/中的测试html页面,其中包含调用我的控制器的javascript。我可以在这些页面上执行到控制器和数据库的往返。

但是,当我尝试打开位于src/main/资源/模板/testtemplate.html的thymeleaf页面时,我会得到404

相关专家:

   <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;
        }

在web配置中,如果我删除addResourceHandler方法,它不会改变任何内容。我仍然可以在localhost:8080/.找到我的静态页面,我试着向它添加了这一行:registry.addResourceHandler("/**").addResourceLocations("classpath:/tem板/");

当我这样做的时候,我可以在localhost:8080/mytemplate.html.访问thymeleaf模板。这些片段没有翻译。“th”标签似乎被忽略。

我还尝试从我的网络配置中删除templateResolver、viewResolver和templateEngine bean,因为我认为可能是覆盖了一些自动配置。这没有任何效果。

我相信我的目录结构是相当标准的:

src/main/
       /java/com/myproject/[code here]
       /resources/static[web pages here]
       /resources/templates[thymeleaf pages here]

我错过了什么?
我对现代Spring完全是个新手。所以我可能在做些傻事。springboot中的所有这些自动配置都让人非常沮丧,因为我不知道如何调试它在做什么。

共有1个答案

法风畔
2023-03-14

下面是如何通过一个简单的Spring@Controller为thymeleaf html提供静态js/css资源的方法。

超文本标记语言-与thymeleaf

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>

 类似资料:
  • 我想在HTML中显示一个请求的对象,我得到了一个错误,我不知道是什么原因导致了我的错误。谷歌帮不上忙,现在我试着问你。我认为错误不是来自我的表,因为我把它注释掉了,错误仍然是Occour。该错误也不是来自“http://localhost:8081/simulation”,因为我使用有效值重新接收了一个有效的JSON。谢谢你的帮助:)。 下面是我的代码: 我通过调用“http://localhos

  • 我的问题是我未能显示胸腺叶模板。我怀疑配置错误,但我似乎找不到它。提前感谢:) 波姆。xml: 模板在: Spring配置: 控制器: 我正在尝试访问:并获得404。 另一件事,有人能解释(或给文档一个链接)哪个servlet被用来“返回”模板html吗?是Spring调度员servlet吗? 好的,所以我忘记了,谢谢@Benjamin c.然而,添加它会产生:

  • 本文向大家介绍SpringBoot使用thymeleaf模板过程解析,包括了SpringBoot使用thymeleaf模板过程解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了SpringBoot使用thymeleaf模板过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.导入依赖 2.application.yml文件中新

  • 本文向大家介绍SpringBoot thymeleaf的使用方法解析,包括了SpringBoot thymeleaf的使用方法解析的使用技巧和注意事项,需要的朋友参考一下 1.pom.xml添加相应依赖 2.application.properties 3.common.xml文件,注意文件路径 4.添加TemplateController.java 5.添加app.java 6.访问路径,完成

  • 本文向大家介绍springboot中thymeleaf模板使用详解,包括了springboot中thymeleaf模板使用详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章将更加全面详细的介绍thymeleaf的使用。thymeleaf 是新一代的模板引擎,在spring4.0中推荐使用thymeleaf来做前端模版引擎。 thymeleaf介绍 简单说, Thymeleaf 是一个跟 Vel

  • 下面是index.html 它们在不同的文件夹中,但pathing应该工作,除非我只是错过了一些真正愚蠢的东西。