Cara Bekerja dengan Tarikh di Thymeleaf

1. Pengenalan

Thymeleaf adalah mesin templat Java yang direka untuk bekerja secara langsung dengan Spring. Untuk pengenalan Thymeleaf dan Spring, lihatlah tulisan ini.

Selain fungsi asas ini, Thymeleaf menawarkan kami sekumpulan objek utiliti yang akan membantu kami melakukan tugas biasa dalam aplikasi kami.

Dalam artikel ini, kita akan membincangkan pemprosesan dan pemformatan kelas Java Date baru dan lama dengan segelintir ciri Thymeleaf 3.0.

2. Pergantungan Maven

Pertama, mari kita lihat konfigurasi yang diperlukan untuk mengintegrasikan Thymeleaf dengan Spring ke dalam pom.xml kami :

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

Versi terbaru thymeleaf dan thymeleaf-spring5 boleh didapati di Maven Central. Perhatikan bahawa, untuk projek Spring 4, perpustakaan thymeleaf-spring4 mesti digunakan dan bukannya thymeleaf-spring5 .

Lebih-lebih lagi, untuk bekerja dengan kelas Java 8 Date yang baru , kami akan menambahkan kebergantungan berikut ke pom.xml kami :

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

The tambahan thymeleaf ialah modul pilihan, disokong sepenuhnya oleh pasukan Thymeleaf rasmi, yang telah dicipta untuk keserasian dengan Java 8 Masa API. Ia menambahkan objek # temporal ke Konteks sebagai pemproses objek utiliti semasa penilaian ekspresi. Ini bermakna ia dapat digunakan untuk menilai ekspresi dalam Objek Navigasi Grafik Objek (OGNL) dan Bahasa Ekspresi Musim Semi (SpringEL).

3. Lama dan Baru: java.util dan java.time

The Time pakej ialah API tarikh, masa, dan kalendar baru untuk platform Java SE. Perbezaan utama antara Tarikh warisan lama dan API baru membezakan antara pandangan mesin dan manusia mengenai garis masa. Pandangan mesin mengungkapkan urutan nilai-nilai integral relatif terhadap zaman, sedangkan pandangan menunjukkan sekumpulan bidang (misalnya, tahun atau hari).

Untuk bekerja dengan pakej Waktu baru , kita perlu mengkonfigurasi mesin templat kita untuk menggunakan Java8TimeDialect baru :

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

Ini akan menambahkan objek # temporal yang serupa dengan yang ada dalam Dialek Piawai, yang memungkinkan pemformatan dan pembuatan objek Temporal dari templat Thymeleaf.

Untuk menguji pemprosesan kelas baru dan lama, kami akan membuat pemboleh ubah berikut dan menambahkannya sebagai objek model ke kelas pengawal kami:

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

Sekarang kita sudah bersedia untuk digunakan Expression dan Temporals Utility Objek disediakan oleh Thymeleaf.

3.1. Format Tarikh

Fungsi pertama yang ingin kita bahas adalah pemformatan objek Date (yang ditambahkan pada parameter model Spring). Kami memutuskan untuk menggunakan format ISO8601 :

Tidak kira bagaimana Tarikh kami ditetapkan di bahagian belakang, ia akan ditunjukkan mengikut standard yang dipilih. The standardDate akan diproses oleh # tarikh utiliti. Kelas LocalDateTime, LocalDate dan Instan baru akan diproses oleh # utiliti temporal . Ini adalah hasil akhir yang akan kita lihat di penyemak imbas:

Ini adalah hasil akhir yang akan kita lihat di penyemak imbas:

Lebih-lebih lagi, jika kita ingin menetapkan format secara manual, kita dapat melakukannya dengan menggunakan:

Seperti yang dapat kita perhatikan, kita tidak dapat memproses kelas Instan dengan # temporals.format (…) - ia akan menghasilkan UnsupportedTemporalTypeException . Lebih-lebih lagi, memformat LocalDate hanya mungkin dilakukan jika kita akan menentukan hanya bidang tarikh tertentu, melangkau bidang waktu.

Hasil akhir:

3.2. Dapatkan Medan Tarikh Khusus

Untuk mendapatkan bidang tertentu dari kelas java.util.Date , kita harus menggunakan objek utiliti berikut:

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

Untuk pakej java.time baru , kita harus menggunakan # utiliti temporal :

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

Mari lihat beberapa contoh. Pertama, mari tunjukkan hari dalam seminggu:

Seterusnya, mari tunjukkan nama hari kerja:

Dan akhirnya, mari kita tunjukkan detik terkini hari ini:

Harap maklum bahawa untuk bekerja dengan bahagian waktu, anda perlu menggunakan LocalDateTime , kerana LocalDate akan menimbulkan kesalahan.

4. Kesimpulan

Dalam tutorial ringkas ini, kami membincangkan ciri pemprosesan Java Date yang dilaksanakan dalam kerangka Thymeleaf, versi 3.0.

Pelaksanaan penuh tutorial ini boleh didapati di projek GitHub - ini adalah projek berasaskan Maven yang mudah diimport dan dijalankan.

Bagaimana untuk menguji? Cadangan kami adalah bermain dengan kod pada penyemak imbas terlebih dahulu, kemudian periksa juga ujian JUnit yang ada.

Harap maklum bahawa contoh kami tidak merangkumi semua pilihan yang ada di Thymeleaf. Sekiranya anda ingin mengetahui tentang semua jenis utiliti, lihat artikel kami yang merangkumi Spring and Thymeleaf Expressions.