Predlošci s upravljačima

1. Pregled

U ovom uputstvu potražit ćemo knjižnicu Handlebars.java radi jednostavnog upravljanja predlošcima.

2. Ovisnosti Mavena

Počnimo s dodavanjem upravljači ovisnost:

 com.github.jknack volan 4.1.2 

3. Jednostavan predložak

Predložak upravljača može biti bilo koja vrsta tekstualne datoteke. Sastoji se od oznaka poput {{name}} i {{#each people}}.

Zatim te oznake popunjavamo dodavanjem kontekstnog objekta, poput Karta ili drugi Objekt.

3.1. Koristeći ovaj

Da prođe singl Niz vrijednost našeg predloška, ​​možemo koristiti bilo koju Objekt kao kontekst. Također moramo koristiti {{ovo}} tag u našem predlošku.

Tada Handlebars poziva toString metodu na kontekstnom objektu i zamjenjuje oznaku rezultatom:

@Test public void whenThereIsNoTemplateFile_ThenCompilesInline () baca IOException {Handlebars handlebars = new Handlebars (); Predložak predloška = handlebars.compileInline ("Bok {{ovaj}}!"); String templateString = template.apply ("Baeldung"); assertThat (templateString) .isEqualTo ("Zdravo Baeldung!"); }

U gornjem primjeru prvo stvaramo primjerak Upravljači, naša API ulazna točka.

Zatim toj instanci dajemo naš predložak. Ovdje, samo proslijedimo predložak u redu, ali vidjet ćemo za trenutak neke moćnije načine.

Na kraju, kompajliranom predlošku dajemo naš kontekst. {{ovaj}} na kraju će nazvati toString, zbog čega vidimo "Bok Baeldung!".

3.2. Prolazeći pored Karta kao objekt konteksta

Upravo smo vidjeli kako poslati Niz za naš kontekst, sada probajmo a Karta:

@Test public void whenParameterMapIsSupply_thenDisplays () baca IOException {Handlebars handlebars = new Handlebars (); Predložak predloška = handlebars.compileInline ("Bok {{ime}}!"); Mapa parameterMap = novi HashMap (); parameterMap.put ("ime", "Baeldung"); String templateString = template.apply (parameterMap); assertThat (templateString) .isEqualTo ("Zdravo Baeldung!"); }

Slično prethodnom primjeru, mi sastavljamo naš predložak i zatim prosljeđujemo objekt konteksta, ali ovaj put kao Karta.

Također, primijetite da koristimo {{Ime}} umjesto {{ovaj}}. To znači da naša karta mora sadržavati ključ, Ime.

3.3. Prosljeđivanje prilagođenog objekta kao kontekstnog objekta

Također možemo proslijediti prilagođeni objekt našem predlošku:

javni razred Osoba {ime privatnog niza; privatni boolean zauzet; adresa privatne adrese = nova adresa (); privatni popis prijatelja = novi ArrayList (); javna statička klasa Adresa {private String street; }}

Koristiti Osoba razreda, postići ćemo isti rezultat kao i prethodni primjer:

@Test public void whenParameterObjectIsSupply_ThenDisplays () baca IOException {Handlebars handlebars = new Handlebars (); Predložak predloška = handlebars.compileInline ("Bok {{ime}}!"); Osoba osoba = nova osoba (); person.setName ("Baeldung"); String templateString = template.apply (osoba); assertThat (templateString) .isEqualTo ("Zdravo Baeldung!"); }

{{Ime}} u našem predlošku će izbušiti naš Osoba objekt i dobiti vrijednost Ime polje.

4. Uređaji za predloške

Do sada smo koristili predloške koji su definirani unutar koda. Međutim, to nije jedina opcija. Možemo i mi čitati predloške iz tekstualnih datoteka.

Handlebars.java pruža posebnu podršku za čitanje predložaka iz konteksta staze, datotečnog sustava ili servleta. Prema zadanim postavkama, Handlebars skenira put predavanja kako bi učitao zadani predložak:

@Test public void whenNoLoaderIsGiven_ThenSearchesClasspath () baca IOException {Handlebars handlebars = new Handlebars (); Predložak predloška = handlebars.compile ("pozdrav"); Osoba osoba = getPerson ("Baeldung"); String templateString = template.apply (osoba); assertThat (templateString) .isEqualTo ("Zdravo Baeldung!"); }

Dakle, jer smo zvali sastaviti umjesto compileInline, ovo je nagovještaj upravljačima da traže /pozdrav.hbs na razrednoj stazi.

Međutim, ta svojstva možemo konfigurirati i pomoću ClassPathTemplateLoader:

@Test public void whenClasspathTemplateLoaderIsGiven_ThenSearchesClasspathWithPrefixSuffix () baca IOException {TemplateLoader loader = new ClassPathTemplateLoader ("/ handlebars", ".html"); Upravljači upravljača = novi upravljači (utovarivač); Predložak predloška = handlebars.compile ("pozdrav"); // ... isto kao prije }

U ovom slučaju, kažemo Upravljači za traženje /handlebars/greeting.html na razrednoj stazi.

Konačno, možemo povezati višestruke lance TemplateLoader primjerci:

@Test public void whenMultipleLoadersAreGiven_ThenSearchesSequentially () baca IOException {TemplateLoader firstLoader = new ClassPathTemplateLoader ("/ handlebars", ".html"); TemplateLoader secondLoader = novi ClassPathTemplateLoader ("/ predlošci", ".html"); Kormila upravljača = nova upravljača (). With (firstLoader, secondLoader); // ... isto kao prije }

Dakle, evo, imamo dva utovarivača, a to znači da će upravljači tražiti dva direktorija za pozdrav predložak.

5. Ugrađeni pomagači

Ugrađeni pomagači pružaju nam dodatnu funkcionalnost prilikom pisanja naših predložaka.

5.1. s Pomoćnik

The s pomoćnik mijenja trenutni kontekst:

{{# s adresom}} 

Živim u {{street}}

{{/s}}

U našem uzorku predloška, {{# s adresom}} oznaka započinje odjeljak i {{/s}} oznaka ga završava.

U osnovi analiziramo trenutni objekt konteksta - recimo strerson - i postavljanje adresa kao lokalni kontekst za s odjeljak. Nakon toga, svaka referenca polja u ovom odjeljku bit će dodana osoba.adresa.

Dakle, {{ulica}} oznaka će sadržavati vrijednost osoba.adresa.ulica:

@Test public void whenUsedWith_ThenContextChanges () baca IOException {Handlebars handlebars = new Handlebars (templateLoader); Predložak predloška = handlebars.compile ("with"); Osoba osoba = getPerson ("Baeldung"); person.getAddress (). setStreet ("Svijet"); String templateString = template.apply (osoba); assertThat (templateString) .contains ("

Živim u Svijetu

"); }

Sastavljamo naš predložak i dodjeljujemo Osoba primjer kao objekt konteksta. Primijetite da Osoba razred ima Adresa polje. Ovo je polje koje opskrbljujemo s pomoćnik.

Iako smo prešli na jednu razinu u naš objekt konteksta, sasvim je u redu ići dublje ako objekt konteksta ima nekoliko ugniježđenih razina.

5.2. svaki Pomoćnik

The svaki pomoćnik vrši iteraciju nad zbirkom:

{{#each friends}} {{name}} je moj prijatelj. {{/svaki}}

Kao rezultat pokretanja i zatvaranja iteracijskog odjeljka s {{# svaki prijatelj}} i {{/svaki}} oznake, upravljači će se prevlačiti preko prijatelji polje kontekstnog objekta.

@Test public void whenUsedEach_ThenIterates () baca IOException {Handlebars handlebars = new Handlebars (templateLoader); Predložak predloška = handlebars.compile ("svaki"); Osoba osoba = getPerson ("Baeldung"); Osoba prijatelj1 = getPerson ("Java"); Prijatelj osobe2 = getPerson ("Proljeće"); person.getFriends (). add (friend1); person.getFriends (). add (friend2); String templateString = template.apply (osoba); assertThat (templateString) .contains ("Java je moj prijatelj.", "Proljeće je moj prijatelj."); }

U primjeru dodjeljujemo dva Osoba instancama do prijatelji polje kontekstnog objekta. Dakle, Handlebars ponavlja HTML dio dva puta u konačnom izlazu.

5.3. ako Pomoćnik

Posljednje, the ako pomoćnik pruža uvjetni prikaz.

{{# ako je zauzet}} 

{{name}} je zauzeto.

{{drugo}}

{{name}} nije zauzet.

{{/ako}}

U našem predlošku pružamo različite poruke prema zaposlen polje.

@Test public void whenUsedIf_ThenPutsCondition () baca IOException {Handlebars handlebars = new Handlebars (templateLoader); Predložak predloška = handlebars.compile ("ako"); Osoba osoba = getPerson ("Baeldung"); person.setBusy (istina); String templateString = template.apply (osoba); assertThat (templateString) .contains ("

Baeldung je zauzet.

"); }

Nakon sastavljanja predloška postavljamo objekt konteksta. Budući da je zaposlen polje je pravi, konačni izlaz postaje

Baeldung je zauzet.

.

6. Pomoćnici za prilagođene predloške

Također možemo stvoriti vlastite prilagođene pomoćnike.

6.1. Pomoćnik

The Pomoćnik sučelje nam omogućuje stvaranje pomoćnika predloška.

Kao prvi korak moramo osigurati provedbu Pomoćnik:

new Helper () {@Preuzmi javni objekt primjenjuje se (kontekst osobe, opcije Opcije) baca IOException {String busyString = context.isBusy ()? "busy": "dostupno"; vratiti context.getName () + "-" + busyString; }}

Kao što vidimo, Pomoćnik sučelje ima samo jednu metodu koja prihvaća kontekst i mogućnosti predmeta. Za naše svrhe ćemo prikazati Ime i zaposlen polja od Osoba.

Nakon stvaranja pomagača, također moramo registrirati svog prilagođenog pomagača s upravljačima:

@Test public void whenHelperIsCreated_ThenCanRegister () baca IOException {Handlebars handlebars = new Handlebars (templateLoader); handlebars.registerHelper ("isBusy", novi pomagač () {@ Override javni objekt se primjenjuje (kontekst osobe, opcije opcije) baca IOException {String busyString = context.isBusy ()? "busy": "available"; return context.getName ( ) + "-" + zauzetString;}}); // detalji implementacije}

U našem primjeru registriramo našeg pomagača pod imenom isBusy koristiti Ručke.registerHelper () metoda.

Kao posljednji korak u našem predlošku moramo definirati oznaku pomoću imena pomagača:

{{#isBusy ovo}} {{/ isBusy}}

Primijetite da svaki pomoćnik ima početnu i završnu oznaku.

6.2. Metode pomagača

Kada koristimo Pomoćnik sučelje, možemo stvoriti samo jednog pomoćnika. Suprotno tome, klasa pomoćnog izvora omogućuje nam definiranje više pomoćnika predloška.

Štoviše, ne trebamo implementirati neko specifično sučelje. Mi samo napišemo svoje pomoćne metode u klasi, a zatim HandleBars izvlači pomoćne definicije pomoću refleksije:

javna klasa HelperSource {javni String isBusy (Person context) {String busyString = context.isBusy ()? "busy": "dostupno"; vratiti context.getName () + "-" + busyString; } // Ostale pomoćne metode}

Budući da pomoćni izvor može sadržavati više implementacija pomoćnika, registracija se razlikuje od registracije jednog pomoćnika:

@Test public void whenHelperSourceIsCreated_ThenCanRegister () baca IOException {Handlebars handlebars = new Handlebars (templateLoader); handlebars.registerHelpers (novi HelperSource ()); // Detalji provedbe}

Registriramo svoje pomagače pomoću Ručke.registerHelpers () metoda. Štoviše, ime pomoćne metode postaje ime pomoćne oznake.

7. Ponovna upotreba predloška

Biblioteka Handlebars nudi nekoliko načina za ponovnu upotrebu naših postojećih predložaka.

7.1. Uključivanje predloška

Uključivanje predložaka jedan je od pristupa ponovnoj upotrebi predložaka. Favorizira sastav predložaka.

Bok {{name}}!

Ovo je sadržaj Zaglavlje predložak - zaglavlje.html.

Da bismo ga mogli koristiti u drugom predlošku, moramo se pozvati na Zaglavlje predložak.

{{> zaglavlje}} 

Ovo je stranica {{name}}

Mi imamo stranica predložak - page.html - koji uključuje Zaglavlje predložak pomoću {{> zaglavlje}}.

Kada Handlebars.java obradi predložak, konačni izlaz sadržavat će i sadržaj datoteke Zaglavlje:

@Test public void whenOtherTemplateIsReferenced_ThenCanReuse () baca IOException {Handlebars handlebars = new Handlebars (templateLoader); Predložak predloška = handlebars.compile ("stranica"); Osoba osoba = nova osoba (); person.setName ("Baeldung"); String templateString = template.apply (osoba); assertThat (templateString) .contains ("

Bok Baeldung!

", "

Ovo je stranica Baeldung

"); }

7.2. Nasljeđivanje predloška

Alternativno kompoziciji, Ručke pružaju nasljeđivanje predloška.

Nasljedne odnose možemo postići pomoću {{#blok}} i {{#partial}} oznake:

  {{#block "intro"}} Ovo je uvod {{/ block}} {{#block "message"}} {{/ block}} 

Čineći to, baza poruka predložak ima dva bloka - uvod i poruka.

Da bismo primijenili nasljeđivanje, moramo ih nadjačati blokovi u drugim predlošcima pomoću {{#partial}}:

{{#partial "message"}} Bok! {{/ djelomično}} {{> baza podataka}}

Ovo je jednostavna poruka predložak. Primijetite da uključujemo baza poruka predložak i također nadjačavanje poruka blok.

8. Sažetak

U ovom uputstvu pogledali smo Handlebars.java kako bismo stvorili predloške i upravljali njima.

Počeli smo s osnovnom uporabom oznaka, a zatim smo pogledali različite opcije za učitavanje predložaka upravljača.

Također smo istražili pomoćnike predložaka koji pružaju veliku funkcionalnost. Na kraju, pogledali smo različite načine ponovne upotrebe naših predložaka.

Na kraju, provjerite izvorni kod za sve primjere na GitHubu.


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