Открыть сервис

Thymeleaf

Thymeleaf — это серверный Java-шаблонизатор для веб-приложений, предназначенный для обработки HTML, XML, JavaScript, CSS и текстовых файлов. Основная особенность Thymeleaf заключается в том, что он позволяет создавать шаблоны, которые могут корректно отображаться как в браузере (в виде статического прототипа), так и на сервере после обработки динамических данных. Это достигается за счёт использования специальных атрибутов HTML, которые игнорируются браузером, но обрабатываются сервером. Thymeleaf является частью экосистемы Spring Framework (в частности, Spring Boot) и часто используется как альтернатива JSP (JavaServer Pages) и другим шаблонизаторам.

История

Проект Thymeleaf был создан в 2011 году французским разработчиком Даниэлем Фернандесом (Daniel Fernández) как открытая библиотека с лицензией Apache 2.0. Основной мотивацией для создания стало желание предложить шаблонизатор, который не требует от разработчиков знания специфических тегов (как в JSP) и позволяет дизайнерам и верстальщикам работать с шаблонами, не понимая Java-кода. Первая стабильная версия (1.0) вышла в 2012 году. Широкое распространение Thymeleaf получил после интеграции с Spring Boot, который сделал его шаблонизатором по умолчанию для веб-приложений. В 2014 году проект перешёл под управление организации The Eclipse Foundation (с 2017 года — Eclipse Thymeleaf). По состоянию на 2024 год актуальной является версия 3.1.x, которая включает поддержку Java 8+, Spring 6 и Spring Boot 3.

Архитектура и принципы работы

Thymeleaf работает на стороне сервера. Он обрабатывает шаблоны (обычно файлы с расширением .html), заменяя в них специальные атрибуты и выражения на данные, переданные из Java-контроллера. Процесс обработки состоит из нескольких этапов:

  1. Загрузка шаблона: Шаблон читается из файловой системы, classpath или из кэша.
  2. Парсинг: Шаблон разбирается на дерево узлов (DOM-подобная структура). Thymeleaf использует собственную реализацию парсера, не зависящую от стандартного DOM-парсера браузера.
  3. Вычисление выражений: В узлах, содержащих атрибуты Thymeleaf (например, th:text, th:if), вычисляются выражения на языке OGNL (Object-Graph Navigation Language) или Spring Expression Language (SpEL).
  4. Обработка атрибутов: Каждый атрибут Thymeleaf выполняет определённое действие: вставка текста, итерация по коллекции, условное отображение, включение фрагментов и т.д.
  5. Генерация вывода: Результирующее дерево преобразуется в строку (обычно HTML-код) и отправляется клиенту.

Режимы работы шаблонов

Thymeleaf поддерживает несколько режимов (template modes), определяющих тип обрабатываемого контента:

  • HTML: основной режим для веб-страниц. Позволяет использовать все стандартные атрибуты Thymeleaf.
  • XML: для обработки XML-документов.
  • TEXT: для обработки неструктурированных текстовых файлов (например, электронных писем, JSON, CSV).
  • JAVASCRIPT: для обработки JavaScript-файлов, что позволяет генерировать динамический JS-код на сервере.
  • CSS: для обработки CSS-файлов.

Стандартный диалект и атрибуты

Основной набор функциональности Thymeleaf предоставляется через стандартный диалект (Standard Dialect). Он включает в себя множество атрибутов, которые добавляются к HTML-тегам. Все атрибуты имеют префикс th:. Наиболее часто используемые атрибуты:

  • th:text: Заменяет текстовое содержимое элемента на вычисленное значение. Например: <p th:text="${user.name}">Имя пользователя</p>. В браузере этот код отобразится как «Имя пользователя», а на сервере будет заменено на фактическое имя.
  • th:utext: Аналогичен th:text, но не экранирует HTML-сущности, позволяя вставлять HTML-разметку.
  • th:each: Организует цикл по коллекции. Например: <tr th:each="item : ${items}"> создаст строку таблицы для каждого элемента списка.
  • th:if, th:unless: Условное отображение элемента. Элемент будет отображён только если условие истинно (th:if) или ложно (th:unless).
  • th:switch, th:case: Реализация конструкции switch-case.
  • th:object: Устанавливает объект для использования вложенных выражений. Например: <div th:object="${user}"> позволяет внутри блока обращаться к полям объекта без префикса: <p th:text="*{name}">.
  • th:action: Заменяет атрибут action формы.
  • th:href: Заменяет атрибут href ссылки. Позволяет динамически формировать URL.
  • th:src: Заменяет атрибут src для изображений и скриптов.
  • th:attr: Позволяет задать произвольный атрибут HTML.
  • th:remove: Удаляет элемент или его часть при обработке шаблона.
  • th:fragment: Определяет фрагмент шаблона, который можно вставить в другой шаблон.
  • th:insert, th:replace: Вставляют определённый фрагмент в текущий шаблон. th:insert вставляет фрагмент внутрь текущего элемента, а th:replace полностью заменяет текущий элемент фрагментом.

Выражения

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

  • ${...} (Variable Expressions): Выражения для доступа к переменным модели, переданным из контроллера. Например: ${session.user.name}.
  • ***{...}** (Selection Variable Expressions): Выражения, которые вычисляются относительно выбранного объекта (заданного через th:object).
  • #{...} (Message Expressions): Выражения для интернационализации (i18n). Позволяют получать сообщения из файлов свойств (.properties).
  • @{...} (Link URL Expressions): Выражения для формирования URL-адресов. Автоматически учитывают контекст приложения и кодирование.
  • ~{...} (Fragment Expressions): Выражения для ссылок на фрагменты шаблонов.

Интеграция со Spring Framework

Thymeleaf имеет глубокую интеграцию со Spring Framework, особенно с Spring MVC и Spring Boot. В контексте Spring Thymeleaf автоматически получает доступ к:

  • Модели Spring MVC: Все атрибуты, добавленные в модель контроллера, доступны в шаблоне через ${...}.
  • Spring Expression Language (SpEL): Вместо OGNL по умолчанию используется SpEL, что позволяет использовать все возможности Spring, включая вызов методов бинов, доступ к контексту приложения и т.д.
  • Spring Security: С помощью модуля Thymeleaf Extras Spring Security можно использовать атрибуты для проверки прав доступа (например, sec:authorize).
  • Формы и валидация: Thymeleaf предоставляет атрибуты th:field, th:errors, th:object для удобной работы с формами Spring MVC и отображения ошибок валидации.

Пример использования

Типичный контроллер Spring MVC, возвращающий имя шаблона:

``java @Controller public class UserController { @GetMapping("/user") public String getUser(Model model) { User user = new User("Иван", "ivan@example.com"); model.addAttribute("user", user); model.addAttribute("roles", Arrays.asList("admin", "user")); return "userProfile"; // имя шаблона } } ``

Соответствующий шаблон userProfile.html:

``html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org">; <head> <title>Профиль пользователя</title> </head> <body> <h1 th:text="'Привет, ' + ${user.name} + '!'">Привет, пользователь!</h1> <p>Email: <span th:text="${user.email}">email@example.com</span></p> <h2>Роли:</h2> <ul> <li th:each="role : ${roles}" th:text="${role}">роль</li> </ul> </body> </html> ``

Критика и ограничения

Несмотря на популярность, Thymeleaf имеет ряд недостатков:

  • Производительность: По сравнению с некоторыми другими шаблонизаторами (например, Freemarker, Handlebars), Thymeleaf может работать медленнее из-за более сложного процесса парсинга и создания DOM-дерева. Однако для большинства веб-приложений это не является критичным.
  • Сложность синтаксиса: Для простых задач синтаксис Thymeleaf может показаться избыточным. Например, для простой вставки переменной требуется атрибут th:text, в то время как в других шаблонизаторах это делается проще (например, {{name}}).
  • Отсутствие поддержки клиентской стороны: Thymeleaf — это исключительно серверный инструмент. Он не предназначен для рендеринга на клиенте (в браузере) и не генерирует JavaScript-код для динамики.
  • Зависимость от Spring: Хотя Thymeleaf может использоваться и без Spring, его основная сила и удобство проявляются именно в связке с этим фреймворком. Вне экосистемы Spring он менее популярен.

Сравнение с другими шаблонизаторами

ХарактеристикаThymeleafJSPFreemarkerMustache / Handlebars
Принцип работыАтрибуты HTMLТеги и скриптлетыДирективы в текстеПростые плейсхолдеры
Натуральные шаблоныДа (работает в браузере)НетНетНет
Интеграция со SpringОтличная (стандарт в Spring Boot)Хорошая (устаревающая)ХорошаяОграниченная
ПроизводительностьСредняяВысокая (компилируется)ВысокаяВысокая
СложностьСредняяВысокаяНизкаяОчень низкая
Область примененияСерверные веб-приложения (Java)Серверные веб-приложения (Java)Серверные веб-приложения (Java)Серверные и клиентские приложения

Источники

  1. Официальная документация Thymeleaf (thymeleaf.org).
  2. Документация Spring Framework по веб-шаблонизаторам.
  3. Книга "Spring in Action" (Craig Walls).
  4. Репозиторий проекта на GitHub (github.com/thymeleaf).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →