Перейти к основному содержимому

Thymeleaf: диалект пользовательского макета

· 5 мин. чтения

1. Введение

Thymeleaf — это механизм шаблонов Java для обработки и создания HTML, XML, JavaScript, CSS и обычного текста. Чтобы познакомиться с Thymeleaf и Spring, ознакомьтесь с этой статьей .

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

Thymeleaf решает эту проблему с помощью пользовательских диалектов — вы можете создавать макеты, используя стандартную систему макетов Thymeleaf или диалект макетов, который использует шаблон декоратора для работы с файлами макетов.

В этой статье мы обсудим несколько особенностей Thymeleaf Layout Dialect , которые можно найти здесь . Чтобы быть более конкретным, мы обсудим его функции, такие как создание макетов, настраиваемых заголовков или слияние элементов заголовка.

2. Зависимости Maven

Во-первых, давайте посмотрим на необходимую конфигурацию, необходимую для интеграции Thymeleaf с Spring. В наших зависимостях требуется библиотека thymeleaf-spring :

<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>

Обратите внимание, что для проекта Spring 4 вместо тимелеаф-спринг5 необходимо использовать библиотеку тимелеаф-спринг4 . Последнюю версию зависимостей можно найти здесь .

Нам также понадобится зависимость для диалекта пользовательских макетов:

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

Последнюю версию можно найти в Maven Central Repository .

3. Конфигурация диалекта макета Thymeleaf

В этом разделе мы обсудим, как настроить Thymeleaf для использования Layout Dialect . Если вы хотите сделать шаг назад и посмотреть, как настроить Thymeleaf 3.0 в своем проекте веб-приложения, ознакомьтесь с этим руководством .

Как только мы добавим зависимость Maven как часть проекта, нам нужно будет добавить диалект макета в наш существующий механизм шаблонов Thymeleaf. Мы можем сделать это с помощью конфигурации Java:

SpringTemplateEngine engine = new SpringTemplateEngine();
engine.addDialect(new LayoutDialect());

Или с помощью конфигурации файла XML:

<bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="additionalDialects">
<set>
<bean class="nz.net.ultraq.thymeleaf.LayoutDialect"/>
</set>
</property>
</bean>

При оформлении разделов шаблонов содержимого и макета поведение по умолчанию заключается в размещении всех элементов содержимого после элементов макета.

Иногда нам нужно более разумное объединение элементов, позволяющее группировать похожие элементы вместе (скрипты js вместе, таблицы стилей вместе и т. д.).

Для этого нам нужно добавить в нашу конфигурацию стратегию сортировки — в нашем случае это будет стратегия группировки:

engine.addDialect(new LayoutDialect(new GroupingStrategy()));

или в XML:

<bean class="nz.net.ultraq.thymeleaf.LayoutDialect">
<constructor-arg ref="groupingStrategy"/>
</bean>

Стратегия по умолчанию заключается в добавлении элементов. С учетом вышеизложенного у нас все будет отсортировано и сгруппировано.

Если ни одна из стратегий нам не подходит, мы можем реализовать собственную стратегию сортировки и передать ее диалекту, как описано выше.

4. Функции процессоров пространств имен и атрибутов

После настройки мы можем начать использовать пространство имен layout и пять новых обработчиков атрибутов: decor , title-pattern , insert , replace и fragment.

Чтобы создать шаблон макета, который мы хотим использовать для наших файлов HTML, мы создали следующий файл с именем template.html :

<!DOCTYPE html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
...
</html>

Как мы видим, мы изменили пространство имен со стандартного xmlns:th="http://www.thymeleaf.org" на xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" .

Теперь мы можем начать работать с обработчиками атрибутов в наших HTML-файлах.

4.1. макет:фрагмент

Чтобы создать настраиваемые разделы в нашем макете или повторно используемые шаблоны, которые можно заменить разделами с тем же именем, мы используем атрибут фрагмента внутри нашего тела template.html :

<body>
<header>
<h1>New dialect example</h1>
</header>
<section layout:fragment="custom-content">
<p>Your page content goes here</p>
</section>
<footer>
<p>My custom footer</p>
<p layout:fragment="custom-footer">Your custom footer here</p>
</footer>
</body>

Обратите внимание, что есть два раздела, которые будут заменены нашим пользовательским HTML — контент и нижний колонтитул.

Также важно написать HTML по умолчанию, который будет использоваться, если какой-либо из фрагментов не будет найден.

4.2. макет:украсить

Следующим шагом, который нам нужно сделать, является создание HTML-файла, который будет оформлен нашим макетом:

<!DOCTYPE html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{template.html}">
<head>
<title>Layout Dialect Example</title>
</head>
<body>
<section layout:fragment="custom-content">
<p>This is a custom content that you can provide</p>
</section>
<footer>
<p layout:fragment="custom-footer">This is some footer content
that you can change</p>
</footer>
</body>
</html>

Как показано в 3-й строке, мы используем layout:decorate и указываем источник декоратора. Все фрагменты из файла макета, совпадающие с фрагментами в файле содержимого, будут заменены его пользовательской реализацией.

4.3. layout:шаблон заголовка

Учитывая, что диалект макета автоматически переопределяет заголовок макета тем, который находится в шаблоне содержимого, вы можете сохранить части заголовка, найденные в макете.

Например, мы можем создать хлебные крошки или сохранить название веб-сайта в заголовке страницы. В этом случае на помощь приходит процессор layout:title-pattern . Все, что вам нужно указать в файле макета, это:

<title layout:title-pattern="$LAYOUT_TITLE - $CONTENT_TITLE">ForEach</title>

Таким образом, окончательный результат для файла макета и содержимого, представленного в предыдущем пункте, будет выглядеть так:

<title>ForEach - Layout Dialect Example</title>

4.4. макет: вставить/макет: заменить

Первый обработчик, layout:insert , похож на оригинальный th:insert Thymeleaf , но позволяет передавать целые фрагменты HTML во вставленный шаблон. Это очень полезно, если у вас есть некоторый HTML-код, который вы хотите использовать повторно, но содержимое которого слишком сложно для определения или создания только с помощью переменных контекста.

Второй, layout:replace , похож на первый, но с поведением th:replace , который фактически заменит тег хоста кодом определенного фрагмента.

5. Вывод

В этой статье мы описали несколько способов реализации макетов в Thymeleaf.

Обратите внимание, что в примерах используется Thymeleaf версии 3.0; если вы хотите узнать, как перенести свой проект, следуйте этой процедуре .

Полную реализацию этого туториала можно найти в проекте GitHub .

Как проверить? Мы предлагаем сначала поиграть с браузером, а затем также проверить существующие тесты JUnit.

Помните, что вы можете создавать макеты, используя вышеупомянутый диалект макета , или вы можете легко создать свое собственное решение. Надеюсь, эта статья даст вам больше информации по этой теме, и вы найдете предпочтительный подход в зависимости от ваших потребностей.