39

初めて Thymeleaf を使用していますが、テンプレートについて明確にする必要があります。ドキュメントを正しく理解していれば、テンプレート (またはその一部) を自分のページに含めることができます。たとえば、次のように書くことができます。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
    <head th:include="template/layout :: header">
    </head>
    <body>
        Hello world
        <div th:include="template/layout :: footer"></div>
    </body>
</html>

しかし、実際には、テンプレートの逆の使用方法が必要です。ページにテンプレートフラグメントを含める代わりに、テンプレート内にページを含めたい、そのようなもの:

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    ...
</head>
<body>

    <div id="my-template-header">...</div>

    <div id="the-content">
        <!-- include here the content of the current page visited by the user -->
        ???
    </div>

    <div id="my-template-footer">...</div>
</body>

つまり、 Thymeleaf でSitemesh デコレータ タグに相当するものを作成する方法はありますか?

ありがとう

4

4 に答える 4

67

Thymeleaf 2.1 では、次のように記述できます。

テンプレートを作成し (例: templates/layout.html)、html タグにth:fragment="page"情報を追加し、コンテンツ領域をth:include="this :: content"情報で定義します。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org"
      th:fragment="page">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Test</title>
    </head>
    <body>
        layout page
        <div th:include="this :: content"/>
        layout footer
    </body>
</html>

次に、このテンプレートを含むページを作成し、html タグにth:include="templates/layout :: page"を追加して、メイン コンテンツをth:fragment="content"を使用して div 内に配置します。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org"
      th:include="templates/layout :: page">
    <head>
        <title></title>
    </head>
    <body>
        <div th:fragment="content">
            my page content
        </div>
    </body>
</html>

レイアウト ページでは、これを使用する(th:include="this :: content") か、このオプションを抑制する (th:include=":: content") ことができます。私が思うjsf faceletsのようです。

于 2013-12-08T02:33:31.357 に答える
1

あなたが必要

<dependency>
    <groupId>nz.net.ultraq.thymeleaf</groupId>
    <artifactId>thymeleaf-layout-dialect</artifactId>
    <version>1.2.2</version>
</dependency>

これを SpringTemplateEngine に追加します。

@Bean
@Description("Thymeleaf template engine with Spring integration")
public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(templateResolver());
    templateEngine.addDialect(new LayoutDialect());

    return templateEngine;
}

ビューフォルダーにテンプレートという名前のフォルダーを作成する場合。

ビュー/home.html

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
  layout:decorator="template/layout">
 <body>
  <div layout:fragment="content">
    Hello world
  </div>
 </body>
</html>

ビュー/レイアウト/layout.html

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:th="http://www.thymeleaf.org"
        xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
    <head>
      </head>
        <body>
          <div id="content" layout:fragment="content">
          </div>
</body>
</html>
于 2014-03-29T02:04:38.053 に答える
0

私の知る限り、あなたはできません。ViewResolver考えられる解決策は、常にファイルに転送するを作成することdecoratorですが、同時に、Model含めたいフラグメントへの実際のパスを持つ属性を配置することです。

于 2013-09-19T14:13:24.863 に答える