Mal med styre

1. Oversikt

I denne veiledningen vil vi se på Handlebars.java-biblioteket for enkel maladministrasjon.

2. Maven-avhengigheter

La oss begynne med å legge til styret avhengighet:

 com.github.jknack styret 4.1.2 

3. En enkel mal

En styremal kan være hvilken som helst tekstfil. Den består av koder som {{name}} og {{#each people}}.

Deretter fyller vi ut disse kodene ved å sende et kontekstobjekt, som en Kart eller andre Gjenstand.

3.1. Ved hjelp av dette

Å passere en singel String verdi for malen vår, kan vi bruke hvilken som helst Gjenstand som kontekst. Vi må også bruke {{dette}} tag i vår mal.

Så kaller styret toString metode på kontekstobjektet og erstatter koden med resultatet:

@Test offentlig ugyldig nårThereIsNoTemplateFile_ThenCompilesInline () kaster IOException {styret styret = nytt styret (); Malmal = handlebars.compileInline ("Hei {{dette}}!"); StrengmalString = template.apply ("Baeldung"); assertThat (templateString) .isEqualTo ("Hei Baeldung!"); }

I eksemplet ovenfor oppretter vi først en forekomst av Styr, vårt API-inngangspunkt.

Deretter gir vi den instansen vår mal. Her, vi passerer bare malen innebygd, men vi får se et øyeblikk noen kraftigere måter.

Til slutt gir vi den kompilerte malen vår kontekst. {{dette}} kommer bare til å ende opp med å ringe toString, det er derfor vi ser “Hei Baeldung!”.

3.2. Passerer en Kart som kontekstobjekt

Vi så nettopp hvordan vi sender en String for vår sammenheng, la oss nå prøve a Kart:

@Test offentlig ugyldig nårParameterMapIsSupplied_thenDisplays () kaster IOException {styret styret = nye styret (); Malmal = handlebars.compileInline ("Hei {{name}}!"); Map parameterMap = nytt HashMap (); parameterMap.put ("navn", "Baeldung"); StrengmalString = template.apply (parameterMap); assertThat (templateString) .isEqualTo ("Hei Baeldung!"); }

I likhet med forrige eksempel kompilerer vi malen vår og sender deretter kontekstobjektet, men denne gangen som en Kart.

Legg også merke til at vi bruker {{Navn}} i stedet for {{dette}}. Dette betyr at kartet vårt må inneholde nøkkelen, Navn.

3.3. Gi et egendefinert objekt som kontekstobjekt

Vi kan også sende et tilpasset objekt til malen vår:

offentlig klasse Person {private Strengnavn; privat boolsk opptatt; privat adresse adresse = ny adresse (); private Listevenner = ny ArrayList (); offentlig statisk klasse Adresse {privat String street; }}

Bruker Person klasse, oppnår vi det samme resultatet som forrige eksempel:

@Test offentlig ugyldig nårParameterObjectIsSupplied_ThenDisplays () kaster IOException {Handlebars handlebars = new Handlebars (); Malmal = handlebars.compileInline ("Hei {{name}}!"); Personperson = ny person (); person.setName ("Baeldung"); StrengmalString = mal.apply (person); assertThat (templateString) .isEqualTo ("Hei Baeldung!"); }

{{Navn}} i malen vår vil bore inn i vår Person innvende og få verdien av Navn felt.

4. Mallastere

Så langt har vi brukt maler som er definert inne i koden. Det er imidlertid ikke det eneste alternativet. Vi kan også lese maler fra tekstfiler.

Handlebars.java gir spesiell støtte for å lese maler fra klassesti, filsystem eller servlet-kontekst. Som standard skanner styret klasseveien for å laste den gitte malen:

@Test offentlig ugyldig nårNoLoaderIsGiven_ThenSearchesClasspath () kaster IOException {Handlebars handlebars = new Handlebars (); Malmal = håndtak.kompil ("hilsen"); Personperson = getPerson ("Baeldung"); StrengmalString = mal.apply (person); assertThat (templateString) .isEqualTo ("Hei Baeldung!"); }

Så fordi vi ringte kompilere i stedet for compileInline, dette er et hint til styret å se etter /hilsen.hbs på klassestien.

Imidlertid kan vi også konfigurere disse egenskapene med ClassPathTemplateLoader:

@Test offentlig ugyldig nårClasspathTemplateLoaderIsGiven_ThenSearchesClasspathWithPrefixSuffix () kaster IOException {TemplateLoader loader = ny ClassPathTemplateLoader ("/ styr", ".html"); Styr styr = nye styr (laster); Malmal = handlebars.compile ("hilsen"); // ... samme som før }

I dette tilfellet forteller vi det Styr for å se etter / håndtak / hilsen.html på klassestien.

Til slutt kan vi kjede flere TemplateLoader forekomster:

@Test offentlig ugyldig når MultipleLoadersAreGiven_ThenSearchesSequentially () kaster IOException {TemplateLoader firstLoader = ny ClassPathTemplateLoader ("/ styr", ".html"); TemplateLoader secondLoader = ny ClassPathTemplateLoader ("/ maler", ".html"); Håndtak styr = nye styr (). Med (firstLoader, secondLoader); // ... samme som før }

Så her har vi to lastere, og det betyr at styrene vil søke i to kataloger etter hilsen mal.

5. Innebygde hjelpere

Innebygde hjelpere gir oss ekstra funksjonalitet når vi skriver malene våre.

5.1. med Hjelper

De med hjelper endrer nåværende kontekst:

{{#with address}} 

Jeg bor i {{street}}

{{/med}}

I vår prøve mal, den {{#with address}} tag starter seksjonen og {{/med}} tag avslutter det.

I det vesentlige borer vi inn i gjeldende kontekstobjekt - la oss si serson - og innstilling adresse som den lokale konteksten for med seksjon. Deretter vil hver feltreferanse i dette avsnittet bli forhåndsbetalt av person. adresse.

{{gate}} tag vil holde verdien av person.adresse.gaten:

@Test offentlig ugyldig nårUsedWith_ThenContextChanges () kaster IOException {Handlebars handlebars = new Handlebars (templateLoader); Malmal = styr.kompil ("med"); Personperson = getPerson ("Baeldung"); person.getAddress (). setStreet ("Verden"); StrengmalString = mal.apply (person); assertThat (templateString) .contains ("

Jeg bor i verden

"); }

Vi sammenstiller malen vår og tildeler en Person forekomst som kontekstobjekt. Legg merke til at Person klassen har en Adresse felt. Dette er feltet vi leverer til med hjelper.

Selv om vi gikk ett nivå inn i kontekstobjektet vårt, er det helt greit å gå dypere hvis kontekstobjektet har flere nestede nivåer.

5.2. Hver Hjelper

De Hver hjelper itererer over en samling:

{{#each friends}} {{name}} er min venn. {{/Hver}}

Som et resultat av å starte og lukke iterasjonsseksjonen med {{#each friends}} og {{/Hver}} styrene vil iterere over venner felt av kontekstobjektet.

@Test offentlig ugyldig nårUsedEach_ThenIterates () kaster IOException {Håndtak styr = nye styr (templateLoader); Malmal = handlebars.compile ("hver"); Personperson = getPerson ("Baeldung"); Person venn1 = getPerson ("Java"); Person venn2 = getPerson ("Vår"); person.getFriends (). legg til (venn1); person.getFriends (). legg til (venn2); StrengmalString = mal.apply (person); assertThat (templateString) .contains ("Java er min venn.", "Våren er min venn."); }

I eksemplet tildeler vi to Person tilfeller til venner felt av kontekstobjektet. Så, styrene gjentar HTML-delen to ganger i den endelige utgangen.

5.3. hvis Hjelper

Til slutt, de hvis hjelper gir betinget gjengivelse.

{{# hvis opptatt}} 

{{name}} er opptatt.

{{ellers}}

{{name}} er ikke opptatt.

{{/hvis}}

I malen vår gir vi forskjellige meldinger i henhold til travel felt.

@Test offentlig ugyldig nårUsedIf_ThenPutsCondition () kaster IOException {Handlebars handlebars = new Handlebars (templateLoader); Malmal = handlebars.compile ("hvis"); Personperson = getPerson ("Baeldung"); person.setBusy (true); StrengmalString = mal.apply (person); assertThat (templateString) .contains ("

Baeldung er opptatt.

"); }

Etter å ha samlet malen, setter vi inn kontekstobjektet. Siden travel feltet er ekteblir den endelige produksjonen

Baeldung er opptatt.

.

6. Egendefinerte malhjelpere

Vi kan også lage våre egne tilpassede hjelpere.

6.1. Hjelper

De Hjelper grensesnitt gjør det mulig for oss å lage en malhjelper.

Som første trinn må vi gi en implementering av Hjelper:

new Helper () {@Override public Object apply (Person context, Options options) kaster IOException {String busyString = context.isBusy ()? "opptatt": "tilgjengelig"; returner context.getName () + "-" + busyString; }}

Som vi kan se, er Hjelper grensesnittet har bare en metode som godtar kontekst og alternativer gjenstander. For våre formål sender vi ut Navn og travel felt av Person.

Etter at vi har opprettet hjelperen, må vi også registrere vår tilpassede hjelper hos styret:

@Test offentlig ugyldig nårHelperIsCreated_ThenCanRegister () kaster IOException {Handlebars handlebars = new Handlebars (templateLoader); handlebars.registerHelper ("isBusy", new Helper () {@Override public Object apply (Person context, Options options) throw IOException {String busyString = context.isBusy ()? "busy": "available"; return context.getName ( ) + "-" + busyString;}}); // detaljer om implementering}

I vårt eksempel registrerer vi hjelperen vår under navnet er opptatt bruker Handbars.registerHelper () metode.

Som det siste trinnet, må vi definere en tag i malen vår ved hjelp av navnet på hjelperen:

{{#isBusy this}} {{/ isBusy}}

Legg merke til at hver hjelper har en start- og sluttkode.

6.2. Hjelpemetoder

Når vi bruker Hjelper grensesnitt, kan vi bare opprette bare en hjelper. I motsetning til dette hjelper en hjelpekilde oss å definere flere malhjelpere.

Videre trenger vi ikke implementere noe spesifikt grensesnitt. Vi skriver bare hjelpermetodene våre i en klasse, og deretter trekker HandleBars ut hjelperdefinisjoner ved hjelp av refleksjon:

offentlig klasse HelperSource {public String isBusy (Person context) {String busyString = context.isBusy ()? "opptatt": "tilgjengelig"; returner context.getName () + "-" + busyString; } // Andre hjelpemetoder}

Siden en hjelperkilde kan inneholde flere hjelperimplementeringer, er registreringen annerledes enn den eneste hjelperregistreringen:

@Test offentlig ugyldig nårHelperSourceIsCreated_ThenCanRegister () kaster IOException {Handlebars handlebars = new Handlebars (templateLoader); handlebars.registerHelpers (ny HelperSource ()); // Implementeringsdetaljer}

Vi registrerer våre hjelpere ved hjelp av Handlebars.registerHelpers () metode. Videre navnet på hjelpemetoden blir navnet på hjelpekoden.

7. Malbruk på nytt

Handlebars-biblioteket gir flere måter å gjenbruke våre eksisterende maler på.

7.1. Mal inkludering

Inkludering av maler er en av tilnærmingene for gjenbruk av maler. Det favoriserer sammensetningen av malene.

Hei {{name}}!

Dette er innholdet i Overskrift mal - header.html.

For å bruke den i en annen mal, må vi referere til Overskrift mal.

{{> header}} 

Dette er siden {{name}}

Vi har side mal - side.html - som inkluderer Overskrift mal ved hjelp av {{> topptekst}}.

Når Handlebars.java behandler malen, vil den endelige utgangen også inneholde Overskrift:

@Test offentlig ugyldig nårOtherTemplateIsReferenced_ThenCanReuse () kaster IOException {Handlebars handlebars = new Handlebars (templateLoader); Malmal = handlebars.compile ("side"); Personperson = ny person (); person.setName ("Baeldung"); StrengmalString = mal.apply (person); assertThat (templateString) .contains ("

Hei Baeldung!

", "

Dette er siden Baeldung

"); }

7.2. Malarv

Alternativt til komposisjon, Håndtak gir arven til malen.

Vi kan oppnå arveforhold ved hjelp av {{#blokkere}} og {{#delvis}} tagger:

  {{#block "intro"}} Dette er intro {{/ block}} {{#block "-meldingen"}} {{/ block}} 

Ved å gjøre det, meldingsbase malen har to blokker - intro og beskjed.

For å bruke arv, må vi overstyre disse blokker i andre maler ved hjelp av {{#delvis}}:

{{#partial "message"}} Hei! {{/ partial}} {{> meldingsbase}}

Dette er enkelhetsmelding mal. Legg merke til at vi inkluderer meldingsbase mal og også overstyre beskjed blokkere.

8. Oppsummering

I denne opplæringen har vi sett på Handlebars.java for å lage og administrere maler.

Vi startet med den grunnleggende bruken av tagger og så på de forskjellige alternativene for å laste inn styrene.

Vi har også undersøkt malhjelpene som gir mye funksjonalitet. Til slutt så vi på de forskjellige måtene å gjenbruke malene våre på.

Til slutt, sjekk kildekoden for alle eksempler på GitHub.


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