【问题标题】:How to use Thymeleaf to include html file into another html file如何使用 Thymeleaf 将 html 文件包含到另一个 html 文件中
【发布时间】:2018-03-02 00:47:21
【问题描述】:

我一直在查看有关如何使用 Thymeleaf 的 th:insert 将 html 文件包含到另一个 html 文件中的所有可用资源。我想知道是否有人能告诉我我做错了什么,因为我觉得这个 html 看起来和我看到的例子一模一样。

我的 index.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.thymeleaf.org ">
<head>
    <title>Default Page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <div th:insert="templates/Navbar :: navbar">  </div>
</body>
</html>

我的导航栏.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.thymeleaf.org ">
<head>
    <meta charset="UTF-8"/>
    <title>NavigationBar</title>
    <link rel="stylesheet" type="text/css" media="all" href="../../css/NavBar.css" th:href="@{/css/NavBar.css}" />
</head>
<body>
    <div>
        <div th:fragment="navbar" class="navbar">
            <div class="navbar-inner">
                <a th:href="@{/}" href="/home"> Home</a>
                <a th:href="@{/}" href="/help">Help</a>
            </div>
        </div>
    </div>
</body>
</html>

另外,这是我的项目的资源层次结构(通过屏幕截图)

如果我将 之间的代码放入 index.html 并链接 css 文件,导航栏就会显示并正常工作。所以,我不确定为什么插入不起作用。这是我根据以下示例编辑的配置文件:

@Configuration
public class WebPageControllerConfig {

    private SpringTemplateEngine templateEngine;
    private ServletContextTemplateResolver templateResolver;

    @Value("${WebController.startHour}")
    public String startHour;

    @Value("${WebController.endHour}")
    public String endHour;

    @Value("${WebController.numOfSkus}")
    public int numOfSkus;

    @Value("${WebController.skusToQuery}")
    public File skusToQuery;

    @Bean
    public ClassLoaderTemplateResolver webPageTemplateResolver(){
        ClassLoaderTemplateResolver webPageTemplateResolver = new ClassLoaderTemplateResolver();
        webPageTemplateResolver.setPrefix("templates/");
        webPageTemplateResolver.setSuffix(".html");
        webPageTemplateResolver.setTemplateMode("HTML5");
        webPageTemplateResolver.setCharacterEncoding(CharEncoding.UTF_8);
        webPageTemplateResolver.setOrder(1);
        return webPageTemplateResolver;
    }

    /* Old way of trying to configure
    @Bean
    public MessageSource messageSource() {...}

    @Bean
    public ServletContextTemplateResolver setTemplateResolver(){...}

    @Bean
    public SpringTemplateEngine setTemplateEngine() {...}

    @Bean
    public ViewResolver viewResolver() {...}
    End of old configuration       */

    public String getStartHour() {return startHour;}

    public String getendHour() {return endHour;}

    public Object getnumOfSkus() {return numOfSkus;}

    public File getSkusToQuery(){return skusToQuery;}
}

【问题讨论】:

  • 它是th:fragment。不是th:fragments。此外,您必须使用正确的路径。现在你假设你的 html 文件在同一个目录中,但它们不是。
  • 谢谢!所以,我尝试了下面的答案,但没有奏效。然后,基于没有正确的路径,我将 th:insert="../templates/navbar :: navbar" 更改为使用正确的路径。这也没有奏效。还有什么提示吗?

标签: java html spring-mvc thymeleaf


【解决方案1】:

改成

th:insert="templates/Navbar :: navbar"

th:fragment="navbar"

配置示例:

import org.apache.commons.lang3.CharEncoding;
import org.springframework.context.annotation.*;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;

@Configuration
public class ThymeleafConfiguration {

    @Bean
    @Description("Thymeleaf template resolver serving HTML 5 emails")
    public ClassLoaderTemplateResolver emailTemplateResolver() {
        ClassLoaderTemplateResolver emailTemplateResolver = new ClassLoaderTemplateResolver();
        emailTemplateResolver.setPrefix("root folder where all thymeleaf files/");
        emailTemplateResolver.setSuffix(".html");
        emailTemplateResolver.setTemplateMode("HTML5");
        emailTemplateResolver.setCharacterEncoding(CharEncoding.UTF_8);
        emailTemplateResolver.setOrder(1);
        return emailTemplateResolver;
    }
}

【讨论】:

  • 所以,我尝试了这个,但没有成功。你是不是也暗示要取出class='"navbar"?
  • 另外,我的 NavBar.html 文件有一个大写 N,它应该是 templates/Narbar :: navbar 吗?
  • 我想,是的。如果这仍然不起作用,请检查您的百里香后缀/前缀设置。
  • 抱歉我的无知,如何设置 Thymeleaf 设置。我在教程文档中看到它谈到了模板解析器,他们使用 templateResolver.setPrefix 和 templateResolver.setSuffix,但我不知道在哪里设置这些。在我的控制器类中?
  • 有不同的方法。它可以是@Configuration 类或属性。例如,stackoverflow.com/questions/29479403/…
【解决方案2】:

尝试:

th:replace="/navbar::navbar"

th:insert="/navbar::navbar"

它对我有用。无需指定"template/navbar"

【讨论】:

    猜你喜欢
    • 2011-11-24
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2019-01-02
    • 2012-02-17
    相关资源
    最近更新 更多