Wie man mit Daten in Thymeleaf arbeitet

1. Einleitung

Thymeleaf ist eine Java-Template-Engine, die direkt mit Spring zusammenarbeitet. Ein Intro zu Thymeleaf und Spring finden Sie in diesem Artikel.

Neben diesen Grundfunktionen bietet Thymeleaf eine Reihe von Dienstprogrammobjekten an, mit denen wir allgemeine Aufgaben in unserer Anwendung ausführen können.

In diesem Artikel werden wir die Verarbeitung und Formatierung der neuen und alten Java Date- Klassen mit einer Handvoll Funktionen von Thymeleaf 3.0 diskutieren.

2. Maven-Abhängigkeiten

Schauen wir uns zunächst die Konfiguration an, die erforderlich ist, um Thymeleaf mit Spring in unsere pom.xml zu integrieren :

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

Die neuesten Versionen von Thymeleaf und Thymeleaf-Spring5 finden Sie auf Maven Central. Beachten Sie, dass für ein Spring 4-Projekt die Bibliothek thymeleaf-spring4 anstelle von thymeleaf-spring5 verwendet werden muss .

Um mit neuen Java 8 Date- Klassen arbeiten zu können, fügen wir unserer pom.xml die folgende Abhängigkeit hinzu :

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

Die Thymeleaf-Extras sind ein optionales Modul, das vom offiziellen Thymeleaf-Team vollständig unterstützt wird und aus Gründen der Kompatibilität mit der Java 8 Time-API erstellt wurde. Während der Ausdrucksauswertung wird dem Kontext ein # temporales Objekt als Dienstprogrammobjektprozessor hinzugefügt. Dies bedeutet, dass damit Ausdrücke in der Object-Graph Navigation Language (OGNL) und der Spring Expression Language (SpringEL) ausgewertet werden können.

3. Alt und Neu: java.util und java.time

Das Zeitpaket ist ein neuer Datum, Uhrzeit und Kalender - API für die Java SE Plattform. Der Hauptunterschied zwischen dem alten Legacy- Datum und besteht darin, dass die neue API zwischen maschinellen und menschlichen Ansichten einer Zeitachse unterscheidet. Die Maschinenansicht zeigt eine Folge von Integralwerten relativ zur Epoche, während die Ansicht eine Reihe von Feldern (z. B. Jahr oder Tag) zeigt.

Um mit dem neuen Time- Paket arbeiten zu können, müssen wir unsere Template-Engine für die Verwendung des neuen Java8TimeDialect konfigurieren :

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

Dies wird die # hinzufügen Schläfen Objekt ähnlich denen , die in der Standard - Dialect, so dass die Formatierung und die Schaffung von Temporal - Objekte aus Thymeleaf Vorlagen.

Um die Verarbeitung neuer und alter Klassen zu testen, erstellen wir die folgenden Variablen und fügen sie unserer Controller-Klasse als Modellobjekte hinzu:

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

Jetzt sind wir bereit zu verwenden , Expression und Schläfen Utility - Objekte von Thymeleaf zur Verfügung gestellt.

3.1. Daten formatieren

Die erste Funktion, die wir behandeln möchten, ist die Formatierung eines Date- Objekts (das zu den Spring-Modellparametern hinzugefügt wird). Wir haben uns für das ISO8601- Format entschieden:

Unabhängig davon, wie unser Datum auf der Back-End-Seite festgelegt wurde, wird es entsprechend dem ausgewählten Standard angezeigt. Die standardDate wird durch die # verarbeitet werden Daten - Dienstprogramm. Die neuen Klassen LocalDateTime, LocalDate und Instant werden vom Dienstprogramm # temporals verarbeitet . Dies ist das Endergebnis, das wir im Browser sehen werden:

Dies ist das Endergebnis, das wir im Browser sehen werden:

Wenn wir das Format manuell einstellen möchten, können wir Folgendes tun:

Wie wir beobachten können, können wir die Instant- Klasse nicht mit # temporals.format (…) verarbeiten - dies führt zu UnsupportedTemporalTypeException . Darüber hinaus ist das Formatieren des LocalDate nur möglich, wenn nur die bestimmten Datumsfelder angegeben werden und die Zeitfelder übersprungen werden.

Das Endergebnis:

3.2. Erhalten Sie bestimmte Datumsfelder

Um die spezifischen Felder der Klasse java.util.Date zu erhalten , sollten Sie die folgenden Dienstprogrammobjekte verwenden:

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

Für das neue Paket java.time sollten wir uns an die Dienstprogramme # temporals halten :

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

Schauen wir uns einige Beispiele an. Lassen Sie uns zunächst den heutigen Wochentag zeigen:

Als nächstes zeigen wir den Namen des Wochentags:

Und zum Schluss zeigen wir die aktuelle Sekunde des Tages:

Bitte beachten Sie, dass Sie LocalDateTime verwenden müssen, um mit Zeitteilen arbeiten zu können , da LocalDate einen Fehler auslöst .

4. Fazit

In diesen kurzen Tutorial diskutierten wir Java Datum Verarbeitungsfunktionen in der Thymeleaf implementiert Rahmen, Version 3.0.

Die vollständige Implementierung dieses Tutorials finden Sie im GitHub-Projekt - dies ist ein Maven-basiertes Projekt, das einfach zu importieren und auszuführen ist.

Wie teste ich? Wir empfehlen, zuerst mit dem Code in einem Browser zu spielen und dann auch unsere vorhandenen JUnit-Tests zu überprüfen.

Bitte beachten Sie, dass unsere Beispiele nicht alle verfügbaren Optionen in Thymeleaf abdecken. Wenn Sie mehr über alle Arten von Dienstprogrammen erfahren möchten, lesen Sie unseren Artikel über Spring- und Thymeleaf-Ausdrücke.