提问者:小点点

Thymeleaf未加载模板


我正在使用Spring和Thymeleaf。多亏了xerx593,我能够让它工作,所以我更新了这个问题以显示工作代码。

这是我的申请课

package com.propfinancing.www;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import nz.net.ultraq.thymeleaf.layoutdialect.LayoutDialect;

@Controller
@SpringBootApplication
public class PfWebApplication extends SpringBootServletInitializer {

  public static void main(String[] args) {
    SpringApplication.run(PfWebApplication.class, args);
  }
  
  @Bean
  public LayoutDialect layoutDialect() {
    return new LayoutDialect();
  }

  @GetMapping("/page1.html")
  public String page1() {
    return "page1";
  }
}

接下来,我在src/main/Resources/template/layout. html中创建一个布局.html文件

<!DOCTYPE html>
<html lang="en" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">

<body>
    This is the layout template
    <div layout:fragment="content">
        <p>This is were the content will go</p>
    </div>
</body>

</html>

最后,我创建了 /ser/main/resources/templates/page1.html来使用模板:

<!DOCTYPE html>
<html lang="en" 
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{layout}">
      
<body>      
  <div layout:fragment="content">
    This is the content of page 1.
  </div>
</body>

</html>      

当我http://dev.propfinancing.com/www/page1.html时,它会给我期望的模板驱动输出。

谢谢尼尔


共2个答案

匿名用户

最明显的错误:

>

  • <区块引用>

    我在我的src/main/Resources/sight目录中创建了一个名为page1. html的简单html页面

    (这非常适合(spring-web)静态内容,但是…)

    最后,我更新了我的page1. html以使用模板…

    更新是不够的,你还必须将它移动到一个配置好的模板位置!所以将文件移动到src/main/资源/模板/(默认位置,发出相同的浏览器请求,)将有希望/可能产生所需的结果(,或者至少抛出异常)。

    简而言之:src/main/资源/静态目录不适用于模板!(它仍然可以配置,但这将是非常奇怪的/hacky/一堆充满“副作用”!?)。

    好吧,404,可以(简单地)修复:

    @Controller // !
    @SpringBootApplication
    public class ThymeleafTestApplication {
    
      public static void main(String[] args) {
        SpringApplication.run(ThymeleafTestApplication.class, args);
      }
    
      @GetMapping("/page1.html") // !!
      public String page1() {
        return "page1"; // returning the view name
      }
    // ...
    }
    

    即通过为这个“视图”提供一个“控制器”。

    或通过配置:

    @SpringBootApplication
    public class PfWebApplication // extends ... 
       implements WebMvcConfigurer {
    
      @Override
      public void addViewControllers (ViewControllerRegistry registry) {
          ViewControllerRegistration r = registry.addViewController("/page1.html");
          r.setViewName("page1");
          // r.set...
      }
    ...
    

    一件重要的事情是:

      @Bean
      public LayoutDialect layoutDialect() { 
        return new LayoutDialect();
      }
    

    是“自动配置”方法,它为我们配备了“所有的Spring(引导)魔法”。

    鉴于:

      @Bean
      public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.addDialect(new LayoutDialect());
        return templateEngine;
      }
    

    …是“DIY”的方法,我们必须调整(就像spring-boot那样)。

    链接:

    • https://ultraq.github.io/thymeleaf-layout-dialect/
    • https://docs.spring.io/spring-boot/docs/current/reference/html/web.html#web
    • https://www.thymeleaf.org/doc/articles/layouts.html

  • 匿名用户

    在我的例子中,问题在于装饰器的使用,我通过简单地将装饰器更改为装饰来解决这个问题

    在这里,当我使用装饰器使用Thymeleaf配置创建的模板时出错

    <html xmlns:th="http://www.thymeleaf.org"
        xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
        layout:decorator="template1">