Uvod u brkove

1. Pregled

U ovom ćemo se članku usredotočiti na predloške Mustachea i upotrijebiti jedan od njegovih Java API-ja za stvaranje dinamičnog HTML sadržaja.

Brkovi su mehanizam predložaka bez logike za stvaranje dinamičkog sadržaja poput HTML-a, između ostalog i konfiguracijske datoteke.

2. Uvod

Jednostavno rečeno, motor je klasificiran kao bez logike jer nema konstrukcije koje podržavaju if-else izraze i za petlje.

Predlošci brkova sastoje se od imena oznaka okruženih { { } } (koji nalikuju brkovima - otuda i naziv), a iza njih stoji objekt modela koji sadrži podatke za predložak.

3. Ovisnost Mavena

Kompilaciju i izvršavanje predložaka podržava više jezika - i na klijentskoj i na poslužiteljskoj strani.

Da bismo mogli obraditi predloške s Jave, koristimo njegovu Java knjižnicu koja se može dodati kao Mavenova ovisnost.

Java 8+:

 com.github.spullara.mustache.java kompajler 0.9.4 

Java 6/7:

 com.github.spullara.mustache.java kompajler 0.8.18 

Najnovije verzije knjižnice možemo provjeriti u središnjem spremištu Maven.

4. Upotreba

Pogledajmo jednostavan scenarij koji pokazuje kako:

  1. Napišite jednostavan predložak
  2. Sastavite predložak pomoću Java API-ja
  3. Izvršite ga davanjem potrebnih podataka

4.1. Jednostavni predložak za brkove

Stvorit ćemo jednostavan predložak za prikaz detalja zadatka:

{{titula}}

Stvoreno {{createdOn}}

{{tekst}}

U gornjem predlošku polja unutar kovrčavih zagrada ({{}}) mogu biti:

  • metode i svojstva Java klase
  • tipke a Karta objekt

4.2. Sastavljanje predloška brkova

Predložak možemo sastaviti kako je prikazano dolje:

MustacheFactory mf = novi DefaultMustacheFactory (); Brkovi m = mf.compile ("todo.mustache"); 

BrkoviTvornica traži zadani predložak na putu predavanja. U našem primjeru smještamo todo.mustache pod, ispod src / glavni / resursi.

4.3. Izvršenje predloška brkova

Podaci dostavljeni u predložak bit će primjer datoteke Napraviti razred čija je definicija:

javni razred Todo {private String naslov; privatni tekst niza; privatna logička vrijednost učinjeno; privatno Datum kreiranja; privatno Datum završetkaOn; // konstruktori, getteri i postavljači}

Sastavljeni predložak može se izvršiti za dobivanje HTML-a kako je prikazano u nastavku:

Todo todo = novi Todo ("Todo 1", "Opis"); StringWriter Writer = novi StringWriter (); m.execute (pisac, todo) .flush (); Niz html = Writer.toString ();

5. Odjeljci i ponavljanja brkova

Pogledajmo sada kako navesti zadaće. Za prevrtanje podataka s popisa koristimo odjeljke Brkovi.

Odjeljak je blok koda koji se ponavlja jedan ili više puta, ovisno o vrijednosti ključa u trenutnom kontekstu.

Izgleda nekako poput:

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

Odjeljak započinje s kilogramom (#) i završava kosom crtom (/), pri čemu svaki od znakova slijedi ključ čija se vrijednost koristi kao osnova za prikaz reza.

Slijede scenariji koji se mogu dogoditi ovisno o vrijednosti ključa:

5.1. Odjeljak s praznim popisom ili neistinitom vrijednošću

Stvorimo predložak todo-presjek.brko koji koristi odjeljak:

{{#napraviti}} 

{{titula}}

Stvoreno {{createdOn}}

{{tekst}}

{{/napraviti}}

Pogledajmo ovaj predložak na djelu:

@Test public void givenTodoObject_whenGetHtml_thenSuccess () baca IOException {Todo todo = new Todo ("Todo 1", "Todo description"); Brkovi m = MustacheUtil.getMustacheFactory () .compile ("todo.mustache"); Map context = new HashMap (); context.put ("todo", todo); Niz se očekuje = "

Todo 1

"; assertThat (executeTemplate (m, todo)). sadrži (očekuje se);}

Stvorimo još jedan predložak todos.brko za navođenje zadataka:

{{#todos}} 

{{titula}}

{{/ todos}}

I stvorite popis zadataka koristeći ga:

@Test javna praznina givenTodoList_whenGetHtml_thenSuccess () baca IOException {Brkovi m = MustacheUtil.getMustacheFactory () .compile ("todos.mustache"); Popis todos = Arrays.asList (novo Todo ("Todo 1", "Opis Todo"), novo Todo ("Todo 2", "Opis Todo drugo"), novo Todo ("Todo 3", "Opis Todo drugo") ); Map context = new HashMap (); context.put ("todos", todos); assertThat (executeTemplate (m, context)) .contains ("

Todo 1

"). sadrži ("

Todo 2

"). sadrži ("

Todo 3

"); }

5.2. Odjeljak s praznim Popis ili Lažno ili Nula Vrijednost

Isprobajmo todo-presjek.brko s null vrijednost:

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

I isto tako, testirajte todos.brko s praznim popisom:

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

6. Obrnuti odjeljci

Obrnuti odjeljci su oni koji se prikazuju samo jednom na temelju nepostojanja ključa ili lažno ili null vrijednost ili prazan popis. Drugim riječima, one se generiraju kad se odjeljak ne generira.

Oni započinju znakom (^) i završavaju kosom crtom (/) kako je prikazano dolje:

{{#todos}} 

{{titula}}

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

Ništa!

{{/ todos}}

Gornji predložak ako je isporučen s praznim popisom:

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

Ništa!

"); }

7. Lambda

The vrijednosti ključeva odjeljka brkova mogu biti funkcija ili lambda izraz. U tom se slučaju poziva na potpuni lambda izraz prosljeđivanjem teksta unutar odjeljka kao parametra na lambda izraz.

Pogledajmo predložak todos-lambda.brko:

{{#todos}} 

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

{{/ todos}}

The handleDone ključ razlučuje na Java 8 lambda izraz kao što je prikazano dolje:

javna funkcija handleDone () {return (obj) -> gotovo? String.format ("Završeno prije% s minuta", obj): ""; }

HTML generiran izvršavanjem gornjeg predloška je:

Todo 1

Todo 2

Todo 3Done prije 5 minuta

8. Zaključak

U ovom uvodnom članku pogledali smo stvaranje predloga za brkove s odjeljcima, obrnutim odjeljcima i lambdama. I koristili smo Java API za sastavljanje i izvršavanje predložaka davanjem relevantnih podataka.

Postoji nekoliko naprednijih značajki Brkova koje vrijedi istražiti - poput:

  • pružanje pozivanja kao vrijednosti što rezultira istodobnom procjenom
  • koristeći UređenaZbirka dobiti prvi, zadnji i indeks elemenata kolekcije
  • obrnuti API koji daje podatke s obzirom na tekst i predložak

I kao i uvijek do sada, cjeloviti izvorni kod dostupan je na Githubu.