Sjablonen met stuur

1. Overzicht

In deze zelfstudie kijken we naar de Handlebars.java-bibliotheek voor eenvoudig sjabloonbeheer.

2. Maven afhankelijkheden

Laten we beginnen met het toevoegen van de stuur afhankelijkheid:

 com.github.jknack stuur 4.1.2 

3. Een eenvoudig sjabloon

Een stuursjabloon kan elk soort tekstbestand zijn. Het bestaat uit tags zoals {{name}} en {{#each people}}.

Vervolgens vullen we deze tags in door een contextobject door te geven, zoals een Kaart of andere Voorwerp.

3.1. Gebruik makend van dit

Om een ​​enkele te passeren Draad waarde toe aan onze sjabloon, kunnen we elke gebruiken Voorwerp als de context. We moeten ook de {{this}} tag in onze sjabloon.

Dan roept Handlebars het toString methode op het contextobject en vervangt de tag door het resultaat:

@Test openbare leegte whenThereIsNoTemplateFile_ThenCompilesInline () gooit IOException {Handlebars handlebars = new Handlebars (); Sjabloon sjabloon = handlebars.compileInline ("Hallo {{this}}!"); String templateString = template.apply ("Baeldung"); assertThat (templateString) .isEqualTo ("Hallo Baeldung!"); }

In het bovenstaande voorbeeld maken we eerst een instantie van Stuur, ons API-toegangspunt.

Vervolgens geven we die instantie onze sjabloon. Hier, we geven de sjabloon gewoon inline door, maar we zullen straks enkele krachtigere manieren zien.

Ten slotte geven we de gecompileerde sjabloon onze context. {{dit}} gaat gewoon bellen toString, daarom zien we "Hallo Baeldung!".

3.2. Passeren van een Kaart als contextobject

We hebben net gezien hoe we een Draad voor onze context, laten we nu een Kaart:

@Test openbare leegte whenParameterMapIsSupplied_thenDisplays () gooit IOException {Handlebars handlebars = new Handlebars (); Sjabloon sjabloon = handlebars.compileInline ("Hallo {{naam}}!"); Map parameterMap = nieuwe HashMap (); parameterMap.put ("naam", "Baeldung"); String templateString = template.apply (parameterMap); assertThat (templateString) .isEqualTo ("Hallo Baeldung!"); }

Net als in het vorige voorbeeld, compileren we onze sjabloon en geven vervolgens het contextobject door, maar dit keer als een Kaart.

Merk ook op dat we {{naam}} in plaats van {{dit}}. Dit betekent dat onze kaart de sleutel moet bevatten, naam.

3.3. Een aangepast object doorgeven als contextobject

We kunnen ook een aangepast object doorgeven aan onze sjabloon:

openbare klasse Persoon {privé Stringnaam; privé boolean bezet; privé adres adres = nieuw adres (); privélijst vrienden = nieuwe ArrayList (); openbare statische klasse Adres {privé Stringstraat; }}

De ... gebruiken Persoon class, bereiken we hetzelfde resultaat als in het vorige voorbeeld:

@Test openbare leegte whenParameterObjectIsSupplied_ThenDisplays () gooit IOException {Handlebars handlebars = new Handlebars (); Sjabloon sjabloon = handlebars.compileInline ("Hallo {{naam}}!"); Persoon persoon = nieuwe persoon (); person.setName ("Baeldung"); String templateString = template.apply (persoon); assertThat (templateString) .isEqualTo ("Hallo Baeldung!"); }

{{naam}} in onze sjabloon zal boren in onze Persoon object en verkrijg de waarde van de naam veld-.

4. Sjabloonladers

Tot nu toe hebben we sjablonen gebruikt die in de code zijn gedefinieerd. Het is echter niet de enige optie. We kunnen ook lees sjablonen uit tekstbestanden.

Handlebars.java biedt speciale ondersteuning voor het lezen van sjablonen uit de klassenpad, bestandssysteem of servlet-context. Handlebars scant standaard het klassenpad om de opgegeven sjabloon te laden:

@Test openbare leegte whenNoLoaderIsGiven_ThenSearchesClasspath () gooit IOException {Handlebars handlebars = new Handlebars (); Sjabloon sjabloon = handlebars.compile ("groet"); Persoon person = getPerson ("Baeldung"); String templateString = template.apply (persoon); assertThat (templateString) .isEqualTo ("Hallo Baeldung!"); }

Dus omdat we hebben gebeld compileren in plaats van compileInline, dit is een hint voor het stuur om naar te zoeken /greeting.hbs op het klassenpad.

We kunnen deze eigenschappen echter ook configureren met ClassPathTemplateLoader:

@Test openbare leegte whenClasspathTemplateLoaderIsGiven_ThenSearchesClasspathWithPrefixSuffix () gooit IOException {TemplateLoader loader = nieuwe ClassPathTemplateLoader ("/ handlebars", ".html"); Stuurstuur = nieuw stuur (lader); Sjabloon sjabloon = handlebars.compile ("groet"); // ... hetzelfde als voorheen }

In dit geval vertellen we het Stuur om te zoeken naar de /handlebars/greeting.html op het klassenpad.

Eindelijk kunnen we meerdere ketenen TemplateLoader gevallen:

@Test openbare leegte whenMultipleLoadersAreGiven_ThenSearchesSequially () gooit IOException {TemplateLoader firstLoader = nieuw ClassPathTemplateLoader ("/ handlebars", ".html"); TemplateLoader secondLoader = nieuwe ClassPathTemplateLoader ("/ templates", ".html"); Handlebars handlebars = new Handlebars (). With (firstLoader, secondLoader); // ... hetzelfde als voorheen }

Dus hier hebben we twee laders, en dat betekent dat Handlebars in twee mappen zal zoeken naar de groet sjabloon.

5. Ingebouwde helpers

Ingebouwde helpers bieden ons extra functionaliteit bij het schrijven van onze sjablonen.

5.1. met Helper

De met helper verandert de huidige context:

{{#with address}} 

Ik woon in {{street}}

{{/met}}

In ons voorbeeldsjabloon is de {{#with address}} tag start de sectie en de {{/met}} tag beëindigt het.

In wezen boren we in het huidige contextobject - laten we zeggen person - en omgeving adres als de lokale context voor het met sectie. Daarna wordt elke veldverwijzing in deze sectie voorafgegaan door persoon.adres.

Dus de {{straat}} tag bevat de waarde van persoon.adres.straat:

@Test public void whenUsedWith_ThenContextChanges () gooit IOException {Handlebars handlebars = new Handlebars (templateLoader); Sjabloon sjabloon = handlebars.compile ("met"); Persoon person = getPerson ("Baeldung"); person.getAddress (). setStreet ("Wereld"); String templateString = template.apply (persoon); assertThat (templateString) .contains ("

Ik leef in de wereld

"); }

We zijn onze sjabloon aan het samenstellen en wijzen een Persoon instantie als het contextobject. Merk op dat de Persoon klasse heeft een Adres veld. Dit is het veld dat we leveren aan de met helper.

Hoewel we een niveau naar ons contextobject zijn gegaan, is het prima om dieper te gaan als het contextobject meerdere geneste niveaus heeft.

5.2. elk Helper

De elk helper herhaalt een verzameling:

{{#each friends}} {{name}} is mijn vriend. {{/elk}}

Als resultaat van het starten en sluiten van de iteratiesectie met {{#each friends}} en {{/elk}} tags, zal het stuur itereren over de vrienden veld van het contextobject.

@Test public void whenUsedEach_ThenIterates () gooit IOException {Handlebars handlebars = new Handlebars (templateLoader); Sjabloon sjabloon = handlebars.compile ("elk"); Persoon person = getPerson ("Baeldung"); Persoon vriend1 = getPerson ("Java"); Persoon vriend2 = getPerson ("Lente"); person.getFriends (). add (vriend1); person.getFriends (). add (vriend2); String templateString = template.apply (persoon); assertThat (templateString) .contains ("Java is mijn vriend.", "Lente is mijn vriend."); }

In het voorbeeld wijzen we er twee toe Persoon instanties naar de vrienden veld van het contextobject. Handlebars herhaalt het HTML-gedeelte dus twee keer in de uiteindelijke uitvoer.

5.3. als Helper

Ten slotte, de als helper biedt voorwaardelijke weergave.

{{#if bezet}} 

{{name}} is bezet.

{{anders}}

{{name}} is niet bezet.

{{/als}}

In onze sjabloon bieden we verschillende berichten aan volgens de bezig veld.

@Test public void whenUsedIf_ThenPutsCondition () gooit IOException {Handlebars handlebars = new Handlebars (templateLoader); Sjabloon sjabloon = handlebars.compile ("if"); Persoon person = getPerson ("Baeldung"); person.setBusy (true); String templateString = template.apply (persoon); assertThat (templateString) .contains ("

Baeldung heeft het druk.

"); }

Na het compileren van de sjabloon stellen we het contextobject in. Sinds de bezig veld is waar, de uiteindelijke output wordt

Baeldung heeft het druk.

.

6. Aangepaste sjabloonhelpers

We kunnen ook onze eigen aangepaste helpers maken.

6.1. Helper

De Helper interface stelt ons in staat om een ​​sjabloonhulp te maken.

Als eerste stap moeten we zorgen voor een implementatie van Helper:

new Helper () {@Override public Object apply (Person context, Options options) gooit IOException {String busyString = context.isBusy ()? "busy": "beschikbaar"; retourneer context.getName () + "-" + busyString; }}

Zoals we kunnen zien, is de Helper interface heeft slechts één methode die de context en opties voorwerpen. Voor onze doeleinden voeren we het naam en bezig velden van Persoon.

Nadat we de helper hebben gemaakt, moeten we ook onze aangepaste helper registreren bij Handlebars:

@Test public void whenHelperIsCreated_ThenCanRegister () gooit IOException {Handlebars handlebars = new Handlebars (templateLoader); handlebars.registerHelper ("isBusy", new Helper () {@Override public Object apply (Person context, Options options) gooit IOException {String busyString = context.isBusy ()? "busy": "available"; return context.getName ( ) + "-" + busyString;}}); // implementatiedetails}

In ons voorbeeld registreren we onze helper onder de naam is bezig de ... gebruiken Handlebars.registerHelper () methode.

Als laatste stap moeten we een tag in onze sjabloon definiëren met de naam van de helper:

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

Merk op dat elke helper een begin- en eindtag heeft.

6.2. Helper-methoden

Wanneer we de Helper interface, kunnen we maar één helper aanmaken. Daarentegen stelt een hulpbronklasse ons in staat om meerdere sjabloonhelpers te definiëren.

Bovendien hoeven we geen specifieke interface te implementeren. We schrijven onze helpermethoden gewoon in een klasse en HandleBars extraheert helper-definities met behulp van reflectie:

openbare klasse HelperSource {openbare tekenreeks isBusy (persoonscontext) {tekenreeks busyString = context.isBusy ()? "busy": "beschikbaar"; retourneer context.getName () + "-" + busyString; } // Andere hulpmethoden}

Aangezien een hulpbron meerdere hulpimplementaties kan bevatten, is de registratie anders dan de enkele hulpregistratie:

@Test openbare leegte whenHelperSourceIsCreated_ThenCanRegister () gooit IOException {Handlebars handlebars = new Handlebars (templateLoader); handlebars.registerHelpers (nieuwe HelperSource ()); // Implementatiedetails}

We registreren onze helpers met behulp van de Handlebars.registerHelpers () methode. Bovendien, de naam van de helper-methode wordt de naam van de helper-tag.

7. Hergebruik van sjabloon

De Handlebars-bibliotheek biedt verschillende manieren om onze bestaande sjablonen opnieuw te gebruiken.

7.1. Sjabloonopname

Het opnemen van sjablonen is een van de benaderingen voor het hergebruik van sjablonen. Het is voorstander van de samenstelling van de sjablonen.

Hallo {{name}}!

Dit is de inhoud van het koptekst sjabloon - header.html.

Om het in een ander sjabloon te gebruiken, moeten we verwijzen naar het koptekst sjabloon.

{{> header}} 

Dit is de pagina {{naam}}

We hebben de bladzijde sjabloon - pagina.html - waaronder de koptekst sjabloon met {{> header}}.

Wanneer Handlebars.java de sjabloon verwerkt, bevat de uiteindelijke uitvoer ook de inhoud van koptekst:

@Test openbare leegte whenOtherTemplateIsReferenced_ThenCanReuse () gooit IOException {Handlebars handlebars = new Handlebars (templateLoader); Sjabloon sjabloon = handlebars.compile ("pagina"); Persoon persoon = nieuwe persoon (); person.setName ("Baeldung"); String templateString = template.apply (persoon); assertThat (templateString) .contains ("

Hallo Baeldung!

", "

Dit is de pagina Baeldung

"); }

7.2. Template Overerving

Als alternatief voor compositie, Handlebars biedt de overerving van de sjabloon.

We kunnen overervingsrelaties tot stand brengen met behulp van de {{#blok}} en {{#partial}} tags:

  {{#block "intro"}} Dit is de intro {{/ block}} {{#block "message"}} {{/ block}} 

Door dit te doen, kan het berichtenbasis sjabloon heeft twee blokken - intro en bericht.

Om overerving toe te passen, moeten we deze overschrijven blokken in andere sjablonen met {{#partial}}:

{{#partial "message"}} Hallo! {{/ gedeeltelijke}} {{> messagebase}}

Dit is de eenvoudig bericht sjabloon. Merk op dat we de berichtenbasis sjabloon en ook de bericht blok.

8. Samenvatting

In deze zelfstudie hebben we Handlebars.java bekeken om sjablonen te maken en te beheren.

We zijn begonnen met het basisgebruik van tags en hebben vervolgens gekeken naar de verschillende opties om de stuursjablonen te laden.

We hebben ook de sjabloonhelpers onderzocht die veel functionaliteit bieden. Ten slotte hebben we gekeken naar de verschillende manieren om onze sjablonen opnieuw te gebruiken.

Bekijk ten slotte de broncode voor alle voorbeelden op GitHub.


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