Pengantar Kumis

1. Ikhtisar

Pada artikel ini, kita akan fokus pada template Mustache dan menggunakan salah satu API Java-nya untuk menghasilkan konten HTML dinamis.

Mustache adalah mesin template tanpa logika untuk membuat konten dinamis seperti HTML, file konfigurasi, dan lain-lain.

2. Pendahuluan

Sederhananya, mesin diklasifikasikan sebagai tanpa logika karena tidak memiliki konstruksi yang mendukung pernyataan if-else dan for loop.

Template Mustache terdiri dari nama-nama tag yang diapit oleh {{}} (yang menyerupai mustache - karena itu namanya) dan didukung oleh objek model yang berisi data untuk template tersebut.

3. Ketergantungan Maven

Kompilasi dan eksekusi template didukung oleh berbagai bahasa - baik sisi klien maupun sisi server.

Untuk dapat memproses template dari Java, kami menggunakan library Java-nya yang dapat ditambahkan sebagai dependensi Maven.

Java 8+:

 com.github.spullara.mustache.java compiler 0.9.4 

Jawa 6/7:

 com.github.spullara.mustache.java compiler 0.8.18 

Kami dapat memeriksa versi terbaru pustaka di Central Maven Repository.

4. Penggunaan

Mari kita lihat skenario sederhana yang menunjukkan bagaimana:

  1. Tulis template sederhana
  2. Kompilasi template menggunakan Java API
  3. Jalankan dengan memberikan data yang diperlukan

4.1. Template Kumis Sederhana

Kami akan membuat templat sederhana untuk menampilkan detail tugas rencana:

{{title}}

Created on {{createdOn}}

{{text}}

Dalam template di atas, bidang dalam kurung kurawal ({{}}) bisa berupa:

  • metode dan properti kelas Java
  • kunci dari objek Peta

4.2. Menyusun Template Kumis

Kami dapat menyusun template seperti yang ditunjukkan di bawah ini:

MustacheFactory mf = new DefaultMustacheFactory(); Mustache m = mf.compile("todo.mustache"); 

MustacheFactory mencari template yang diberikan di classpath. Dalam contoh kami, kami menempatkan todo.mustache di bawah src / main / resources .

4.3. Menjalankan Template Kumis

Data yang diberikan ke template akan menjadi turunan dari kelas Todo yang definisinya adalah:

public class Todo { private String title; private String text; private boolean done; private Date createdOn; private Date completedOn; // constructors, getters and setters }

Template yang telah dikompilasi dapat dijalankan untuk mendapatkan HTML seperti yang ditunjukkan di bawah ini:

Todo todo = new Todo("Todo 1", "Description"); StringWriter writer = new StringWriter(); m.execute(writer, todo).flush(); String html = writer.toString();

5. Bagian dan Iterasi Kumis

Sekarang mari kita lihat cara membuat daftar todos. Untuk iterasi data daftar, kami menggunakan bagian Mustache.

Bagian adalah sekumpulan kode yang diulangi satu kali atau lebih tergantung pada nilai kunci dalam konteks saat ini.

Itu terlihat seperti:

{{#todo}}  {{/todo}}

A section begins with a pound (#) and ends with a slash (/), where each of the signs is followed by the key whose value is used as the basis for rendering the section.

Following are the scenarios that can occur depending on the value of the key:

5.1. Section With Non-Empty List or Non-False Value

Let's create a template todo-section.mustache which uses a section:

{{#todo}} 

{{title}}

Created on {{createdOn}}

{{text}}

{{/todo}}

Let's look at this template in action:

@Test public void givenTodoObject_whenGetHtml_thenSuccess() throws IOException { Todo todo = new Todo("Todo 1", "Todo description"); Mustache m = MustacheUtil.getMustacheFactory() .compile("todo.mustache"); Map context = new HashMap(); context.put("todo", todo); String expected = "

Todo 1

"; assertThat(executeTemplate(m, todo)).contains(expected); }

Let's create another template todos.mustache for listing the todos:

{{#todos}} 

{{title}}

{{/todos}}

And create a listing of todos using it:

@Test public void givenTodoList_whenGetHtml_thenSuccess() throws IOException { Mustache m = MustacheUtil.getMustacheFactory() .compile("todos.mustache"); List todos = Arrays.asList( new Todo("Todo 1", "Todo description"), new Todo("Todo 2", "Todo description another"), new Todo("Todo 3", "Todo description another") ); Map context = new HashMap(); context.put("todos", todos); assertThat(executeTemplate(m, context)) .contains("

Todo 1

") .contains("

Todo 2

") .contains("

Todo 3

"); }

5.2. Section With Empty List or False or Null Value

Let's test the todo-section.mustache with a null value:

@Test public void givenNullTodoObject_whenGetHtml_thenEmptyHtml() throws IOException { Mustache m = MustacheUtil.getMustacheFactory() .compile("todo-section.mustache"); Map context = new HashMap(); assertThat(executeTemplate(m, context)).isEmpty(); }

And likewise, test todos.mustache with an empty list:

@Test public void givenEmptyList_whenGetHtml_thenEmptyHtml() throws IOException { Mustache m = MustacheUtil.getMustacheFactory() .compile("todos.mustache"); Map context = new HashMap(); assertThat(executeTemplate(m, context)).isEmpty();; }

6. Inverted Sections

Inverted sections are those which are rendered only once based on the non-existence of the key or false or null value or an empty list. In other words, these are rendered when a section is not rendered.

These start with a caret (^) and end with a slash (/) as shown below:

{{#todos}} 

{{title}}

{{/todos}} {{^todos}}

No todos!

{{/todos}}

The above template when provided with an empty list:

@Test public void givenEmptyList_whenGetHtmlUsingInvertedSection_thenHtml() throws IOException { Mustache m = MustacheUtil.getMustacheFactory() .compile("todos-inverted-section.mustache"); Map context = new HashMap(); assertThat(executeTemplate(m, context).trim()) .isEqualTo("

No todos!

"); }

7. Lambdas

The values for keys of a mustache section can be a function or a lambda expression. In such case, the complete lambda expression is invoked by passing in the text within the section as a parameter to the lambda expression.

Let's look at a template todos-lambda.mustache:

{{#todos}} 

{{title}}{{#handleDone}}{{doneSince}}{{/handleDone}}

{{/todos}}

The handleDone resolves kunci untuk Java 8 ekspresi lambda seperti yang ditunjukkan di bawah ini:

public Function handleDone() { return (obj) -> done ? String.format("Done %s minutes ago", obj) : ""; }

HTML yang dihasilkan dengan menjalankan template di atas adalah:

Todo 1

Todo 2

Todo 3Done 5 minutes ago

8. Kesimpulan

Dalam artikel pengantar ini, kita melihat pembuatan template kumis dengan bagian, bagian terbalik, dan lambda. Dan kami menggunakan Java API untuk mengkompilasi dan mengeksekusi template dengan menyediakan data yang relevan.

Ada beberapa fitur Moustache yang lebih canggih yang perlu ditelusuri - seperti:

  • menyediakan callable sebagai nilai yang menghasilkan evaluasi bersamaan
  • menggunakan DecoratedCollection untuk mendapatkan elemen koleksi pertama, terakhir, dan indeks
  • invert API yang memberikan data dengan teks dan template

Dan, seperti biasa, kode sumber lengkap untuk ini tersedia di Github.