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

Spring и Thymeleaf 3: Выражения

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

Задача: Наибольшая подстрока без повторений

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

ANDROMEDA 42

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 : служебные методы для класса Java Object в целом
  • #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.

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