1. Введение
Thymeleaf — это механизм шаблонов Java для обработки и создания HTML, XML, JavaScript, CSS и обычного текста. Чтобы познакомиться с Thymeleaf и Spring, ознакомьтесь с этой статьей .
Помимо этих основных функций, Thymeleaf предлагает нам набор служебных объектов, которые помогут нам выполнять общие задачи в нашем приложении.
В этой статье мы обсудим основную функцию Thymeleaf 3.0 — объекты Expression Utility в приложениях Spring MVC. Более конкретно, мы рассмотрим тему обработки дат, календарей, строк, объектов и многого другого.
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
. Последнюю версию зависимостей можно найти здесь .
3. Служебные объекты выражений
Прежде чем перейти к основной теме этой статьи, если вы хотите сделать шаг назад и посмотреть, как настроить Thymeleaf 3.0 в своем проекте веб-приложения, ознакомьтесь с этим руководством .
Для целей текущей статьи мы создали контроллер Spring и HTML-файл, чтобы протестировать все функции, которые мы собираемся обсудить. Ниже приведен полный список доступных вспомогательных объектов и их функций:
#dates
: служебные методы для объектовjava.util.Date
#calendars
: аналогично#dates
, используется для объектовjava.util.Calendar .
#numbers
: служебные методы для форматирования числовых объектов.#strings
: служебные методы для объектовString
#objects
: служебные методы для класса JavaObject
в целом#bools
: служебные методы длялогических
вычислений#arrays
: служебные методы для массивов#lists
: служебные методы для списков#sets
: служебные методы для наборов#maps
: служебные методы для карт#aggregates
: служебные методы для создания агрегатов в массивах или коллекциях.#messages
: служебные методы для получения внешних сообщений внутри выражений переменных.
3.1. Даты Объекты
Первая функция, которую мы хотим обсудить, — это обработка объектов java.util.Date
. Объекты утилиты выражений, отвечающие за обработку даты
, начинаются с #dates.functionName().
Первая функция, которую мы хотим охватить, — это форматирование объекта Date
(который добавляется к параметрам модели Spring).
Допустим, мы хотим использовать формат ISO8601
:
<p th:text="${#dates.formatISO(date)}"></p>
Как бы ни была установлена наша дата
на бэкенде, она должна отображаться соответственно этому стандарту. Более того, если мы хотим уточнить формат, мы можем указать его вручную:
<p th:text="${#dates.format(date, 'dd-MM-yyyy HH:mm')}"></p>
В качестве параметров функция принимает две переменные: дату
и ее формат.
Наконец, вот несколько подобных полезных функций, которые мы можем использовать:
<p th:text="${#dates.dayOfWeekName(date)}"></p>
<p th:text="${#dates.createNow()}"></p>
<p th:text="${#dates.createToday()}"></p>
В первом мы получим название дня недели, во втором создадим новый объект Date
и, наконец, создадим новый Date
со временем, установленным на 00:00.
3.2. Объекты календаря
Утилиты календаря очень похожи на обработку дат, за исключением того, что мы используем экземпляр объекта java.util.Calendar
:
<p th:text="${#calendars.formatISO(calendar)}"></p>
<p th:text="${#calendars.format(calendar, 'dd-MM-yyyy HH:mm')}"></p>
<p th:text="${#calendars.dayOfWeekName(calendar)}"></p>
Единственная разница заключается в том, когда мы хотим создать новый экземпляр календаря :
<p th:text="${#calendars.createNow().getTime()}"></p>
<p th:text="${#calendars.createToday().getFirstDayOfWeek()}"></p>
Обратите внимание, что мы можем использовать любой метод класса Calendar
для получения запрошенных данных.
3.3. Обработка чисел
Еще одна очень полезная функция — обработка чисел. Давайте сосредоточимся на переменной num
, случайно созданной с двойным
типом:
<p th:text="${#numbers.formatDecimal(num,2,3)}"></p>
<p th:text="${#numbers.formatDecimal(num,2,3,'COMMA')}"></p>
В первой строке мы форматируем десятичное число, устанавливая минимум целых цифр и точные десятичные цифры. Во втором, помимо целых и десятичных цифр, мы указали десятичный разделитель. Возможные варианты: POINT
, COMMA
, WHITESPACE
, NONE
или DEFAULT
(в зависимости от региона).
Есть еще одна функция, которую мы хотим представить в этом параграфе. Это создание последовательности целых чисел:
<p th:each="number: ${#numbers.sequence(0,2)}">
<span th:text="${number}"></span>
</p>
<p th:each="number: ${#numbers.sequence(0,4,2)}">
<span th:text="${number}"></span>
</p>
В первом примере мы заставили Thymeleaf сгенерировать последовательность от 0 до 2, тогда как во втором, помимо минимального и максимального значения, мы предоставили определение шага (в этом примере значения изменятся на два).
Обратите внимание, что интервал закрыт с обеих сторон.
3.4. Строковые операции
Это наиболее полная функция служебных объектов выражений.
Начать описание можно с утилиты проверки пустых или нулевых
объектов String .
Довольно часто для этого разработчики использовали методы Java внутри тегов Thymeleaf, что может быть небезопасно для нулевых
объектов.
Вместо этого мы можем сделать это:
<p th:text="${#strings.isEmpty(string)}"></p>
<p th:text="${#strings.isEmpty(nullString)}"></p>
<p th:text="${#strings.defaultString(emptyString,'Empty String')}"></p>
Первая строка
не пуста, поэтому метод вернет false.
Вторая строка
равна null
, поэтому мы получим true
. Наконец, мы можем использовать метод #strings.defaultString(…)
для указания значения по умолчанию, если String
будет пустым.
Есть еще много методов. Все они работают не только со строками, но и с Java.Collections.
Например, чтобы использовать операции, связанные с подстрокой:
<p th:text="${#strings.indexOf(name,frag)}"></p>
<p th:text="${#strings.substring(name,3,5)}"></p>
<p th:text="${#strings.substringAfter(name,prefix)}"></p>
<p th:text="${#strings.substringBefore(name,suffix)}"></p>
<p th:text="${#strings.replace(name,'las','ler')}"></p>
или использовать нулевое безопасное сравнение и конкатенацию:
<p th:text="${#strings.equals(first, second)}"></p>
<p th:text="${#strings.equalsIgnoreCase(first, second)}"></p>
<p th:text="${#strings.concat(values...)}"></p>
<p th:text="${#strings.concatReplaceNulls(nullValue, values...)}"></p>
Наконец, есть функции, связанные со стилем текста, которые сохранят синтаксис всегда одинаковым:
<p th:text="${#strings.abbreviate(string,5)} "></p>
<p th:text="${#strings.capitalizeWords(string)}"></p>
В первом методе сокращенный текст будет иметь максимальный размер n
. Если текст больше, он будет обрезан и дополнен «…».
Во втором методе мы будем писать слова с большой буквы.
3.5. Агрегаты
Последняя, но не менее важная функция, которую мы хотим здесь обсудить, — это агрегаты
. Они безопасны с нулевым
значением и предоставляют утилиты для вычисления среднего значения или суммы из массива или любой другой коллекции:
<p th:text="${#aggregates.sum(array)}"></p>
<p th:text="${#aggregates.avg(array)}"></p>
<p th:text="${#aggregates.sum(set)}"></p>
<p th:text="${#aggregates.avg(set)}"></p>
4. Вывод
В этой статье мы обсудили функции Expression Utility Objects, реализованные в платформе Thymeleaf версии 3.0.
Полную реализацию этого туториала можно найти в проекте GitHub .
Как проверить? Мы предлагаем сначала поиграть с браузером, а затем также проверить существующие тесты JUnit.
Обратите внимание, что примеры не охватывают все доступные служебные выражения. Если вы хотите узнать обо всех типах утилит, загляните сюда .