Come lavorare con le date in Thymeleaf

1. Introduzione

Thymeleaf è un motore di modelli Java progettato per funzionare direttamente con Spring. Per un'introduzione a Thymeleaf e Spring, dai un'occhiata a questo articolo.

Oltre a queste funzioni di base, Thymeleaf ci offre una serie di oggetti di utilità che ci aiuteranno a svolgere attività comuni nella nostra applicazione.

In questo articolo, discuteremo dell'elaborazione e della formattazione delle nuove e vecchie classi Java Date con una manciata di funzionalità di Thymeleaf 3.0.

2. Dipendenze di Maven

Per prima cosa, vediamo la configurazione necessaria per integrare Thymeleaf con Spring nel nostro pom.xml :

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

Le ultime versioni di thymeleaf e thymeleaf-spring5 sono disponibili su Maven Central. Nota che, per un progetto Spring 4, la libreria thymeleaf-spring4 deve essere utilizzata al posto di thymeleaf-spring5 .

Inoltre, per poter lavorare con le nuove classi Date di Java 8 , aggiungeremo la seguente dipendenza al nostro pom.xml :

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

Il thymeleaf extra è un modulo opzionale, completamente supportato dal team ufficiale di Thymeleaf, che è stato creato per la compatibilità con Java 8 Time API. Aggiunge un oggetto # temporals al Context come processore di oggetti di utilità durante le valutazioni delle espressioni. Ciò significa che può essere utilizzato per valutare espressioni in OGNL (Object-Graph Navigation Language) e Spring Expression Language (SpringEL).

3. Vecchio e nuovo: java.util e java.time

Il pacchetto Time è una nuova API di data, ora e calendario per la piattaforma Java SE. La principale differenza tra la vecchia data legacy ed è che la nuova API distingue tra vista macchina e vista umana di una sequenza temporale. La vista macchina rivela una sequenza di valori integrali relativi all'epoca, mentre la vista rivela un insieme di campi (ad es. Anno o giorno).

Per lavorare con il nuovo pacchetto Time , dobbiamo configurare il nostro motore di modelli per utilizzare il nuovo Java8TimeDialect :

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

Questo aggiungerà l' oggetto # temporals simile a quelli nel dialetto standard, consentendo la formattazione e la creazione di oggetti temporali da modelli Thymeleaf.

Per testare l'elaborazione di nuove e vecchie classi, creeremo le seguenti variabili e le aggiungeremo come oggetti modello alla nostra classe controller:

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

Ora siamo pronti per utilizzare Expression e Temporals Utility Objects forniti da Thymeleaf.

3.1. Formato date

La prima funzione che vogliamo coprire è la formattazione di un oggetto Date (che viene aggiunto ai parametri del modello Spring). Abbiamo deciso di utilizzare il formato ISO8601 :

Indipendentemente da come la nostra data è stata impostata sul lato back-end, verrà mostrata in base allo standard selezionato. Lo standardDate sta per essere elaborati dal # date di utilità. Le nuove classi LocalDateTime, LocalDate e Instant verranno elaborate dall'utilità # temporals . Questo è il risultato finale che vedremo nel browser:

Questo è il risultato finale che vedremo nel browser:

Inoltre, se vogliamo impostare manualmente il formato, possiamo farlo utilizzando:

Come possiamo osservare, non possiamo elaborare la classe Instant con # temporals.format (…) - risulterà in UnsupportedTemporalTypeException . Inoltre, la formattazione del LocalDate è possibile solo se specificheremo solo i campi della data particolare, saltando i campi dell'ora.

Il risultato finale:

3.2. Ottieni campi data specifici

Per ottenere i campi specifici della classe java.util.Date , dovremmo utilizzare i seguenti oggetti di utilità:

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

Per il nuovo pacchetto java.time , dovremmo attenerci alle # utilità temporali :

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

Diamo un'occhiata ad alcuni esempi. Per prima cosa, mostriamo il giorno della settimana di oggi:

Successivamente, mostriamo il nome del giorno della settimana:

E infine, mostriamo il secondo corrente della giornata:

Tieni presente che per lavorare con le parti temporali, devi utilizzare LocalDateTime , poiché LocalDate genererà un errore.

4. Conclusione

In questo breve tutorial, abbiamo discusso le funzionalità di elaborazione della data di Java implementate nel framework Thymeleaf, versione 3.0.

L'implementazione completa di questo tutorial può essere trovata nel progetto GitHub: questo è un progetto basato su Maven che è facile da importare ed eseguire.

Come testare? Il nostro suggerimento è di giocare prima con il codice in un browser, quindi controllare anche i nostri test JUnit esistenti.

Tieni presente che i nostri esempi non coprono tutte le opzioni disponibili in Thymeleaf. Se vuoi conoscere tutti i tipi di utilità, dai un'occhiata al nostro articolo che copre le espressioni della primavera e delle foglie di timo.