Статьи

Spring Boot: декоратор шаблона Thymeleaf с использованием диалекта макета Thymeleaf

Вступление

Вопрос о повторном использовании верхнего и нижнего колонтитула во всех шаблонах Thymeleaf часто задавался в StackOverflow. В этой статье я покажу вам, как вы можете структурировать шаблоны с помощью диалекта макета Thymeleaf для достижения более высокого повторного использования кода в приложении Spring Boot.

Создать приложение Spring Boot

Давайте использовать Spring Initializer для создания пустого проекта с необходимыми зависимостями. Я выбрал следующее для пустого проекта:

Как только вы загрузите проект в вашей любимой IDE, просто обновите thymeleaf и thymeleaf-layout-dialect в pom.xml « pom.xml » вашего проекта:

1
2
<thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
<thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>

Примечание. В этом примере я использовал Spring Boot 1.5.8.RELEASE. Как только будет выпущена стабильная версия 2.0, я обновлю статью соответствующим образом.

Определение базового шаблона

Если мы используем Spring Boot, нам не нужно ничего настраивать для использования Thymeleaf и Thymeleaf Layout Dialect. Поддержка автоконфигурации настроит все необходимые компоненты для использования шаблонов Thymeleaf.

Давайте создадим base.html в base.html src\main\resources\templates :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!DOCTYPE html>
  xmlns:th="http://www.thymeleaf.org"  
  <head>
 
    <title layout:title-pattern="$CONTENT_TITLE - $LAYOUT_TITLE">Base</title>
    <meta name="description" content=""/>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 
    <link rel="stylesheet" type="text/css"
  </head>
  <body>
 
    <nav class="navbar navbar-light bg-light">
      <span class="navbar-brand mb-0 h1">Decorator Sample</span>
    </nav>
 
    <div class="container">
      <nav aria-label="breadcrumb" role="navigation">
        <ol class="breadcrumb">
          <th:block layout:fragment="breadcrumb">
          </th:block>
        </ol>
      </nav>
      <div class="content">
        <div layout:fragment="page_content"></div>
      </div>
    </div>
    <!-- /.container -->
 
    </script>
    </script>
    <th:block layout:fragment="scripts">
    </th:block>
  </body>
 
</html>

В приведенном выше base.html вы можете видеть три заполнителя:
— Панировочные сухари
— Содержание
— Javascript требуется для содержания

Остальные шаблоны Thymeleaf оформляются с использованием base.html и предоставляют необходимые данные только для трех заполнителей, которые рассматриваются в последующих разделах. Заголовок страницы определяется как layout:title-pattern="$CONTENT_TITLE - $LAYOUT_TITLE" что означает, что если какой-либо шаблон объявляет тег My Page тогда заголовок страницы становится Base - My Page .

Контент для хлебных крошек

Любая страница, которая желает оформить себя с помощью base.html должна объявить в своем HTML, как показано ниже:

1
2
3
4
5
6
<!DOCTYPE html>
  layout:decorate="~{base}">
</html>

Атрибут layout:decorate определяет местоположение базового шаблона относительно корневой папки шаблонов. В нашем случае корневой папкой шаблонов является src/main/resources/templates .

Мы можем предоставить контент для breadcrumb , написав приведенный ниже HTML где-то между «:

1
2
3
<th:block layout:fragment="breadcrumb">
  <li class="breadcrumb-item">Page 1</li>
</th:block>

В идеале следование порядку, в котором layout:fragment определен в базовом шаблоне, поможет поддерживать согласованность в порядке содержимого на страницах. Последний HTML-код, сгенерированный Thymeleaf и его диалектом макета:

1
2
3
4
5
<nav aria-label="breadcrumb" role="navigation">
  <ol class="breadcrumb">
    <li class="breadcrumb-item">Page 1</li>
  </ol>
</nav>

page_content

В аналогичных строках содержимое для page_content будет:

1
2
3
4
5
6
7
8
<div layout:fragment="page_content" id="page_content">
  <h3>Page 1</h3>
 
  <div class="alert alert-info" style="display: none;"
    id="js-content">
  </div>
  <a th:href="@{/page2}">Go to page 2</a>
</div>

Использование <th></th> избавит от необходимости использовать фиктивный тег только для переноса содержимого. Если нам нужно обернуть содержимое в определенный элемент, как мы использовали <div> выше, <th></th> должен быть заменен конкретным элементом.

Заполнение scripts

Мало кто может усомниться в необходимости scripts заполнителей. Это позволяет нам хранить связанный со страницей javascript в одном месте и не загрязнять весь javascript в базовом шаблоне.

1
2
3
4
5
6
7
<th:block layout:fragment="scripts">
<script type="text/javascript">
$(function(){
  $("#js-content").html("From Javascript").slideToggle();
});
</script>
</th:block>

Вы даже можете создать специальный файл .js и связать его в разделе scripts :

1
2
3
4
5
<th:block layout:fragment="scripts">
<script type="text/javascript"
  src="@{/path/to/js/file}">
</script>
</th:block>

Вывод

В этой статье мы увидели, как использовать Thymeleaf Layout Dialect для украшения шаблонов с помощью общего базового шаблона. Нам не нужно было выполнять какую-либо настройку, так как Spring Boot делает это через автоконфигурацию, когда соответствующие библиотеки находятся на его пути к классам, которые в этом случае являются зависимостями, spring-boot-starter-thymeleaf стартовым pom spring-boot-starter-thymeleaf

Рабочий образец Spring Boot можно найти здесь .

Опубликовано на Java Code Geeks с разрешения Мохамеда Санауллы, партнера нашей программы JCG . См. Оригинальную статью здесь: Spring Boot: декоратор шаблона Thymeleaf с использованием диалекта макета Thymeleaf

Мнения, высказанные участниками Java Code Geeks, являются их собственными.