Introduksjon til bart

1. Oversikt

I denne artikkelen vil vi fokusere på Mustache-maler og bruke en av Java API-ene for å produsere dynamisk HTML-innhold.

Bart er en logikkfri malmotor for å skape dynamisk innhold som HTML, blant annet konfigurasjonsfiler.

2. Introduksjon

Enkelt sagt, motoren er klassifisert som logisk fordi den ikke har konstruksjoner som støtter if-else utsagn og for løkker.

Mustasjmalene består av taggenavn omgitt av { { } } (som ligner bart - derav navnet) og støttes av et modellobjekt som inneholder dataene for malen.

3. Maven avhengighet

Kompilering og utføring av malene støttes av flere språk - både klientsiden og serversiden.

For å kunne behandle malene fra Java bruker vi Java-biblioteket som kan legges til som en Maven-avhengighet.

Java 8+:

 com.github.spullara.mustache.java kompilator 0.9.4 

Java 6/7:

 com.github.spullara.mustache.java kompilator 0.8.18 

Vi kan sjekke de nyeste versjonene av biblioteket i Central Maven Repository.

4. Bruk

La oss se på et enkelt scenario som viser hvordan du:

  1. Skriv en enkel mal
  2. Kompiler malen ved hjelp av Java API
  3. Utfør det ved å oppgi nødvendige data

4.1. En enkel bart mal

Vi skal lage en enkel mal for å vise detaljene i en todo-oppgave:

{{tittel}}

Opprettet den {{createdOn}}

{{tekst}}

I malen ovenfor kan feltene i krøllete bukseseler ({{}}) være:

  • metoder og egenskaper til en Java-klasse
  • nøklene til en Kart gjenstand

4.2. Kompilering av bart-malen

Vi kan kompilere malen som vist nedenfor:

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

MustacheFactory søker etter den gitte malen i klassestien. I vårt eksempel plasserer vi todo. mustache under src / main / resources.

4.3. Utføre bartmal

Dataene som leveres til malen vil være en forekomst av Å gjøre klasse hvilken definisjon er:

offentlig klasse Todo {privat strengetittel; privat strengtekst; privat boolsk gjort; private Date createdOn; privat Dato fullført På; // konstruktører, getters og setters}

Den kompilerte malen kan kjøres for å få HTML som vist nedenfor:

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

5. Mustache-seksjoner og -terterasjoner

La oss nå ta en titt på hvordan du viser listen over todos. For å gjentatte over en liste data bruker vi Mustache seksjoner.

En seksjon er en blokk med kode som gjentas en eller flere ganger, avhengig av verdien av nøkkelen i gjeldende sammenheng.

Det ser ut som:

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

En seksjon begynner med et pund (#) og slutter med en skråstrek (/), hvor hvert av tegnene blir fulgt av nøkkelen hvis verdi brukes som grunnlag for gjengivelse av seksjonen.

Følgende er scenariene som kan oppstå avhengig av verdien på nøkkelen:

5.1. Seksjon med ikke-tom liste eller ikke-falsk verdi

La oss lage en mal todo-seksjon. mustache som bruker en seksjon:

{{#å gjøre}} 

{{tittel}}

Opprettet den {{createdOn}}

{{tekst}}

{{/å gjøre}}

La oss se på denne malen i aksjon:

@Test offentlig ugyldighet givenTodoObject_whenGetHtml_thenSuccess () kaster IOException {Todo todo = new Todo ("Todo 1", "Todo description"); Mustache m = MustacheUtil.getMustacheFactory () .compile ("todo.mustache"); Kartkontekst = nytt HashMap (); context.put ("todo", todo); Streng forventet = "

Todo 1

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

La oss lage en ny mal todos. mustache for oppføring av todos:

{{#todos}} 

{{tittel}}

{{/ todos}}

Og opprett en liste over todos ved hjelp av den:

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

Todo 1

"). inneholder ("

Todo 2

"). inneholder ("

Todo 3

"); }

5.2. Seksjon med tom Liste eller Falsk eller Null Verdi

La oss teste todo-seksjon. mustache med en null verdi:

@Test offentlig ugyldighet gittNullTodoObject_whenGetHtml_thenEmptyHtml () kaster IOException {Mustache m = MustacheUtil.getMustacheFactory () .compile ("todo-section.mustache"); Kartkontekst = nytt HashMap (); assertThat (executeTemplate (m, context)). er Empty (); }

Og på samme måte, test todos. mustache med en tom liste:

@Test offentlig ugyldighet givenEmptyList_whenGetHtml_thenEmptyHtml () kaster IOException {Mustache m = MustacheUtil.getMustacheFactory () .compile ("todos.mustache"); Kartkontekst = nytt HashMap (); assertThat (executeTemplate (m, context)). er Empty () ;; }

6. Inverterte seksjoner

Inverterte seksjoner er de som gjengis bare en gang basert på ikke-eksistensen av nøkkelen eller falsk eller null verdi eller en tom liste. Med andre ord blir disse gjengitt når en seksjon ikke blir gjengitt.

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

{{#todos}} 

{{tittel}}

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

Ingen todos!

{{/ todos}}

Ovenstående mal når den er utstyrt med en tom liste:

@Test offentlig tomrom gittEmptyList_whenGetHtmlUsingInvertedSection_thenHtml () kaster IOException {Mustache m = MustacheUtil.getMustacheFactory () .compile ("todos-invertert-seksjon. Mustache"); Kartkontekst = nytt HashMap (); assertThat (executeTemplate (m, context) .trim ()) .isEqualTo ("

Ingen todos!

"); }

7. Lambdas

De verdier for nøkler til en bart-seksjon kan være en funksjon eller et lambdauttrykk. I så fall påkalles det komplette lambdauttrykket ved å sende inn teksten i seksjonen som en parameter til lambdauttrykket.

La oss se på en mal todos-lambda. mustache:

{{#todos}} 

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

{{/ todos}}

De handleDone nøkkelen løser seg til et Java 8 lambda-uttrykk som vist nedenfor:

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

HTML generert ved å utføre malen ovenfor er:

Todo 1

Todo 2

Todo 3Done for 5 minutter siden

8. Konklusjon

I denne innledende artikkelen så vi på å lage bartmaler med seksjoner, inverterte seksjoner og lambdas. Og vi brukte Java API for å kompilere og utføre malene ved å gi relevante data.

Det er få mer avanserte funksjoner i Mustache som er verdt å utforske - for eksempel:

  • gir en ringbar som en verdi som resulterer i en samtidig evaluering
  • ved hjelp av Dekorert samling for å få første, siste og indeks over samlingselementer
  • invertere API som gir dataene gitt teksten og malen

Og som alltid er den komplette kildekoden for dette tilgjengelig på Github.


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