Bekerja dengan Fragmen di Thymeleaf

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan menunjukkan cara memanfaatkan Thymeleaf Fragments untuk menggunakan semula beberapa bahagian yang biasa di laman web . Setelah menyiapkan projek Spring MVC yang sangat sederhana, kami akan memfokuskan pandangan.

Sekiranya anda baru menggunakan Thymeleaf, anda boleh menyemak artikel lain di laman web ini seperti pengenalan ini, dan juga mengenai enjin versi 3.0 ini.

2. Pergantungan Maven

Kami memerlukan beberapa pergantungan untuk mengaktifkan Thymeleaf:

 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.

3. Projek Musim Bunga

3.1. Konfigurasi Spring MVC

Untuk mengaktifkan Thymeleaf dan menetapkan akhiran templat, kita perlu mengkonfigurasi MVC dengan pemecah pandangan dan pemecah templat .

Kami juga akan menetapkan direktori untuk beberapa sumber statik:

@Bean public ViewResolver htmlViewResolver() { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine(htmlTemplateResolver())); resolver.setContentType("text/html"); resolver.setCharacterEncoding("UTF-8"); resolver.setViewNames(ArrayUtil.array("*.html")); return resolver; } private ITemplateResolver htmlTemplateResolver() { SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); resolver.setApplicationContext(applicationContext); resolver.setPrefix("/WEB-INF/views/"); resolver.setCacheable(false); resolver.setTemplateMode(TemplateMode.HTML); return resolver; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**", "/css/**") .addResourceLocations("/WEB-INF/resources/", "/WEB-INF/css/"); }

Perhatikan bahawa jika kita menggunakan Spring Boot, konfigurasi ini mungkin tidak diperlukan kecuali kita perlu menerapkan penyesuaian kita sendiri.

3.2. Pengawal

Dalam kes ini, pengawal hanyalah kenderaan untuk pandangan. Setiap paparan menunjukkan senario penggunaan serpihan yang berbeza.

Yang terakhir memuat beberapa data yang disampaikan melalui model untuk dipaparkan pada paparan:

@Controller public class FragmentsController { @GetMapping("/fragments") public String getHome() { return "fragments.html"; } @GetMapping("/markup") public String markupPage() { return "markup.html"; } @GetMapping("/params") public String paramsPage() { return "params.html"; } @GetMapping("/other") public String otherPage(Model model) { model.addAttribute("data", StudentUtils.buildStudents()); return "other.html"; } }

Perhatikan bahawa nama pandangan mesti mengandungi akhiran ".html" kerana cara kita mengkonfigurasi pemecah kita. Kami juga akan menentukan akhiran ketika merujuk kepada nama fragmen.

4. Pandangan

4.1. Penyertaan Fragmen Mudah

Pertama sekali, kami akan menggunakan semula bahagian biasa di halaman kami.

Kita boleh menentukan bahagian-bahagian ini sebagai fragmen, baik dalam fail terpencil atau di halaman umum. Dalam projek ini, bahagian-bahagian yang boleh digunakan semula ini ditentukan dalam folder bernama fragmen .

Terdapat tiga cara asas untuk memasukkan kandungan dari serpihan:

  • masukkan - memasukkan kandungan di dalam teg
  • ganti - menggantikan tag semasa dengan tag yang menentukan pecahan
  • sertakan - ini tidak digunakan lagi tetapi masih boleh muncul dalam kod warisan

Contoh seterusnya, fragments.html, menunjukkan penggunaan ketiga-tiga cara. Templat Thymeleaf ini menambah serpihan di kepala dan badan dokumen:

   Thymeleaf Fragments: home      

Go to the next page to see fragments in action

Sekarang, mari kita lihat halaman yang menyimpan beberapa serpihan. Ia dipanggil general.html , dan seperti keseluruhan halaman dengan beberapa bahagian ditakrifkan sebagai fragmen yang siap digunakan:

Go to the next page to see fragments in action

This is a sidebar This is another sidebar Fragments Index | Markup inclussion | Fragment params | Other

The bahagian hanya mengandungi gaya gaya, tetapi kami dapat menggunakan alat lain seperti Bootstrap, jQuery, atau Foundation, baik secara langsung atau menggunakan Webjars.

Perhatikan bahawa semua tag yang boleh digunakan semula templat ini mempunyai atribut th: fragment , tetapi seterusnya kita akan melihat cara memasukkan bahagian lain dari halaman.

Setelah penyertaan rendering dan fragmen, kandungan yang dikembalikan adalah:

   Thymeleaf Fragments: home 

Go to the next page to see fragments in action

Fragments Index | Markup inclussion | Fragment params | Other

4.2. Pemilih Markah untuk Fragmen

Salah satu perkara hebat mengenai Thymeleaf Fragments adalah bahawa kita juga dapat merebut mana-mana bahagian templat hanya dengan menggunakan pemilih sederhana , melalui kelas, id, atau hanya dengan tag.

Halaman ini, misalnya, merangkumi beberapa komponen dari fail general.html : blok samping dan blok div.another :

4.3. Pecahan Parametri

Kita boleh menyampaikan parameter ke aserpihan untuk mengubah beberapa bahagian tertentu daripadanya. Untuk melakukan itu, fragmen mesti didefinisikan sebagai fungsi panggilan, di mana kita mesti menyatakan senarai parameter.

Dalam contoh ini, kami menentukan fragmen untuk medan bentuk generik:

 Field 

Dan inilah penggunaan mudah fragmen tersebut di mana kami menyampaikan parameter kepadanya:

Dan ini adalah bagaimana medan yang dikembalikan akan kelihatan:

 Name 

4.4. Ungkapan Penyertaan Fragmen

Fragmen thymeleaf menawarkan pilihan menarik lain seperti sokongan untuk ungkapan bersyarat untuk menentukan sama ada menyertakan fragmen .

Dengan menggunakan operator Elvis dengan salah satu ungkapan yang diberikan oleh Thymeleaf (contohnya keselamatan, rentetan, dan koleksi), kami dapat memuatkan serpihan yang berbeza.

Sebagai contoh, kita dapat menentukan fragmen ini dengan beberapa kandungan yang akan kita tunjukkan bergantung pada keadaan tertentu. Ini mungkin fail yang mengandungi pelbagai jenis blok:

 Data received No data 

Dan ini adalah bagaimana kita dapat memuatkannya dengan ungkapan:

 0} ? ~{fragments/menus.html :: dataPresent} : ~{fragments/menus.html :: noData}">

Untuk mengetahui lebih lanjut mengenai Thymeleaf Expressions, lihat artikel kami di sini.

4.5. Susun atur Fleksibel

Contoh seterusnya juga menunjukkan dua penggunaan serpihan lain yang menarik untuk membuat jadual dengan data . Ini adalah pecahan meja yang dapat digunakan kembali, dengan dua bahagian penting: tajuk meja yang dapat diubah, dan isi tempat data diberikan:


    
0 Name

When we want to use this table, we can pass our own table header using the fields function. The header is referenced with the class myFields. The table body is loaded by passing data as a parameter to the tableBody function:


    
Id Name

And this is how the final page will look:

 Data received 
    
Id Name
1001 John Smith
1002 Jane Williams
Fragments Index | Markup inclussion | Fragment params | Other

5. Conclusion

In this article, we've shown how to reuse view components through the use of Thymeleaf Fragments, a powerful tool that can make template management easier.

We have also presented some other interesting features that go beyond the basics. We should take these into account when choosing Thymeleaf as our view rendering engine.

If you want to learn about other Thymeleaf features, you should definitely take a look at our article about Layout Dialects.

Seperti biasa, kod pelaksanaan lengkap contoh boleh didapati di GitHub.