Introduktion til overskæg

1. Oversigt

I denne artikel vil vi fokusere på overskægsskabeloner og bruge en af ​​dens Java API'er til at producere dynamisk HTML-indhold.

Overskæg er en logisk skabelonmotor til oprettelse af dynamisk indhold som HTML, konfigurationsfiler blandt andet.

2. Introduktion

Kort sagt, motoren er klassificeret som logisk fordi det ikke har konstruktioner, der understøtter if-else-udsagn og til sløjfer.

Overskægsskabelonerne består af tagnavne omgivet af { { } } (der ligner overskæg - deraf navnet) og er bakket op af et modelobjekt, der indeholder dataene til skabelonen.

3. Maven-afhængighed

Kompilering og udførelse af skabelonerne understøttes af flere sprog - både klientside og serverside.

For at kunne behandle skabelonerne fra Java bruger vi dets Java-bibliotek, som kan tilføjes som en Maven-afhængighed.

Java 8+:

 com.github.spullara.mustache.java compiler 0.9.4 

Java 6/7:

 com.github.spullara.mustache.java-kompilator 0.8.18 

Vi kan kontrollere de nyeste versioner af biblioteket i Central Maven Repository.

4. Anvendelse

Lad os se på et simpelt scenario, der viser, hvordan man:

  1. Skriv en simpel skabelon
  2. Kompilér skabelonen ved hjælp af Java API
  3. Udfør det ved at give de nødvendige data

4.1. En simpel overskægsskabelon

Vi opretter en simpel skabelon til visning af detaljerne i en todo-opgave:

{{titel}}

Oprettet den {{createdOn}}

{{tekst}}

I ovenstående skabelon kan felterne i de krøllede seler ({{}}) være:

  • metoder og egenskaber for en Java-klasse
  • nøgler til en Kort objekt

4.2. Kompilering af overskægsskabelonen

Vi kan kompilere skabelonen som vist nedenfor:

MustacheFactory mf = ny DefaultMustacheFactory (); Overskæg m = mf.compile ("todo.mustache"); 

Skægfabrik søger efter den givne skabelon i klassestien. I vores eksempel placerer vi todo.mustache under src / main / ressourcer.

4.3. Udførelse af overskægsskabelonen

Dataene, der leveres til skabelonen, vil være en forekomst af At gøre klasse, hvilken definition er:

offentlig klasse Todo {privat streng titel; privat strengtekst; privat boolsk udført; privat dato createdOn; privat Dato afsluttet På; // konstruktører, getters og settere}

Den kompilerede skabelon kan udføres for at få HTML som vist nedenfor:

Todo todo = ny Todo ("Todo 1", "Beskrivelse"); StringWriter-forfatter = ny StringWriter (); m.execute (forfatter, todo) .flush (); String html = writer.toString ();

5. Sektioner og gentagelser af overskæg

Lad os nu se på, hvordan vi viser todos. For at gentage en liste data bruger vi overskægssektioner.

Et afsnit er en blok kode, der gentages en eller flere gange afhængigt af værdien af ​​nøglen i den aktuelle kontekst.

Det ser ud som:

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

En sektion begynder med et pund (#) og slutter med en skråstreg (/), hvor hvert af tegnene efterfølges af den nøgle, hvis værdi bruges som grundlag for gengivelse af sektionen.

Følgende er de scenarier, der kan forekomme afhængigt af nøglens værdi:

5.1. Afsnit med ikke-tom liste eller ikke-falsk værdi

Lad os oprette en skabelon todo-sektion. mustache som bruger et afsnit:

{{#at gøre}} 

{{titel}}

Oprettet den {{createdOn}}

{{tekst}}

{{/at gøre}}

Lad os se på denne skabelon i aktion:

@Test offentlig ugyldighed givenTodoObject_whenGetHtml_thenSuccess () kaster IOException {Todo todo = ny Todo ("Todo 1", "Todo beskrivelse"); Overskæg m = MustacheUtil.getMustacheFactory () .kompil ("todo.mustache"); Kortkontekst = ny HashMap (); context.put ("todo", todo); Streng forventet = "

Todo 1

"; assertThat (executeTemplate (m, todo)). indeholder (forventet);}

Lad os oprette en anden skabelon todos. mustache til notering af todos:

{{#todos}} 

{{titel}}

{{/ todos}}

Og opret en liste over todos ved hjælp af den:

@Test offentlig ugyldighed givenTodoList_whenGetHtml_thenSuccess () kaster IOException {Mustache m = MustacheUtil.getMustacheFactory () .compile ("todos.mustache"); Liste over todos = Arrays.asList (ny Todo ("Todo 1", "Todo beskrivelse"), ny Todo ("Todo 2", "Todo beskrivelse en anden"), ny Todo ("Todo 3", "Todo beskrivelse en anden") ); Kortkontekst = ny HashMap (); context.put ("todos", todos); assertThat (executeTemplate (m, context)) .contains ("

Todo 1

") .indeholder("

Todo 2

") .indeholder("

Todo 3

"); }

5.2. Sektion med tom Liste eller Falsk eller Nul Værdi

Lad os teste todo-sektion. mustache med en nul værdi:

@Test offentlig ugyldighed givenNullTodoObject_whenGetHtml_thenEmptyHtml () kaster IOException {Mustache m = MustacheUtil.getMustacheFactory () .compile ("todo-section.mustache"); Kortkontekst = ny HashMap (); assertThat (executeTemplate (m, context)). er Empty (); }

Og ligeledes test todos. mustache med en tom liste:

@Test offentlig ugyldighed givenEmptyList_whenGetHtml_thenEmptyHtml () kaster IOException {Mustache m = MustacheUtil.getMustacheFactory () .compile ("todos.mustache"); Kortkontekst = ny HashMap (); assertThat (executeTemplate (m, context)). er Tom () ;; }

6. Inverterede sektioner

Inverterede sektioner er dem, der kun gengives en gang baseret på ikke-eksistensen af nøglen eller falsk eller nul værdi eller en tom liste. Med andre ord gengives disse, når en sektion ikke gengives.

Disse starter med et tegn (^) og slutter med en skråstreg (/) som vist nedenfor:

{{#todos}} 

{{titel}}

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

Ingen todos!

{{/ todos}}

Ovenstående skabelon, når den er forsynet med en tom liste:

@Test offentlig ugyldighed givenEmptyList_whenGetHtmlUsingInvertedSection_thenHtml () kaster IOException {Mustache m = MustacheUtil.getMustacheFactory () .compile ("todos-inverteret-sektion.mustache"); Kortkontekst = ny HashMap (); assertThat (executeTemplate (m, context) .trim ()) .isEqualTo ("

Ingen todos!

"); }

7. Lambdas

Det værdier for nøgler til et overskægssektion kan være en funktion eller et lambda-udtryk. I et sådant tilfælde påkræves det komplette lambda-udtryk ved at sende teksten i sektionen som en parameter til lambda-udtrykket.

Lad os se på en skabelon todos-lambda. mustache:

{{#todos}} 

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

{{/ todos}}

Det handleDone nøgle løser et Java 8 lambda-udtryk som vist nedenfor:

public Function handleDone () {return (obj) -> gjort? String.format ("Udført% s minutter siden", obj): ""; }

HTML genereret ved at udføre ovenstående skabelon er:

Todo 1

Todo 2

Todo 3Done for 5 minutter siden

8. Konklusion

I denne indledende artikel kiggede vi på oprettelse af overskægsskabeloner med sektioner, inverterede sektioner og lambdas. Og vi brugte Java API til at kompilere og udføre skabelonerne ved at levere relevante data.

Der er få mere avancerede funktioner i overskæg, der er værd at udforske - såsom:

  • tilvejebringelse af en kaldbar værdi som resulterer i en samtidig evaluering
  • ved brug af Dekoreret samling for at få første, sidste og indeks over indsamlingselementer
  • vende om API, der giver de data, der er givet teksten og skabelonen

Og som altid er den komplette kildekode til dette tilgængelig på Github.


$config[zx-auto] not found$config[zx-overlay] not found