Skabeloner med styr

1. Oversigt

I denne vejledning ser vi på biblioteket Handlebars.java for nem skabelonadministration.

2. Maven-afhængigheder

Lad os starte med at tilføje styr afhængighed:

 com.github.jknack styr 4.1.2 

3. En simpel skabelon

En styreskabelon kan være enhver form for tekstfil. Den består af tags som {{name}} og {{#each people}}.

Derefter udfylder vi disse tags ved at sende et kontekstobjekt som en Kort eller andre Objekt.

3.1. Ved brug af det her

At passere en enkelt Snor værdi til vores skabelon, kan vi bruge enhver Objekt som kontekst. Vi skal også bruge {{dette}} tag i vores skabelon.

Derefter kalder styret toString metode på kontekstobjektet og erstatter koden med resultatet:

@Test offentligt ugyldigt nårThereIsNoTemplateFile_ThenCompilesInline () kaster IOException {håndtag styr = nye styr (); Skabelonskabelon = handlebars.compileInline ("Hej {{dette}}!"); String templateString = template.apply ("Baeldung"); assertThat (templateString) .isEqualTo ("Hej Baeldung!"); }

I ovenstående eksempel opretter vi først en forekomst af Styr, vores API-indgangssted.

Derefter giver vi den instans vores skabelon. Her, vi passerer bare skabelonen inline, men vi ser om et øjeblik nogle mere kraftfulde måder.

Endelig giver vi den kompilerede skabelon vores kontekst. {{det her}} vil bare ende med at ringe toString, det er derfor, vi ser “Hej Baeldung!”.

3.2. Passerer en Kort som kontekstobjekt

Vi så lige, hvordan vi sender en Snor Lad os prøve en for vores kontekst Kort:

@Test offentlig ugyldig nårParameterMapIsSupplied_thenDisplays () kaster IOException {Styr styr = nye styr (); Skabelonskabelon = handlebars.compileInline ("Hej {{navn}}!"); Map parameterMap = ny HashMap (); parameterMap.put ("navn", "Baeldung"); String templateString = template.apply (parameterMap); assertThat (templateString) .isEqualTo ("Hej Baeldung!"); }

I lighed med det foregående eksempel kompilerer vi vores skabelon og sender derefter kontekstobjektet, men denne gang som en Kort.

Bemærk også, at vi bruger {{navn}} i stedet for {{det her}}. Dette betyder, at vores kort skal indeholde nøglen, navn.

3.3. Videregivelse af et brugerdefineret objekt som kontekstobjekt

Vi kan også videregive et brugerdefineret objekt til vores skabelon:

offentlig klasse person {privat strengnavn; privat boolsk optaget; privat adresse adresse = ny adresse (); private venner på listen = ny ArrayList (); offentlig statisk klasse Adresse {privat String street; }}

Bruger Person klasse opnår vi det samme resultat som det foregående eksempel:

@Test offentligt ugyldigt nårParameterObjectIsSupplied_ThenDisplays () kaster IOException {Styr styr = nye styr (); Skabelonskabelon = handlebars.compileInline ("Hej {{navn}}!"); Person person = ny person (); person.setName ("Baeldung"); String templateString = template.apply (person); assertThat (templateString) .isEqualTo ("Hej Baeldung!"); }

{{navn}} i vores skabelon vil bore i vores Person gøre indsigelse og få værdien af navn Mark.

4. Skabelonlæssere

Indtil videre har vi brugt skabeloner, der er defineret inde i koden. Det er dog ikke den eneste mulighed. Det kan vi også læse skabeloner fra tekstfiler.

Handlebars.java yder særlig support til læsning af skabeloner fra klassesti, filsystem eller servlet-kontekst. Som standard scanner håndtaget klassestien for at indlæse den givne skabelon:

@Test offentligt ugyldig nårNoLoaderIsGiven_ThenSearchesClasspath () kaster IOException {Styr styr = nye styr (); Skabelonskabelon = handlebars.compile ("hilsen"); Person person = getPerson ("Baeldung"); String templateString = template.apply (person); assertThat (templateString) .isEqualTo ("Hej Baeldung!"); }

Så fordi vi ringede udarbejde i stedet for compileInline, dette er et tip til styr at se efter /hilsen.hbs på klassestien.

Vi kan dog også konfigurere disse egenskaber med ClassPathTemplateLoader:

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

I dette tilfælde fortæller vi det Styr til at kigge efter / håndtag / hilsen.html på klassestien.

Endelig kan vi kæde flere TemplateLoader tilfælde:

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

Så her har vi to læssere, og det betyder, at styr vil søge i to mapper efter hilsen skabelon.

5. Indbyggede hjælpere

Indbyggede hjælpere giver os yderligere funktionalitet, når vi skriver vores skabeloner.

5.1. med Hjælper

Det med hjælper hjælper den aktuelle kontekst:

{{# med adresse}} 

Jeg bor i {{street}}

{{/med}}

I vores eksempelskabelon er {{# med adresse}} tag starter sektionen og {{/med}} tag slutter det.

I det væsentlige borer vi ind i det aktuelle kontekstobjekt - lad os sige serson - og indstilling adresse som den lokale kontekst for med afsnit. Derefter vil hver feltreference i dette afsnit blive foretaget af person. adresse.

{{gade}} tag holder værdien af person.adresse.gade:

@Test offentlig ugyldig nårUsedWith_ThenContextChanges () kaster IOException {Handlebars handlebars = new Handlebars (templateLoader); Skabelonskabelon = handlebars.compile ("med"); Person person = getPerson ("Baeldung"); person.getAddress (). setStreet ("Verden"); String templateString = template.apply (person); assertThat (templateString) .contains ("

Jeg bor i verden

"); }

Vi sammensætter vores skabelon og tildeler en Person eksempel som kontekstobjekt. Bemærk, at Person klasse har en Adresse Mark. Dette er det felt, vi leverer til med hjælper.

Selvom vi gik et niveau ind i vores kontekstobjekt, er det helt fint at gå dybere, hvis kontekstobjektet har flere indlejrede niveauer.

5.2. hver Hjælper

Det hver hjælper hjælper over en samling:

{{#each friends}} {{name}} er min ven. {{/hver}}

Som et resultat af at starte og lukke iterationsafsnittet med {{#each friends}} og {{/hver}} tags, styr vil gentage sig over venner felt i kontekstobjektet.

@Test offentlig ugyldig nårUsedEach_ThenIterates () kaster IOException {håndtag styr = nye styr (templateLoader); Skabelonskabelon = handlebars.compile ("hver"); Person person = getPerson ("Baeldung"); Person ven1 = getPerson ("Java"); Person ven2 = getPerson ("Forår"); person.getFriends (). tilføj (ven1); person.getFriends (). tilføj (ven2); String templateString = template.apply (person); assertThat (templateString) .contains ("Java er min ven.", "Spring er min ven."); }

I eksemplet tildeler vi to Person tilfælde til venner felt i kontekstobjektet. Så styret gentager HTML-delen to gange i den endelige output.

5.3. hvis Hjælper

Endelig det hvis hjælper giver betinget gengivelse.

{{# hvis optaget}} 

{{name}} har travlt.

{{andet}}

{{name}} har ikke travlt.

{{/hvis}}

I vores skabelon leverer vi forskellige meddelelser i henhold til travl Mark.

@Test offentlig ugyldig nårUsedIf_ThenPutsCondition () kaster IOException {Styr styr = nye styr (templateLoader); Skabelonskabelon = handlebars.compile ("hvis"); Person person = getPerson ("Baeldung"); person.setBusy (sand); String templateString = template.apply (person); assertThat (templateString) .contains ("

Baeldung har travlt.

"); }

Efter kompilering af skabelonen indstiller vi kontekstobjektet. Siden den travl felt er rigtigt, bliver den endelige output

Baeldung har travlt.

.

6. Brugerdefinerede skabelonhjælpere

Vi kan også oprette vores egne brugerdefinerede hjælpere.

6.1. Hjælper

Det Hjælper interface giver os mulighed for at oprette en skabelon hjælper.

Som det første skridt skal vi give en implementering af Hjælper:

new Helper () {@Override public Object apply (Person context, Options options) throw IOException {String busyString = context.isBusy ()? "optaget": "tilgængelig"; returner context.getName () + "-" + busyString; }}

Som vi kan se, er Hjælper interface har kun en metode, der accepterer sammenhæng og muligheder genstande. Til vores formål udsender vi navn og travl felter af Person.

Efter oprettelsen af ​​hjælperen skal vi også registrere vores brugerdefinerede hjælper med styr:

@Test offentligt ugyldigt 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 ( ) + "-" + optaget streng;}}); // implementeringsoplysninger}

I vores eksempel registrerer vi vores hjælper under navnet har travlt bruger Handlebars.registerHelper () metode.

Som sidste trin skal vi definere et tag i vores skabelon ved hjælp af navnet på hjælperen:

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

Bemærk, at hver hjælper har et start- og sluttag.

6.2. Hjælpemetoder

Når vi bruger Hjælper interface, kan vi kun oprette kun en hjælper. I modsætning hertil giver en hjælperkildeklasse os mulighed for at definere flere skabelonhjælpere.

Desuden behøver vi ikke implementere nogen specifik grænseflade. Vi skriver bare vores hjælpemetoder i en klasse, så udtager HandleBars hjælperedefinitioner ved hjælp af refleksion:

offentlig klasse HelperSource {public String isBusy (Person context) {String busyString = context.isBusy ()? "optaget": "tilgængelig"; returner context.getName () + "-" + busyString; } // Andre hjælpemetoder}

Da en hjælperkilde kan indeholde flere hjælperimplementeringer, er registreringen anderledes end den enkelte hjælperregistrering:

@Test offentligt ugyldigt nårHelperSourceIsCreated_ThenCanRegister () kaster IOException {Handlebars handlebars = new Handlebars (templateLoader); handlebars.registerHelpers (ny HelperSource ()); // Implementeringsoplysninger}

Vi registrerer vores hjælpere ved hjælp af Handlebars.registerHelpers () metode. I øvrigt, navnet på hjælpemetoden bliver navnet på hjælperetaggen.

7. Genbrug af skabeloner

Styrbiblioteket giver flere måder at genbruge vores eksisterende skabeloner på.

7.1. Skabeloninddragelse

Skabeloninddragelse er en af ​​fremgangsmåderne til genbrug af skabeloner. Det favoriserer sammensætningen af ​​skabelonerne.

Hej {{name}}!

Dette er indholdet af header skabelon - header.html.

For at bruge det i en anden skabelon skal vi henvise til header skabelon.

{{> header}} 

Dette er siden {{name}}

Vi har side skabelon - side.html - som inkluderer header skabelon ved hjælp af {{> header}}.

Når Handlebars.java behandler skabelonen, vil den endelige output også indeholde indholdet af header:

@Test offentligt ugyldigt, nårOtherTemplateIsReferenced_ThenCanReuse () kaster IOException {Handlebars handlebars = new Handlebars (templateLoader); Skabelonskabelon = handlebars.compile ("side"); Person person = ny person (); person.setName ("Baeldung"); StrengskabelonString = template.apply (person); assertThat (templateString) .contains ("

Hej Baeldung!

", "

Dette er siden Baeldung

"); }

7.2. Skabelonarv

Alternativt til sammensætning, Styr giver skabelonarven.

Vi kan opnå arveforhold ved hjælp af {{#blok}} og {{#delvis}} tags:

  {{#block "intro"}} Dette er introduktionen {{/ block}} {{#block "meddelelsen"}} {{/ block}} 

Ved at gøre dette, beskedbase skabelon har to blokke - intro og besked.

For at anvende arv skal vi tilsidesætte disse blokke i andre skabeloner ved hjælp af {{#delvis}}:

{{#partial "meddelelse"}} Hej! {{/ partial}} {{> beskedbase}}

Dette er simplemessage skabelon. Bemærk, at vi inkluderer beskedbase skabelon og også tilsidesætte besked blok.

8. Resume

I denne vejledning har vi set på Handlebars.java for at oprette og administrere skabeloner.

Vi startede med den grundlæggende tagbrug og så på de forskellige muligheder for at indlæse håndtagsskabeloner.

Vi undersøgte også skabelonhjælperne, som giver en hel del funktionalitet. Endelig så vi på de forskellige måder at genbruge vores skabeloner på.

Endelig tjek kildekoden for alle eksempler på GitHub.