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:
- Skriv en enkel mal
- Kompiler malen ved hjelp av Java API
- 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.