Comment travailler avec des dates dans Thymeleaf

1. Introduction

Thymeleaf est un moteur de template Java conçu pour fonctionner directement avec Spring. Pour une introduction à Thymeleaf et Spring, jetez un œil à cet article.

Outre ces fonctions de base, Thymeleaf nous propose un ensemble d'objets utilitaires qui nous aideront à effectuer des tâches courantes dans notre application.

Dans cet article, nous discuterons du traitement et du formatage des nouvelles et anciennes classes Java Date avec quelques fonctionnalités de Thymeleaf 3.0.

2. Dépendances de Maven

Voyons d' abord la configuration nécessaire pour intégrer Thymeleaf avec Spring dans notre pom.xml :

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

Les dernières versions de thymeleaf et thymeleaf-spring5 sont disponibles sur Maven Central. Notez que, pour un projet Spring 4, la bibliothèque thymeleaf-spring4 doit être utilisée à la place de thymeleaf-spring5 .

De plus, afin de travailler avec les nouvelles classes Java 8 Date , nous ajouterons la dépendance suivante à notre pom.xml :

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

Les extras thymeleaf sont un module optionnel, entièrement pris en charge par l'équipe officielle de Thymeleaf, qui a été créé pour la compatibilité avec l'API Java 8 Time. Il ajoute un objet # temporals au contexte en tant que processeur d'objets utilitaires lors des évaluations d'expression. Cela signifie qu'il peut être utilisé pour évaluer des expressions dans le langage de navigation Object-Graph (OGNL) et le langage d'expression Spring (SpringEL).

3. Anciens et nouveaux: java.util et java.time

Le package Time est une nouvelle API de date, heure et calendrier pour la plate-forme Java SE. La principale différence entre l'ancienne date héritée et la nouvelle API fait la distinction entre les vues machine et humaine d'une chronologie. La vue machine révèle une séquence de valeurs intégrales par rapport à l' époque, alors que la vue révèle un ensemble de champs (par exemple, année ou jour).

Pour travailler avec le nouveau package Time , nous devons configurer notre moteur de modèle pour utiliser le nouveau Java8TimeDialect :

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

Cela ajoutera l' objet # temporals similaire à ceux du dialecte standard, permettant le formatage et la création d' objets temporels à partir de modèles Thymeleaf.

Afin de tester le traitement des nouvelles et anciennes classes, nous allons créer les variables suivantes et les ajouter en tant qu'objets de modèle à notre classe de contrôleur:

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

Nous sommes maintenant prêts à utiliser les objets utilitaires d' expression et temporaires fournis par Thymeleaf.

3.1. Format des dates

La première fonction que nous voulons couvrir est le formatage d'un objet Date (qui est ajouté aux paramètres du modèle Spring). Nous avons décidé d'utiliser le format ISO8601 :

Quelle que soit la façon dont notre date a été définie sur le côté arrière, elle sera affichée en fonction de la norme sélectionnée. Le standardDate va être traité par l' utilitaire # dates . Les nouvelles classes LocalDateTime, LocalDate et Instant vont être traitées par l' utilitaire # temporals . Voici le résultat final que nous verrons dans le navigateur:

Voici le résultat final que nous verrons dans le navigateur:

De plus, si nous voulons définir le format manuellement, nous pouvons le faire en utilisant:

Comme nous pouvons l'observer, nous ne pouvons pas traiter la classe Instant avec # temporals.format (…) - cela entraînera une exception UnsupportedTemporalTypeException . De plus, le formatage de LocalDate n'est possible que si nous ne spécifions que les champs de date particuliers, en ignorant les champs d'heure.

Le résultat final:

3.2. Obtenir des champs de date spécifiques

Afin d'obtenir les champs spécifiques de la classe java.util.Date , nous devons utiliser les objets utilitaires suivants:

${#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)}

Pour le nouveau package java.time , nous devrions nous en tenir aux utilitaires # 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)}

Regardons quelques exemples. Tout d'abord, montrons le jour de la semaine d'aujourd'hui:

Ensuite, montrons le nom du jour de la semaine:

Et enfin, montrons la seconde actuelle de la journée:

Veuillez noter que pour travailler avec des périodes, vous devez utiliser LocalDateTime , car LocalDate générera une erreur.

4. Conclusion

Dans ce rapide tutoriel, nous avons discuté des fonctionnalités de traitement Java Date implémentées dans le framework Thymeleaf, version 3.0.

L'implémentation complète de ce didacticiel se trouve dans le projet GitHub - il s'agit d'un projet basé sur Maven qui est facile à importer et à exécuter.

Comment tester? Notre suggestion est de jouer d'abord avec le code dans un navigateur, puis de vérifier également nos tests JUnit existants.

Veuillez noter que nos exemples ne couvrent pas toutes les options disponibles dans Thymeleaf. Si vous souhaitez en savoir plus sur tous les types d'utilitaires, consultez notre article sur les expressions Spring et Thymeleaf.