Bevezetés a bajuszba

1. Áttekintés

Ebben a cikkben a bajusz sablonokra összpontosítunk, és annak egyik Java API-ját használjuk dinamikus HTML tartalom előállításához.

A bajusz egy logikátlan sablonmotor a dinamikus tartalom létrehozásához mint a HTML, többek között a konfigurációs fájlok.

2. Bevezetés

Egyszerűen fogalmazva, a motor besorolása: logikátlan mert nincs olyan konstrukciója, amely támogatná az if-else utasításokat és a ciklusokat.

A Bajusz sablonok körülvett címke nevekből állnak { { } } (amelyek bajuszra hasonlítanak - innen a név), és mögöttük van egy sablon adatait tartalmazó modellobjektum.

3. Maven-függőség

A sablonok összeállítását és végrehajtását több nyelv támogatja - mind kliens, mind szerver oldalon.

A Java-sablonok feldolgozásához használjuk a Java könyvtárát, amely hozzáadható Maven-függőségként.

Java 8+:

 com.github.spullara.mustache.java fordító 0.9.4 

Java 6/7:

 com.github.spullara.mustache.java fordító 0.8.18 

A könyvtár legújabb verzióit a Central Maven Repository-ban ellenőrizhetjük.

4. Használat

Nézzünk meg egy egyszerű forgatókönyvet, amely bemutatja, hogyan:

  1. Írjon egy egyszerű sablont
  2. Fordítsa le a sablont a Java API segítségével
  3. A szükséges adatok megadásával hajtsa végre

4.1. Egyszerű bajusz sablon

Létrehozunk egy egyszerű sablont az aktuális feladat részleteinek megjelenítésére:

{{cím}}

Létrehozva: {{createdOn}}

{{szöveg}}

A fenti sablonban a göndör zárójelek ({{}}) mezői a következők lehetnek:

  • Java osztály metódusai és tulajdonságai
  • kulcsai a Térkép tárgy

4.2. A bajusz sablon fordítása

Összeállíthatjuk a sablont az alábbiak szerint:

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

Bajuszgyár megkeresi az adott sablont az osztályútvonalon. Példánkban elhelyezzük fáj alatt src / main / resources.

4.3. A bajusz sablon végrehajtása

A sablonhoz megadott adatok a Csinálni osztály, amely meghatározása:

nyilvános osztály Todo {privát húr cím; privát karakterlánc szöveg; privát logikai kész; privát Date createdOn; privát A befejezés dátuma; // kivitelezők, szerelvények és beállítók}

A lefordított sablon futtatható a HTML megszerzéséhez, az alábbiak szerint:

Todo todo = új Todo ("Todo 1", "Leírás"); StringWriter író = new StringWriter (); m.execute (író, todo) .flush (); Karakterlánc html = író.toString ();

5. Bajusz szakaszok és iterációk

Most nézzük meg, hogyan lehet felsorolni a todókat. A lista adatainak ismétléséhez a Bajusz szakaszokat használjuk.

A szakasz egy kódblokk, amelyet egy vagy többször megismételnek, a kulcs értékétől függően az aktuális kontextusban.

Úgy néz ki, mint:

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

Egy szakasz fonttal (#) kezdődik és perjellel (/) végződik, ahol az egyes jeleket követi a kulcs, amelynek értékét használják a szakasz renderelésének alapjául.

Az alábbiakban bemutatjuk azokat a forgatókönyveket, amelyek a kulcs értékétől függően előfordulhatnak:

5.1. Szakasz Nem üres listával vagy Nem hamis értékkel

Hozzunk létre egy sablont todo-section.mustache szakaszot használ:

{{#csinálni}} 

{{cím}}

Létrehozva: {{createdOn}}

{{szöveg}}

{{/csinálni}}

Nézzük meg ezt a sablont működés közben:

@Test public void givenTodoObject_whenGetHtml_thenSuccess () dobja az IOException {Todo todo = new Todo ("Todo 1", "Todo description"); Bajusz m = MustacheUtil.getMustacheFactory () .compile ("todo.mustache"); Térkép kontextus = új HashMap (); context.put ("todo", todo); String várható = "

Todo 1

"; assertThat (executeTemplate (m, todo)). tartalmazza (várható);}

Hozzunk létre egy másik sablont todos.mustache a feladatok felsorolásához:

{{#todos}} 

{{cím}}

{{/ todos}}

És hozzon létre egy listát a feladatokról:

@Test public void givenTodoList_whenGetHtml_thenSuccess () dobja az IOException {Bajusz m = MustacheUtil.getMustacheFactory () .compile ("todos.mustache"); Felsorolja a todos = Arrays.asList (új Todo ("Todo 1", "Todo leírás"), új Todo ("Todo 2", "Todo leírás még egy"), új Todo ("Todo 3", "Todo leírás egy másik") ); Térkép kontextus = new HashMap (); context.put ("todos", todos); assertThat (executeTemplate (m, context)) .contains ("

Todo 1

"). tartalmaz ("

Todo 2

"). tartalmaz ("

Todo 3

"); }

5.2. Szakasz üres Lista vagy Hamis vagy Nulla Érték

Teszteljük a todo-section.mustache val,-vel nulla érték:

@Test public void givenNullTodoObject_whenGetHtml_thenEmptyHtml () dobja az IOException {Bajusz m = MustacheUtil.getMustacheFactory () .compile ("todo-section.mustache"); Térkép kontextus = new HashMap (); assertThat (executeTemplate (m, context)). isEmpty (); }

És hasonlóképpen teszteljen todos.mustache üres listával:

@Test public void givenEmptyList_whenGetHtml_thenEmptyHtml () dobja az IOException {Bajusz m = MustacheUtil.getMustacheFactory () .compile ("todos.mustache"); Térkép kontextus = új HashMap (); assertThat (executeTemplate (m, context)). isEmpty () ;; }

6. Fordított szakaszok

Az inverz szakaszok azok, amelyeket a nemlét alapján csak egyszer jelenítenek meg vagy a hamis vagy nulla érték vagy egy üres lista. Más szavakkal, ezek akkor jelennek meg, ha egy szakasz nem jelenik meg.

Ezek kezdőbetűvel (^) kezdődnek és perjellel (/) végződnek az alábbiak szerint:

{{#todos}} 

{{cím}}

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

Nincs semmi!

{{/ todos}}

A fenti sablon üres listával együtt:

@Test public void givenEmptyList_whenGetHtmlUsingInvertedSection_thenHtml () dobja az IOException {Bajusz m = MustacheUtil.getMustacheFactory () .compile ("todos-inverted-section.mustache"); Térkép kontextus = új HashMap (); assertThat (executeTemplate (m, context) .trim ()) .isEqualTo ("

Nincs semmi!

"); }

7. Lambdas

A A bajuszszakasz kulcsainak értékei lehetnek függvények vagy lambda kifejezések. Ebben az esetben a teljes lambda kifejezést úgy hívjuk meg, hogy a szakaszon belüli szöveget paraméterként átadjuk a lambda kifejezésnek.

Nézzünk meg egy sablont todos-lambda.mustache:

{{#todos}} 

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

{{/ todos}}

A handleDone kulcs az alábbiak szerint Java 8 lambda kifejezéssé változik:

public Function handleDone () {return (obj) -> kész? String.format ("Kész% s perccel ezelőtt", obj): ""; }

A fenti sablon végrehajtásával létrehozott HTML:

Todo 1

Todo 2

Todo 3Done 5 perccel ezelőtt

8. Következtetés

Ebben a bevezető cikkben bajusz sablonok létrehozását vizsgáltuk szakaszokkal, fordított szakaszokkal és lambdákkal. És a Java API-t használtuk a sablonok összeállításához és végrehajtásához releváns adatok megadásával.

A Bajusznak van néhány fejlettebb funkciója, amelyeket érdemes felfedezni - például:

  • hívható érték biztosítása, amely párhuzamos értékelést eredményez
  • felhasználásával Dekorált Gyűjtemény a gyűjtési elemek első, utolsó és indexének megszerzéséhez
  • megfordítani API, amely megadja a megadott szöveget és sablont

És mint mindig, ennek teljes forráskódja elérhető a Githubon.