Вступление
Вопрос о повторном использовании верхнего и нижнего колонтитула во всех шаблонах 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> < 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, являются их собственными. |