【问题标题】:Thymeleaf layout with multiple contents具有多个内容的 Thymeleaf 布局
【发布时间】:2016-10-27 16:22:12
【问题描述】:

我是 Thymeleaf 模板引擎的新手,我正在使用 Spring Boot 和 Spring MVC 制作应用程序。我正在使用 application.properties 进行配置。

我想知道如何只写 ONE 布局但许多文件中的内容:例如content1.html、content2.html 等并使用已经有标题的布局,页脚。

如果可能,我如何从控制器发送将在布局中替换的内容文件?

【问题讨论】:

    标签: layout spring-boot thymeleaf


    【解决方案1】:

    你可以做这样的事情。假设您创建了一个嵌入所有其他内容的页面 - main.html。它看起来像这样:

    <!doctype html>
    <html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3" xmlns="http://www.w3.org/1999/xhtml">
    
    <div th:fragment="mainPage(page, fragment)">
        <h4>Some header</h4>
        <div th:include="${page} :: ${fragment}"></div>
        <h4>Some footer</h4>
    </div>
    </html>
    

    然后您想创建一些页面,该页面将嵌入您的main.html 页面 - some-page.html:

    <!doctype html>
    <html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3" xmlns="http://www.w3.org/1999/xhtml">
    <div th:fragment="somePage">
        <h1>${title}</h1>
    </div>
    </html>
    

    目标是将main.html 中的&lt;div th:include="${page} :: ${fragment}"&gt;&lt;/div&gt; 替换为some-page.html 中的内容。在控制器中,这将如下所示:

    @Controller
    public class DemoController {
    
        @RequestMapping
        public String somePage(Model model) {
            // Note that you can easy pass parameters to your "somePage" fragment
            model.addAttribute("title", "Woa this works!");
            return "main :: mainPage(page='some-page', fragment='somePage')";
        }
    }
    

    你去吧!每次当你想交换main.html中的内容时,你只需在你的控制器中更改字符串中的page和fragment参数。

    【讨论】:

    • 感谢您的回答@Branislav,但是当控制器的操作返回某些内容时,容器会搜索具有相同名称的视图返回!它永远不会找到像“main :: ....”这样的东西。
    • @MohamedRedaArherbi 你试过了吗?我试过了,哦,是的,它会的。您可以从控制器方法返回片段名称表达式。 “main :: mainPage(...)”绝对是合法的。它将从main.html 文件返回mainPage 片段。
    • 确实有一些进展,接近解决了,但是这个方法的问题是,当控制器返回视图时,它会删除主页中之前的所有代码(html标签,head标签,所有 css ...)
    • @MohamedRedaArherbi 只需在 mainPage 片段中包含 CSS、JS 和其他标签。 IE。您可以创建 header 片段,其中将包含所有 CSS 内容:)
    • 哦,是的,它现在工作了,之后我将th:fragment="mainPage(page, fragment)" 放在标签&lt;html ....&gt; 中,所以我现在有了&lt;html xmlns:th="http://www.thymeleaf.org" th:fragment="mainPage(page, fragment)"&gt; 但我只有一个问题:如果我在我的主页中有其他片段,如页眉和页脚,每次调用后都会重新加载它们?
    猜你喜欢
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    相关资源
    最近更新 更多