如何使用 Thymeleaf 将 html 文件包含到另一个 html 文件中

Posted

技术标签:

【中文标题】如何使用 Thymeleaf 将 html 文件包含到另一个 html 文件中【英文标题】:How to use Thymeleaf to include html file into another html file 【发布时间】: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" 更改为使用正确的路径。这也没有奏效。还有什么提示吗? 【参考方案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 类或属性。例如,***.com/questions/29479403/…。【参考方案2】:

尝试:

th:replace="/navbar::navbar"

th:insert="/navbar::navbar"

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

【讨论】:

以上是关于如何使用 Thymeleaf 将 html 文件包含到另一个 html 文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 thymeleaf 格式化 HTML 中的数字字符串

spring boot使用thymeleaf

Spring Thymeleaf 如何使用 select 和 option html 标签将特定值保存在数据库中

如何使用事件更新 Thymeleaf

如何将布局方言添加到spring-boot thymeleaf自动配置文件

如何在我的 javascript 文件中使用来自 message.properties 的 Thymeleaf 消息?