Comment travailler avec des dates dans Thymeleaf

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 àthis write-up.

Outre ces fonctions de base, Thymeleaf nous offre un ensemble d’objets d’utilité qui nous aideront à effectuer les tâches courantes de notre application.

Dans cet article, nous aborderons le traitement et le formatage des nouvelles et anciennes classes JavaDate avec quelques fonctionnalités de Thymeleaf 3.0.

2. Dépendances Maven

Tout d'abord, voyons la configuration nécessaire pour intégrer Thymeleaf avec Spring dans nospom.xml:


    org.thymeleaf
    thymeleaf
    3.0.9.RELEASE


    org.thymeleaf
    thymeleaf-spring4
    3.0.9.RELEASE

Les dernières versions dethymeleaf etthymeleaf-spring5 can se trouvent sur Maven Central. Notez que, pour un projet Spring 4, la bibliothèquethymeleaf-spring4 doit être utilisée à la place dethymeleaf-spring5.

De plus, afin de travailler avec les nouvelles classes Java 8Date, nous allons ajouter la dépendance suivante à nospom.xml:


    org.thymeleaf.extras
    thymeleaf-extras-java8time
    3.0.1.RELEASE

Lethymeleaf extras est un module facultatif, entièrement pris en charge par l'équipe officielle de Thymeleaf, qui a été créé pour être compatible avec l'API Java 8 Time. Il ajoute un objet #temporals auxContext en tant que processeur d'objets utilitaires lors des évaluations d'expressions. Cela signifie qu'il peut être utilisé pour évaluer des expressions en langage OGNL (Object-Graph Navigation Language) et SpringEL (Spring Expression Language).

3. Ancien et nouveau:java.util etjava.time

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

Pour travailler avec le nouveau packageTime, nous devons configurer notre moteur de modèle pour utiliser les nouveauxJava8TimeDialect:

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'objetsTemporal à 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 à utiliserExpression etTemporalsUtility Objects fournis par Thymeleaf.

3.1. Format des dates

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

Format ISO

Peu importe comment notreDate a été défini sur le côté back-end, il sera affiché en fonction de la norme sélectionnée. LesstandardDate vont être traités par l'utilitaire #dates. Les nouvelles classesLocalDateTime,LocalDate etInstant 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:

image

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

Format manually

Comme nous pouvons l'observer, nous ne pouvons pas traiter la classeInstant avec #temporals.format(…) - il en résulteraUnsupportedTemporalTypeException. De plus, le formatage desLocalDate 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:

image

 

3.2. Obtenir des champs de date spécifiques

Afin d'obtenir les champs spécifiques de la classejava.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 packagejava.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:

Show only which day of a week

Ensuite, montrons le nom du jour de la semaine:

Show the name of the week day

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

Show the second of the day

Veuillez noter que pour travailler avec des parties de temps, vous devez utiliserLocalDateTime, carLocalDate générera une erreur.

4. Conclusion

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

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

How to test? 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, jetez un œil à notre article sur lesSpring and Thymeleaf Expressions.