0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

layout:decorateが反映されない【書籍 はじめてのSpring Boot】

Posted at

##環境

Thymeleaf 3.0
Spring Boot 2.4.2
Mac OS Big Sur
Maven

##状況

以下のコードのようにlayout:flagmentとlayout:decorateを用いてテンプレートを取り込もうとしていた。

ディレクトリ構造

|-template
    |
    |-- customers
    |      |
    |      |-- edit.html
    |      |-- list.html
    |
    |-- commons
           |
           |-- layout.html

layout.html(テンプレート部分)


<!DOCTYPE html>
<html  xmlns="http://www.w3.org/1999/xhtml"
	   xmlns:th="http://www.thymeleaf.org"
       xmlns:layout="http://www.ultraq.net.nz/web/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">
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
  <title>layout</title>
</head>
<body>
  <div class="container">
    <h1 class="text-center text-primary mt-5">顧客管理システム</h1>
    <div>
    </div>
    <div layout:fragment="content">
      Fake Content
    </div>
  </div>
</body>
</html>

list.html (フラグメント部分)

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org/" xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"
  layout:decorate ="~{/commons/layout}">

<head>
  <title>顧客一覧</title>
</head>

<body>
  <div layout:fragment="content" class="col-sm-12">
    <form th:action="@{/customers/create}" th:object="${customerForm}" method="POST">
      <dl>
        <dt><label for="lastName"></label></dt>
        <dd>
          <input type="text" id="lastName" name="lastName" th:field="*{lastName}" th:errorclass="error-input"
            value="山田" />
          <span th:if="${#fields.hasErrors('lastName')}" th:errors="*{lastName}" class="error-messages">error!</span>
        </dd>
      </dl>
      <dl>
        <dt><label for="firstName"></label></dt>
        <dd>
          <input type="text" id="firstName" name="firstName" th:field="*{firstName}" th:errorclass="error-input"
            value="太郎" />
          <span th:if="${#fields.hasErrors('firstName')}" th:errors="*{firstName}" class="error-messages">error!</span>
        </dd>
      </dl>
      <input type="submit" value="作成">
    </form>
    <table>
      <tr th:each="customer : ${customers}">
        <td th:text="${customer.id}">100</td>
        <td th:text="${customer.lastName}">山田</td>
        <td th:text="${customer.firstName}">太郎</td>
        <td>
          <form th:action="@{/customers/edit}" method="GET">
            <input type="submit" name="form" value="編集">
            <input type="hidden" name="id" th:value="${customer.id}" />
          </form>
        </td>
        <td>
          <form th:action="@{/customers/delete}" method="POST">
            <input type="submit" value="削除">
            <input type="hidden" name="id" th:value="${customer.id}" />
          </form>
        </td>
      </tr>
    </table>
  </div>
</body>

</html>

list.htmlの冒頭に**layout:decorate ="~{/commons/layout}"**を記述することでフラグメントとして導入されるテンプレートファイルを指定することができる。

しかし、このlayout:deocorateを書籍通り記述するもフラグメントとして組み込まれない。

##pom.xmlに追記

layout:decorateが機能しない理由はdecorateが依存関係に追加されていないから。
どうやらみなさんがよく使うであろう「spring-boot-starter-thymeleaf」にはdocorate機能がない。
だからdocorateを依存関係に追加するためpom.xmlに以下のコードを追記する。

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

これで正しく反映されます!

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?