FreeMarker uobičajene operacije

1. Uvod

FreeMarker je mehanizam predložaka, napisan na Javi, a održava ga Apache Foundation. Jezik predloška FreeMarker, poznat i kao FTL, možemo koristiti za generiranje mnogih formata zasnovanih na tekstu, poput web stranica, e-pošte ili XML datoteka.

U ovom uputstvu vidjet ćemo što možemo učiniti odjednom s FreeMarker-om, iako imajte na umu da je prilično prilagodljiv i čak se lijepo integrira s Springom.

Započnimo!

2. Brzi pregled

Da bismo ubrizgali dinamički sadržaj u naše stranice, moramo koristite sintaksu koju FreeMarker razumije:

  • ${…} u predlošku će se u generiranom izlazu zamijeniti stvarnom vrijednošću izraza unutar kovrčavih zagrada - mi to zovemo interpolacija - nekoliko primjera je ${1 + 2} i $ {varijablaName}
  • FTL oznake su poput HTML oznaka (ali sadrže # ili @), a FreeMarker ih, na primjer, tumači
  • Komentari u FreeMarkeru počinju sa <#– i završi s –>

3. Oznaka Include

FTL uključuju Direktiva je način da slijedimo načelo SUHOG u svojoj primjeni. Definirat ćemo repetitivni sadržaj u datoteci i ponovno ga koristiti na različitim FreeMarker predlošcima s single uključuju označiti.

Jedan od takvih slučajeva je kada želimo uključiti odjeljak izbornika unutar mnogih stranica. Prvo ćemo definirati odjeljak izbornika unutar datoteke - nazvat ćemo ga izbornik.ftl - sa sljedećim sadržajem:

Nadzorna ploča Dodaj novu krajnju točku

A na našu HTML stranicu uključimo i stvoreno izbornik.ftl:

Stranica nadzorne ploče

A u svoje fragmente možemo uključiti i FTL, što je sjajno.

4. Rukovanje postojanjem vrijednosti

FTL će razmotriti bilo koji null vrijednost kao vrijednost koja nedostaje. Stoga moramo biti izuzetno oprezni i dodati logiku za rukovanje nullunutar našeg predloška.

Možemo koristiti ?? operator da provjeri postoji li atribut ili ugniježđeno svojstvo. Rezultat je logička vrijednost:

$ {atribut ??}

Dakle, testirali smo atribut za null, ali to nije uvijek dovoljno. Definirajmo sada zadanu vrijednost kao zamjensku za ovu vrijednost koja nedostaje. Da bismo to učinili, potreban nam je ! operator smješten iza imena varijable:

$ {atribut! 'zadana vrijednost'}

Korištenjem okruglih zagrada možemo umotati mnoge ugniježđene atribute.

Na primjer, da provjerimo postoji li atribut i ima li ugniježđeno svojstvo s drugim ugniježđenim svojstvom, omotavamo sve:

$ {(attribute.nestedProperty.nestedProperty) ??}

Konačno, stavljajući sve zajedno, možemo ugraditi ovo među statički sadržaj:

Testiranje je svojstvo učenika postoji: $ {student ??? c}

Upotreba zadane vrijednosti za nestalog učenika: $ {student! 'John Doe'}

Omotavanje ugniježđenih svojstava učenika: $ {(student.address.street) ??? c}

I, ako je student bili null, vidjeli bismo:

Testiranje je svojstvo učenika postoji: false

Korištenje zadane vrijednosti za nestalog učenika: John Doe

Omotavanje ugniježđenih svojstava učenika: netačno

Molimo primijetite dodatni ? c direktiva korištena nakon ??. Učinili smo to da pretvorimo logičku vrijednost u čitljiv niz.

5. Oznaka If-Else

Kontrolne strukture su prisutne u FreeMarkeru, a tradicionalni if-else vjerojatno je poznat:

Dok inače i drugo grane nisu obvezne, uvjeti se moraju razriješiti na logičku vrijednost.

Da bismo nam pomogli s našim procjenama, vjerojatno ćemo koristiti jedan od sljedećih:

  • x == y provjeriti je x jednako je g
  • x! = y vratiti pravi samo ako x razlikuje se od g
  • x lt y znači da x mora biti strogo manji od g - također možemo koristiti < umjesto lt
  • x gt y ocjenjuje do pravi samo ako x je strogo veći od g - možemo koristiti > umjesto gt
  • x lte y testovi ako x je manje ili jednako g - alternativa za lte je <=
  • x gte y testovi ako x je veći ili jednak g - alternativa gte je> =
  • x?? provjeriti postojanje x
  • slijed? seqSadrži (x) potvrđuje postojanje x unutar niza

Vrlo je važno imati na umu da FreeMarker smatra> = i> završnim znakovima za FTL oznaku. Rješenje je umotati njihovu upotrebu u zagrade ili koristiti gte ili gt umjesto toga.

Sastavljajući ga, za sljedeći predložak:

$ {status.reason}

Nedostaje status!

Dobijamo rezultirajući HTML kôd:

404 nije pronađeno

Nedostaje status!

6. Spremnici pod-varijabli

U FreeMarkeru imamo tri vrste spremnika za pod-varijable:

  • Hashevi su slijed parova ključ / vrijednost - ključ mora biti jedinstven unutar hasha i nemamo poredak
  • Slijed su popisi na kojima imamo indeks povezan sa svakom vrijednošću - vrijedna je pažnje činjenica da pod-varijable mogu biti različitih vrsta
  • Zbirke su poseban slučaj sekvenci u kojima ne možemo pristupiti veličini ili dohvatiti vrijednosti indeksom - još uvijek ih možemo ponoviti pomoću popis tag ipak!

6.1. Predmeti koji ponavljaju

Prelazimo preko spremnika na dva osnovna načina. Prvo je mjesto u kojem ponavljamo svaku vrijednost i događa se logika za svaku od njih:

Ili, kada želimo ponoviti a Hash, pristup i ključu i vrijednosti:

Drugi je oblik moćniji jer nam također omogućuje definiranje logike koja bi se trebala dogoditi u različitim koracima u iteraciji:

The artikal predstavlja ime petlje varijable, ali možemo je preimenovati u ono što želimo. The drugo grana nije obavezna.

Za praktični primjer dobro definirajte predložak u kojem navodimo neke statuse:

  • $ {status}

Nema dostupnih statusa

Ovo će nam vratiti sljedeći HTML kada je naš spremnik [„200 u redu“, „404 nije pronađeno“, „500 interna pogreška poslužitelja“]:

  • 200 OK
  • 404 nije pronađeno
  • 500 Interna pogreška poslužitelja

6.2. Rukovanje predmetima

Hash nam omogućuje dvije jednostavne funkcije: tipke da biste preuzeli samo sadržane ključeve i vrijednosti dohvatiti samo vrijednosti.

Niz je složeniji; možemo grupirati najkorisnije funkcije:

  • komad i pridružiti da biste dobili podred ili kombinirali dvije sekvence
  • obrnuti, vrsta, i poredaj za izmjenu redoslijeda elemenata
  • prvi i posljednji dohvatit će prvi odnosno zadnji element
  • veličina predstavlja broj elemenata u nizu
  • seqSadrži, seqIndexOf, ili seqLastIndexOf tražiti element

7. Rukovanje tipom

FreeMarker dolazi s velikim brojem funkcija (ugrađenih) dostupnih za rad s objektima. Pogledajmo neke često korištene funkcije.

7.1. Rukovanje žicama

  • url i urlPath URL će izbjeći niz, s izuzetkom da urlPath neće pobjeći iz kose crte /
  • jString, jsString, i jsonString primijenit će izbjegavajuća pravila za Javu, Javascript i JSON
  • capFirst, uncapPrvo, gornji slučaj, lowerCase i kapitalizirati korisni su za promjenu slučaja našeg niza, kako se podrazumijevaju njihova imena
  • boolean, datum, vrijeme, Datum vrijeme i broj su funkcije za pretvaranje iz niza u druge vrste

Koristimo sada nekoliko tih funkcija:

$ {'// myurl.com/?search=Hello World'? urlPath}

$ {'Upotreba "u tekstu'? JsString}

$ {'moja vrijednost? upperCase}

$ {'2019-01-12'? Date ('yyyy-MM-dd')}

I izlaz za gornji predložak bit će:

http% 3A // myurl.com /% 3Fsearch% 3DHello% 20World

MOJA VRIJEDNOST

Upotreba \ "u tekstu

12.01.2019

Kada koristite datum funkcije, također smo proslijedili obrazac koji ćemo koristiti za raščlanjivanje String objekta. FreeMarker koristi lokalni format, osim ako nije drugačije naznačeno, na primjer u niz funkcija dostupna za datumske objekte.

7.2. Rukovanje brojevima

  • krug, kat i strop može pomoći oko zaokruživanja brojeva
  • trbušnjaci vratit će apsolutnu vrijednost broja
  • niz pretvorit će broj u niz. Također možemo proći četiri unaprijed definirana formata brojeva: Računalo, valuta, broj, ili posto ili definirajte vlastiti format, na primjer [ “0.###” ]

Napravimo lanac od nekoliko matematičkih operacija:

$ {(7,3? Okrugli + 3,4? Strop + 0,1234)? Niz ('0. ##')}

I kao što se očekivalo, rezultirajuća vrijednost je 11.12.

7.3. Rukovanje datumima

  • .sada predstavlja trenutni datum-vrijeme
  • datum, vrijeme i Datum vrijeme može vratiti odjeljke datuma i vremena objekta datum-vrijeme
  • niz pretvorit će datume u nizove - također možemo proslijediti željeni format ili upotrijebiti unaprijed definirani

Sada ćemo dobiti trenutno vrijeme i oblikovati izlaz u niz koji sadrži samo sate i minute:

$ {. sada? vrijeme? string ('HH: mm')}

Dobiveni HTML bit će:

15:39

8. Rukovanje iznimkama

Vidjet ćemo dva načina za rukovanje iznimkama za predložak FreeMarker.

Prvi način je korištenje pokušati-oporaviti oznake da definiraju što bismo trebali pokušati izvršiti i blok koda koji bi se trebao izvršiti u slučaju pogreške.

Sintaksa je:

Oba pokušaj i oporavak oznake su obvezne. U slučaju pogreške, vraća se pokušani blok i izvršit će samo kôd u oporavak odjeljak.

Imajući ovu sintaksu na umu, definirajmo naš predložak kao:

Priprema za procjenu

Atribut je $ {attributeWithPossibleValue ??}

Atribut nedostaje

Gotovo s ocjenom

Kada attributeWithPossibleValue nedostaje, vidjet ćemo:

Priprema za procjenu

Atribut nedostaje

Gotovo s ocjenom

I izlaz kad attributeWithPossibleValue postoji je:

Priprema za procjenu

Atribut je 200 OK

Gotovo s ocjenom

Drugi način je konfiguriranje FreeMarker-a što bi se trebalo dogoditi u slučaju iznimki.

S Spring Bootom to lako konfiguriramo putem datoteke svojstava; evo nekoliko dostupnih konfiguracija:

  • spring.freemarker.setting.template_exception_handler = ponovno bacanje ponovno baca iznimku
  • spring.freemarker.setting.template_exception_handler = otklanjanje pogrešaka izlazi informacije o praćenju steka na klijenta, a zatim ponovno izbacuje iznimku.
  • spring.freemarker.setting.template_exception_handler = html_debug izbacuje informacije o praćenju steka na klijenta, formatirajući ih tako da će ih obično biti dobro čitljive u pregledniku, a zatim ponovno izuzima iznimku.
  • spring.freemarker.setting.template_exception_handler = zanemari preskače neuspjele upute, dopuštajući da se predložak i dalje izvršava.
  • spring.freemarker.setting.template_exception_handler = zadani

9. Metode pozivanja

Ponekad želimo nazvati Java metode iz naših FreeMarker predložaka. Sad ćemo vidjeti kako to učiniti.

9.1. Statični članovi

Da bismo započeli pristup statičkim članovima, mogli bismo ili ažurirati našu globalnu konfiguraciju FreeMarker ili dodati StaticModels atribut type na modelu, pod imenom atributa statika:

model.addAttribute ("statics", novi DefaultObjectWrapperBuilder (nova verzija ("2.3.28")) .build (). getStaticModels ());

Pristup statičkim elementima je jednostavan.

Prvo uvozimo statičke elemente naše klase pomoću oznake assign, zatim odlučujemo o imenu i, na kraju, o Java stazi.

Evo kako ćemo uvesti Matematika klase u našem predlošku, pokažite vrijednost static PI polje i upotrijebite static prah metoda:

Vrijednost PI: $ {MathUtils.PI}

2 * 10 je: $ {MathUtils.pow (2, 10)}

Dobiveni HTML je:

Vrijednost PI: 3.142

2 * 10 je: 1.024

9.2. Članovi graha

Članovima graha vrlo je jednostavno pristupiti: upotrijebi točku (.) i to je to!

Za sljedeći ćemo primjer dodati a Slučajno prigovor našem modelu:

model.addAttribute ("random", novi Random ());

U našem predlošku FreeMarker generirajmo slučajni broj:

Slučajna vrijednost: $ {random.nextInt ()}

To će uzrokovati izlaz sličan:

Slučajna vrijednost: 1.329.970.768

9.3. Prilagođene metode

Prvi korak za dodavanje prilagođene metode je postojanje klase koja implementira FreeMarker-ove TemplateMethodModelEx sučelje i definira našu logiku unutar izvršiti metoda:

javna klasa LastCharMethod provodi TemplateMethodModelEx {javni objekt exec (argumenti popisa) baca TemplateModelException}

Dodati ćemo primjerak naše nove klase kao atribut na modelu:

model.addAttribute ("lastChar", nova LastCharMethod ());

Sljedeći je korak korištenje naše nove metode unutar našeg predloška:

Posljednji primjer znaka: $ {lastChar ('mystring')}

Konačno, rezultirajući izlaz je:

Posljednji primjer char: g

10. Zaključak

U ovom smo članku vidjeli kako koristiti mehanizam predloška FreeMarker unutar našeg projekta. Usredotočili smo se na uobičajene operacije, kako manipulirati različitim objektima i nekoliko naprednijih tema.

Implementacija svih ovih isječaka dostupna je na GitHubu.