Как да работите с дати в мащерка

1. Въведение

Thymeleaf е механизъм за Java шаблони, проектиран да работи директно с Spring. За въведение в мащерката и пролетта, разгледайте това описание.

Освен тези основни функции, Thymeleaf ни предлага набор от помощни обекти, които ще ни помогнат да изпълняваме общи задачи в нашето приложение.

В тази статия ще обсъдим обработката и форматирането на новите и старите класове Java Date с няколко функции на Thymeleaf 3.0.

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

Първо, нека видим конфигурацията, необходима за интегриране на Thymeleaf с Spring в нашия pom.xml :

 org.thymeleaf thymeleaf 3.0.11.RELEASE   org.thymeleaf thymeleaf-spring5 3.0.11.RELEASE 

Най-новите версии на мащерка и мащерка-пролет5 могат да бъдат намерени в Maven Central. Имайте предвид, че за проект Spring 4 библиотеката thymeleaf-spring4 трябва да се използва вместо thymeleaf-spring5 .

Освен това, за да работим с новите класове Java 8 Date , ще добавим следната зависимост към нашия pom.xml :

 org.thymeleaf.extras thymeleaf-extras-java8time 3.0.4.RELEASE 

Екстратите от мащерка са незадължителен модул, изцяло поддържан от официалния екип на Thymeleaf, който е създаден за съвместимост с Java 8 Time API. Той добавя обект # temporals към контекста като процесор на обект на помощна програма по време на оценки на изрази. Това означава, че може да се използва за оценяване на изрази в Object-Graph Navigation Language (OGNL) и Spring Expression Language (SpringEL).

3. Старо и ново: java.util и java.time

Пакетът Time е нов API за дата, час и календар за платформата Java SE. Основната разлика между старата наследствена дата и е, че новият API разграничава машинния и човешкия изглед на времева линия. Изгледът на машината разкрива поредица от интегрални стойности спрямо епохата, докато изгледът показва набор от полета (например година или ден).

За да работим с новия пакет Time , трябва да конфигурираме нашия механизъм за шаблони да използва новия Java8TimeDialect :

private ISpringTemplateEngine templateEngine(ITemplateResolver templateResolver) { SpringTemplateEngine engine = new SpringTemplateEngine(); engine.addDialect(new Java8TimeDialect()); engine.setTemplateResolver(templateResolver); return engine; }

Това ще добави обекта # temporals, подобен на този в стандартния диалект, което позволява форматирането и създаването на временни обекти от шаблоните на Thymeleaf.

За да тестваме обработката на нови и стари класове, ще създадем следните променливи и ще ги добавим като обекти на модел към нашия клас на контролер:

model.addAttribute("standardDate", new Date()); model.addAttribute("localDateTime", LocalDateTime.now()); model.addAttribute("localDate", LocalDate.now()); model.addAttribute("timestamp", Instant.now());

Сега сме готови да използваме Expression и Temporals Utility Objects, предоставени от Thymeleaf.

3.1. Форматиране на дати

Първата функция, която искаме да покрием, е форматирането на обект Date (който се добавя към параметрите на модела Spring). Решихме да използваме формата ISO8601 :

Без значение как нашата дата беше зададена отзад, тя ще бъде показана в съответствие с избрания стандарт. В standardDate ще бъдат обработвани от # дати полезността. Новите класове LocalDateTime, LocalDate и Instant ще бъдат обработени от помощната програма # temporals . Това е крайният резултат, който ще видим в браузъра:

Това е крайният резултат, който ще видим в браузъра:

Освен това, ако искаме да зададем формата ръчно, можем да го направим, като използваме:

Както можем да забележим, не можем да обработим незабавния клас с # temporals.format (...) - това ще доведе до UnsupportedTemporalTypeException . Освен това форматирането на LocalDate е възможно само ако ще посочим само конкретните полета за дата, като пропуснем полетата за време.

Крайният резултат:

3.2. Получаване на конкретни полета за дата

За да получим конкретните полета на класа java.util.Date , трябва да използваме следните помощни обекти:

${#dates.day(date)} ${#dates.month(date)} ${#dates.monthName(date)} ${#dates.monthNameShort(date)} ${#dates.year(date)} ${#dates.dayOfWeek(date)} ${#dates.dayOfWeekName(date)} ${#dates.dayOfWeekNameShort(date)} ${#dates.hour(date)} ${#dates.minute(date)} ${#dates.second(date)} ${#dates.millisecond(date)}

За новия пакет java.time трябва да се придържаме към # temporals помощни програми:

${#temporals.day(date)} ${#temporals.month(date)} ${#temporals.monthName(date)} ${#temporals.monthNameShort(date)} ${#temporals.year(date)} ${#temporals.dayOfWeek(date)} ${#temporals.dayOfWeekName(date)} ${#temporals.dayOfWeekNameShort(date)} ${#temporals.hour(date)} ${#temporals.minute(date)} ${#temporals.second(date)} ${#temporals.millisecond(date)}

Нека разгледаме няколко примера. Първо, нека покажем днешния ден от седмицата:

След това нека покажем името на делничния ден:

И накрая, нека покажем текущата секунда от деня:

Моля, обърнете внимание, че за да работите с части от времето, ще трябва да използвате LocalDateTime , тъй като LocalDate ще изведе грешка.

4. Заключение

В този бърз урок обсъдихме функциите за обработка на дата на Java, внедрени в рамката на Thymeleaf, версия 3.0.

Пълното изпълнение на този урок може да бъде намерено в проекта GitHub - това е проект, базиран на Maven, който е лесен за импортиране и стартиране.

Как да тествате? Нашето предложение е първо да играете с кода в браузър, след това да проверите и съществуващите ни тестове JUnit.

Моля, обърнете внимание, че нашите примери не обхващат всички налични опции в Thymeleaf. Ако искате да научите за всички видове помощни програми, погледнете нашата статия, обхващаща Spring и Thymeleaf Expressions.