【问题标题】:Thymeleaf: Error Resolving TemplateThymeleaf:错误解决模板
【发布时间】:2015-06-01 20:25:44
【问题描述】:

我正在尝试将布局/模板与 Thymeleaf 一起使用,但出现以下异常。

异常处理模板“user/index”:解析模板“/layouts/default.html”时出错,模板可能不存在或可能无法被任何已配置的模板解析器访问

这是我的 ThymeleafConfig.java

@Configuration
public class ThymeleafConfig {

    @Bean
    public ServletContextTemplateResolver templateResolver() {
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML5");
        resolver.setOrder(1);
        return resolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        engine.addDialect(new LayoutDialect());
        engine.addDialect(new SpringSecurityDialect());
        engine.addDialect(new SpringStandardDialect());
        return engine;
    }

    @Bean
    public ThymeleafViewResolver thymeleafViewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        return resolver;
    }
}

我有以下文件夹结构

webapp/
..WEB-INF/
....views/
......layouts/
........default.html
......user
........index.html

这是我的 default.html,这是我的主要布局。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Default</title>
    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>

    <header>
        This is a header from default.html
    </header>

    <section layout:fragment="content">
        <p>Content should go here!</p>
    </section>

    <footer>
        Footer from default
        <p layout:fragment="custom-footer">Custom footer here!</p>
    </footer>

    <!-- scripts -->
    <script src="https://code.jquery.com/jquery-2.1.3.min.js" />
    <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>

</body>
</html>

这里是 index.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorator="layouts/default.html">
<head>
    <title>Users</title>
</head>
<body>
<section layout:fragment="content">
    <p>This is a paragraph from content page 1</p>
</section>
<footer>
    <p layout:fragment="custom-footer">This is some footer content from content page 1</p>
</footer>
</body>
</html>

它们位于不同的文件夹中,但路径应该可以工作,除非我只是错过了一些非常愚蠢的东西。

【问题讨论】:

    标签: java thymeleaf


    【解决方案1】:

    我发现了我的问题。如果您在 Thymeleaf 配置中指定后缀,则不需要 .html 扩展名。

    @Bean
    public ServletContextTemplateResolver templateResolver() {
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".html"); // here
        resolver.setTemplateMode("HTML5");
        resolver.setOrder(1);
        return resolver;
    }
    

    应该是:

    layout:decorator="layouts/default"
    

    代替:

    layout:decorator="layouts/default.html"
    

    我猜它实际上是在寻找 layouts/default.html.html 这将是一个问题。

    【讨论】:

      【解决方案2】:

      我通过以下代码解决了这个问题:

      @Configuration
      public class ThymeleafConfig{
      
      @Bean
      public SpringTemplateEngine springTemplateEngine()
      {
          SpringTemplateEngine templateEngine = new SpringTemplateEngine();
          templateEngine.addTemplateResolver(htmlTemplateResolver());
          return templateEngine;
      }
      
      @Bean
      public SpringResourceTemplateResolver htmlTemplateResolver()
      {
          SpringResourceTemplateResolver emailTemplateResolver = new SpringResourceTemplateResolver();
          emailTemplateResolver.setPrefix("classpath:/templates/");
          emailTemplateResolver.setSuffix(".html");
          emailTemplateResolver.setTemplateMode(StandardTemplateModeHandlers.HTML5.getTemplateModeName());
          emailTemplateResolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
          return emailTemplateResolver;
      }
      

      }

      诀窍是添加:emailTemplateResolver.setPrefix("classpath:/templates/");

      【讨论】:

        【解决方案3】:

        你不应该提供扩展名。你必须提供这样的正确路径

        layout:decorator="../layouts/default"

        【讨论】:

        猜你喜欢
        • 2015-04-26
        • 2018-11-30
        • 1970-01-01
        • 1970-01-01
        • 2016-12-21
        • 2021-11-05
        • 1970-01-01
        • 2014-08-26
        • 1970-01-01
        相关资源
        最近更新 更多