FreeMarker Common Operations

1. Introduksjon

FreeMarker er en malmotor, skrevet i Java, og vedlikeholdt av Apache Foundation. Vi kan bruke FreeMarker Template Language, også kjent som FTL, for å generere mange tekstbaserte formater som websider, e-post eller XML-filer.

I denne opplæringen ser vi hva vi kan gjøre utenom boksen med FreeMarker, men vær oppmerksom på at den er ganske konfigurerbar og til og med integreres pent med våren.

La oss komme i gang!

2. Rask oversikt

For å injisere dynamisk innhold på sidene våre, må vi bruk en syntaks som FreeMarker forstår:

  • ${…} i malen vil bli erstattet i den genererte utgangen med den faktiske verdien av uttrykket i krøllete parenteser - vi kaller dette interpolasjon - et par eksempler er ${1 + 2} og $ {variableName}
  • FTL-koder er som HTML-koder (men inneholder # eller @) og FreeMarker tolker dem for eksempel
  • Kommentarer i FreeMarker starter med <#– og avslutt med –>

3. Inkluder-taggen

FTL inkludere direktivet er en måte for oss å følge DRY-prinsippet i søknaden vår. Vi vil definere det repeterende innholdet i en fil og bruke det på tvers av forskjellige FreeMarker-maler med enkelt inkludere stikkord.

En slik brukssak er når vi vil inkludere menyseksjonen på mange sider. Først definerer vi menyseksjonen i en fil - vi vil kalle den menu.ftl - med følgende innhold:

Dashboard Legg til nytt endepunkt

Og på HTML-siden vår, la oss ta med de opprettet menu.ftl:

Dashboard-side

Og vi kan også inkludere FTL i fragmentene våre, noe som er flott.

4. Håndtering av verdieksistens

FTL vil vurdere noe null verdi som en manglende verdi. Dermed må vi være ekstra forsiktige og legge til logikk for å håndtere nullinne i malen vår.

Vi kan bruke ?? operatøren for å sjekke om det finnes et attributt, eller en nestet eiendom. Resultatet er en boolsk:

$ {attributt ??}

Så vi har testet attributtet for null, men det er ikke alltid nok. La oss nå definere en standardverdi som en reserve for denne manglende verdien. For å gjøre dette trenger vi ! operatør plassert etter navnet på variabelen:

$ {attributt! 'standardverdi'}

Ved hjelp av runde parenteser kan vi pakke inn mange nestede attributter.

For å sjekke om attributtet eksisterer og har en nestet eiendom med en annen nestet eiendom, pakker vi inn alt:

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

Til slutt, når vi setter alt sammen, kan vi legge disse inn blant statisk innhold:

Testing er studenteiendom: $ {student ??? c}

Bruker standardverdi for savnet student: $ {student! 'John Doe'}

Innpakning av nestede eiendommer: $ {(student.address.street) ??? c}

Og hvis student var null, ville vi se:

Testing er studenteiendom: falsk

Bruker standardverdi for savnet student: John Doe

Innpakking av student nestede eiendommer: falske

Vennligst legg merke til det ekstra ? c direktivet brukt etter ??. Vi gjorde det for å konvertere den boolske verdien til en lesbar streng.

5. If-Else-taggen

Kontrollstrukturer er til stede i FreeMarker, og det tradisjonelle if-else er sannsynligvis kjent:

Mens eller hvis og ellers filialer er valgfrie, må vilkårene løses til en boolsk verdi.

For å hjelpe oss med evalueringene våre, vil vi sannsynligvis bruke en av:

  • x == y å sjekke er x er lik y
  • x! = y å returnere ekte bare hvis x skiller seg fra y
  • x lt y betyr at x må være strengt mindre enn y - vi kan også bruke < i stedet for lt
  • x gt y evaluerer til ekte bare hvis x er strengt tatt større enn y - Vi kan bruke > i stedet for gt
  • x lte y tester hvis x er mindre enn eller lik y - alternativet til lte er <=
  • x gte y tester hvis x er større enn eller lik y - alternativet til gte er> =
  • x ?? for å sjekke eksistensen av x
  • sekvens? seq Inneholder (x) validerer eksistensen av x inne i en sekvens

Det er veldig viktig å huske på det FreeMarker anser> = og> som avsluttende tegn for en FTL-tag. Løsningen er å pakke bruken i parentes eller bruk gte eller gt i stedet.

Sette den sammen for følgende mal:

$ {status.reason}

Mangler status!

Vi ender opp med den resulterende HTML-koden:

404 ikke funnet

Mangler status!

6. Beholdere av undervariabler

I FreeMarker har vi tre typer containere for undervariabler:

  • Hashes er en sekvens av nøkkelverdipar - nøkkelen må være unik inne i hashen, og vi har ikke bestilling
  • Sekvenser er lister der vi har en indeks tilknyttet hver verdi - et bemerkelsesverdig faktum er at undervariabler kan være av forskjellige typer
  • Samlinger er et spesielt tilfelle av sekvenser der vi ikke får tilgang til størrelsen eller henter verdier etter indeks - vi kan fortsatt gjenta dem med liste tag skjønt!

6.1. Itererende gjenstander

Vi kan itereere over en container på to grunnleggende måter. Den første er hvor vi gjentas over hver verdi og har logikk som skjer for hver av dem:

Eller når vi vil gjenta et Hash, får tilgang til både nøkkelen og verdien:

Den andre formen er kraftigere fordi den også lar oss definere logikken som skal skje i forskjellige trinn i iterasjonen:

De punkt representerer navnet på variabelen med sløyfe, men vi kan endre navnet på det vi ønsker. De ellers gren er valgfri.

For et praktisk eksempel, definer godt en mal der vi viser noen statuser:

  • $ {status}

Ingen statuser tilgjengelig

Dette vil gi oss følgende HTML når containeren vår er [“200 OK”, “404 ikke funnet”, “500 intern serverfeil”]:

  • 200 OK
  • 404 ikke funnet
  • 500 Intern serverfeil

6.2. Varebehandling

En hash gir oss to enkle funksjoner: nøklene for å bare hente nøklene som finnes, og verdier for å hente bare verdiene.

En sekvens er mer kompleks; vi kan gruppere de mest nyttige funksjonene:

  • klump og bli med for å få en undersekvens eller kombinere to sekvenser
  • omvendt, sortere, og Sorter etter for å endre rekkefølgen på elementene
  • først og siste vil hente henholdsvis det første eller siste elementet
  • størrelse representerer antall elementer i sekvensen
  • seq Inneholder, seqIndexOf, eller seqLastIndexOf å lete etter et element

7. Type håndtering

FreeMarker kommer med et stort utvalg av funksjoner (innebygde) tilgjengelig for arbeid med objekter. La oss se noen ofte brukte funksjoner.

7.1. Strenghåndtering

  • url og urlPath vil URL-unnslippe strengen, med unntak av at urlPath vil ikke unnslippe skråstrek /
  • jString, jsString, og jsonString vil bruke de rømmende reglene for henholdsvis Java, Javascript og JSON
  • capFirst, uncapFirst, stor bokstav, lavere tilfelle og kapitalisere er nyttige for å endre saken til strengen vår, som antydet av navnene deres
  • boolsk, Dato, tid, dato tid og Nummer er funksjoner for konvertering fra en streng til andre typer

La oss nå bruke noen av disse funksjonene:

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

$ {'Bruker du "i tekst'? JsString}

$ {'verdien min? upperCase}

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

Og utgangen for malen ovenfor vil være:

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

MIN VERDI

Bruker \ "i tekst

12.01.2019

Når du bruker Dato funksjon, har vi også passert mønsteret som skal brukes til å analysere strengobjektet. FreeMarker bruker det lokale formatet med mindre annet er spesifisert, for eksempel i streng funksjon tilgjengelig for datoobjekter.

7.2. Antallhåndtering

  • rund, gulv og tak kan hjelpe med avrunding av tall
  • abs vil returnere tallets absolutte verdi
  • streng konverterer tallet til en streng. Vi kan også passere fire forhåndsdefinerte tallformater: datamaskin, valuta, Nummer, eller prosent eller definere vårt eget format, som [ “0.###” ]

La oss gjøre en kjede av noen få matematiske operasjoner:

$ {(7.3? Runde + 3.4? Tak + 0.1234)? Streng ('0. ##')}

Og som forventet er den resulterende verdien 11.12.

7.3. Datahåndtering

  • .nå representerer gjeldende dato-tid
  • Dato, tid og dato tid kan returnere dato og klokkeslett for objektet dato-klokkeslett
  • streng vil konvertere datatider til strenger - vi kan også passere ønsket format eller bruke et forhåndsdefinert format

Vi skal nå få gjeldende tid og formatere utdataene til en streng som bare inneholder timer og minutter:

$ {. nå? tid? streng ('HH: mm')}

Den resulterende HTML-en vil være:

15:39

8. Unntakshåndtering

Vi ser to måter å håndtere unntak for en FreeMarker-mal.

Den første måten er å bruke forsøk å gjenopprette koder for å definere hva vi skal prøve å utføre og en blokk med kode som skal utføres i tilfelle feil.

Syntaksen er:

Både forsøk og komme seg tagger er obligatoriske. I tilfelle en feil, ruller den den forsøkte blokken tilbake og utfører bare koden i komme seg seksjon.

Med tanke på denne syntaksen, la oss definere malen vår som:

Forbereder evaluering

Attributt er $ {attributeWithPossibleValue ??}

Attributtet mangler

Ferdig med evalueringen

Når attributtWithPossibleValue mangler, vi får se:

Forbereder seg på å evaluere

Attributtet mangler

Ferdig med evalueringen

Og produksjonen når attributtWithPossibleValue eksisterer er:

Forbereder seg på å evaluere

Attributt er 200 OK

Ferdig med evalueringen

Den andre måten er å konfigurere FreeMarker hva som skal skje i tilfelle unntak.

Med Spring Boot konfigurerer vi dette enkelt via egenskapsfil; her er noen tilgjengelige konfigurasjoner:

  • spring.freemarker.setting.template_exception_handler = retrow kaster unntaket på nytt
  • spring.freemarker.setting.template_exception_handler = feilsøking sender ut stabelsporingsinformasjonen til klienten og kaster deretter unntaket på nytt.
  • spring.freemarker.setting.template_exception_handler = html_debug sender ut stabelsporingsinformasjonen til klienten, formaterer den slik at den vanligvis vil være godt lesbar i nettleseren, og kaster deretter unntaket på nytt.
  • spring.freemarker.setting.template_exception_handler = ignorere hopper over de manglende instruksjonene, og lar malen fortsette å kjøre.
  • spring.freemarker.setting.template_exception_handler = standard

9. Anropsmetoder

Noen ganger ønsker vi å ringe Java-metoder fra FreeMarker-maler. Vi får nå se hvordan vi gjør det.

9.1. Statiske medlemmer

For å begynne å få tilgang til statiske medlemmer, kan vi enten oppdatere den globale FreeMarker-konfigurasjonen eller legge til en StaticModels skriv attributt på modellen, under attributtnavnet statikk:

model.addAttribute ("statics", ny DefaultObjectWrapperBuilder (ny versjon ("2.3.28")) .build (). getStaticModels ());

Å få tilgang til statiske elementer er rett frem.

Først importerer vi de statiske elementene i klassen vår ved hjelp av tildelingsmerket, og bestemmer oss deretter for et navn og til slutt Java-klassestien.

Slik importerer vi Matte klasse i malen vår, viser verdien av det statiske PI felt, og bruk det statiske pow metode:

PI-verdi: $ {MathUtils.PI}

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

Den resulterende HTML er:

PI-verdi: 3.142

2 * 10 er: 1.024

9.2. Bønnemedlemmer

Bønnemedlemmer er veldig enkle å få tilgang til: bruk prikken (.) og det er det!

For vårt neste eksempel vil vi legge til en Tilfeldig motsette seg modellen vår:

model.addAttribute ("tilfeldig", ny Random ());

La oss generere et tilfeldig tall i FreeMarker-malen:

Tilfeldig verdi: $ {random.nextInt ()}

Dette vil føre til utdata som ligner på:

Tilfeldig verdi: 1 329 970 768

9.3. Egendefinerte metoder

Det første trinnet for å legge til en tilpasset metode er å ha en klasse som implementerer FreeMarker's TemplateMethodModelEx grensesnitt og definerer logikken vår i utføre metode:

offentlig klasse LastCharMethod implementerer TemplateMethodModelEx {public Object exec (Liste argumenter) kaster TemplateModelException}

Vi legger til en forekomst av den nye klassen som attributt på modellen:

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

Neste trinn er å bruke den nye metoden vår i malen:

Siste tegneksempel: $ {lastChar ('mystring')}

Til slutt er den resulterende produksjonen:

Siste røyeeksempel: g

10. Konklusjon

I denne artikkelen har vi sett hvordan du bruker FreeMarker malmotoren i prosjektet vårt. Vi har fokusert på vanlige operasjoner, hvordan man manipulerer forskjellige objekter og noen få mer avanserte emner.

Implementeringen av alle disse kodebitene er tilgjengelig på GitHub.


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