FreeMarker közös műveletek

1. Bemutatkozás

A FreeMarker egy Java-ban írt sablonmotor, amelyet az Apache Alapítvány karbantart. Használhatjuk a FreeMarker Template Language-t, más néven FTL-t, sok szöveges formátum előállításához, mint weboldalak, e-mailek vagy XML fájlok.

Ebben az oktatóanyagban megnézzük, mit tehetünk a dobozon kívül a FreeMarker-rel, bár vegye figyelembe, hogy meglehetősen konfigurálható, és még jól integrálható a Spring-hez.

Kezdjük el!

2. Gyors áttekintés

Ahhoz, hogy dinamikus tartalmat tudjunk beilleszteni az oldalunkba, meg kell tennünk használjon egy olyan szintaxist, amelyet a FreeMarker ért:

  • ${…} a sablonban a generált kimenetben a göndör zárójelben lévő kifejezés tényleges értékével helyettesítjük - ezt hívjuk interpoláció - pár példa ${1 + 2} és $ {variableName}
  • Az FTL címkék olyanok, mint a HTML címkék (de tartalmazzák a következőt: # vagy @) és a FreeMarker értelmezi őket például
  • A FreeMarker kommentjei a következőkkel kezdődnek <#– és azzal fejezzük be –>

3. A Tartalmazza a címkét

Az FTL tartalmazza irányelv lehetővé teszi számunkra, hogy a DRY elvét kövessük alkalmazásunkban. Meghatározzuk az ismétlődő tartalmat egy fájlban, és újrafelhasználjuk a FreeMarker különböző sablonjainál egyetlen tartalmazza címke.

Az egyik ilyen felhasználási eset az, amikor a menüszakaszt sok oldalra szeretnénk felvenni. Először meghatározzuk a menü szakaszát egy fájl belsejében - hívjuk menü.ftl - a következő tartalommal:

Irányítópult Új végpont hozzáadása

HTML oldalunkon pedig tegyük bele a létrehozottakat menü.ftl:

Irányítópult oldal

És az FTL-t is felvehetjük a töredékeinkbe, ami nagyszerű.

4. Az értéklét kezelése

Az FTL bármelyiket figyelembe veszi nulla érték hiányzó értékként. Így különösen óvatosnak kell lennünk és logika hozzáadása a kezeléshez nullaa sablonunkon belül.

Használhatjuk a ?? operátor ellenőrizze, hogy létezik-e attribútum vagy beágyazott tulajdonság. Az eredmény logikai érték:

$ {attribute ??}

Tehát teszteltük az attribútumot nulla, de ez nem mindig elég. Most definiáljunk egy alapértelmezett értéket ennek a hiányzó értéknek a tartalékaként. Ehhez szükségünk van a ! operátor a változó neve után:

$ {attribute! 'default value'}

Kerek zárójelek segítségével sok beágyazott attribútumot csomagolhatunk.

Például annak ellenőrzéséhez, hogy létezik-e az attribútum, és van-e beágyazott tulajdonsága egy másik beágyazott tulajdonsággal, mindent bepakolunk:

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

Végül mindent összerakva beágyazhatjuk ezeket statikus tartalmak közé:

A tesztelés tanulói tulajdonság létezik: $ {student ??? c}

A hiányzó tanuló alapértelmezett értékének használata: $ {student! 'John Doe'}

Tanuló beágyazott tulajdonságainak becsomagolása: $ {(student.cím. utca) ??? c}

És ha a diák voltak nulla, látnánk:

A tesztelés tanulói tulajdonság létezik: hamis

Alapértelmezett érték használata hiányzó tanulóhoz: John Doe

Tanuló beágyazott tulajdonságainak becsomagolása: hamis

Kérem, vegye észre a további ? c után használt irányelv ??. Azért tettük, hogy a logikai értéket ember által olvasható karakterlánccá alakítsuk át.

5. Az If-Else címke

Vezérlő struktúrák vannak a FreeMarkerben, és a hagyományos if-else valószínűleg ismerős:

Amíg a elseif és más az ágak nem kötelezőek, a feltételeknek logikai értékre kell váltaniuk.

Értékelésünk megkönnyítése érdekében valószínűleg az alábbiak egyikét alkalmazzuk:

  • x == y ellenőrizni is x egyenlő y
  • x! = y visszatérni igaz csak ha x különbözik y
  • x lt y azt jelenti, hogy x szigorúan kisebbnek kell lennie, mint y - használhatjuk is < ahelyett lt
  • x gt y értékeli, hogy igaz csak ha x szigorúan nagyobb, mint y - tudjuk használni > ahelyett gt
  • x lte y teszteli, ha x kisebb vagy egyenlő y - a lte van <=
  • x gte y teszteli, ha x nagyobb vagy egyenlő y - a gte értéke> =
  • x?? ellenőrzésére x
  • szekvencia? seqContains (x) érvényesíti x egy sorozat belsejében

Nagyon fontos ezt szem előtt tartani A FreeMarker a> = és> elemeket tekinti egy FTL címke záró karakterének. A megoldás az, hogy felhasználásukat zárójelbe vagy használat gte vagy gt helyette.

Összeállítva a következő sablonhoz:

$ {status.reason}

Hiányzik az állapot!

Végül a kapott HTML-kódot kapjuk:

404 nem található

Hiányzik az állapot!

6. Alváltozók konténerei

A FreeMarkerben háromféle tároló van az alváltozókhoz:

  • Hashes kulcs-érték párok sorozata - a kulcsnak egyedinek kell lennie a kivonatban, és nincs sorrendünk
  • Szekvenciák olyan listák, amelyekhez indexünk van társítva az egyes értékekhez - figyelemre méltó tény, hogy az alváltozók különböző típusúak lehetnek
  • Gyűjtemények olyan szekvenciák speciális esete, amikor nem férünk hozzá a mérethez, vagy indexek alapján nem tudjuk lekérni az értékeket - akkor is megismételhetjük őket a lista címke mégis!

6.1. Iteráló elemek

Kétféle módon iterálhatunk egy konténer felett. Az első az, ahol az egyes értékeket iteráljuk, és mindegyikhez logika történik:

Vagy amikor meg akarjuk ismételni a Hash, hozzáférés mind a kulcshoz, mind az értékhez:

A második forma erősebb, mert lehetővé teszi számunkra annak a logikának a meghatározását is, amelynek az iteráció különböző lépéseiben kell történnie:

A tétel a hurkolt változó nevét jelenti, de átnevezhetjük arra, amire vágyunk. A más ág választható.

A gyakorlati példához jól definiáljon egy sablont, ahol felsorolunk néhány állapotot:

  • $ {status}

Nincs elérhető állapot

Ez a következő HTML-t adja vissza, amikor a tárolónk van [“200 OK”, “404 nem található”, “500 belső szerver hiba”]:

  • 200 OK
  • 404 nem található
  • 500 Belső Szerver Hiba

6.2. Tételek kezelése

A hash lehetővé teszi számunkra két egyszerű funkciót: kulcsok csak a kulcsokat tartalmazza, és értékek csak az értékek beolvasása.

Egy szekvencia összetettebb; a leghasznosabb függvényeket csoportosíthatjuk:

  • darab és csatlakozik alszekvencia megszerzéséhez vagy két szekvencia kombinálásához
  • fordított, fajta, és Sorrend az elemek sorrendjének módosításához
  • első és utolsó lekérdezi az első vagy az utolsó elemet
  • méret a szekvencia elemek számát jelenti
  • seqContains, seqIndexOf, vagy seqLastIndexOf elemet keresni

7. Típus: Kezelés

A FreeMarker rengeteg funkcióval rendelkezik (beépítettek), amelyek elérhetők az objektumokkal való munkához. Nézzük meg néhány gyakran használt funkciót.

7.1. Húrkezelés

  • url és urlPath URL-ben elhagyja a karakterláncot, azzal a kivétellel urlPath nem fogja elkerülni a perjelet /
  • jString, jsString, és jsonString a szökési szabályokat a Java, a Javascript és a JSON esetében fogja alkalmazni
  • capElőször, uncapElőször, nagybetűs, alacsonyabb eset és nagybetűs hasznosak a karakterláncunk kis- és nagybetűk megváltoztatásához, ahogyan a nevük is mutatja
  • logikai, dátum, idő, dátum idő és szám függvények egy karakterláncból más típusokká konvertálásra

Most használjunk néhányat ezekből a funkciókból:

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

$ {'A "szövegben történő felhasználás"? JsString}

$ {'my value? upperCase}

$ {'2019-01-12'? Date ('éééé-hh-nn')}

És a fenti sablon kimenete a következő lesz:

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

ÉRTÉKEM

A \ "használata a szövegben

12.01.2019

A dátum függvény, átadtuk a String objektum elemzéséhez használt mintát is. A FreeMarker a helyi formátumot használja, hacsak másképp nincs meghatározva, például a húr a dátumobjektumokhoz elérhető funkció.

7.2. Számkezelés

  • kerek, padló és mennyezet segíthet a számok kerekítésében
  • abs szám abszolút értékét adja vissza
  • húr konvertálja a számot karakterlánccá. Négy előre definiált számformátumot is átadhatunk: számítógép, valuta, szám, vagy százalék vagy meghatározzuk a saját formátumunkat, például [ “0.###” ]

Végezzünk néhány matematikai műveletet:

$ {(7,3? Kerek + 3,4? Plafon + 0,1234)? Karakterlánc ('0. ##')}

És ahogy az várható volt, a kapott érték az 11.12.

7.3. Dátum kezelése

  • .Most az aktuális dátum-idő
  • dátum, idő és dátum idő visszaadhatja a dátum és idő objektum dátum és idő szakaszait
  • húr konvertálja a dátum-időket karakterláncokká - átadhatjuk a kívánt formátumot is, vagy használhatunk előre definiált formátumot

Most megkapjuk az aktuális időt és formázzuk a kimenetet egy karakterláncra, amely csak órákat és perceket tartalmaz:

$ {. most? time? string ('HH: mm')}

A kapott HTML a következő lesz:

15:39

8. Kivételek kezelése

Két módon fogjuk látni a FreeMarker sablonok kivételeinek kezelését.

Az első módszer a használat kísérlet-helyreállítás címkék, amelyek meghatározzák, hogy mit kell megpróbálnunk végrehajtani, és egy kódblokk, amelyet hiba esetén végre kell hajtani.

A szintaxis a következő:

Mindkét kísérlet és visszaszerez a címkék kötelezőek. Hiba esetén visszavonja a megkísérelt blokkot, és csak a kódot hajtja végre visszaszerez szakasz.

Ezt a szintaxist szem előtt tartva határozzuk meg a sablonunkat:

Felkészülés az értékelésre

Az attribútum $ {attributeWithPossibleValue ??}

Hiányzik az attribútum

Kész az értékelés

Mikor attributeWithPossibleValue hiányzik, meglátjuk:

Felkészülés az értékelésre

Hiányzik az attribútum

Kész az értékelés

És a kimenet mikor attributeWithPossibleValue létezik:

Felkészülés az értékelésre

Az attribútum 200 OK

Kész az értékelés

A második módszer a FreeMarker beállítása, hogy mi történjen kivételek esetén.

A Spring Boot segítségével ezt egyszerűen konfigurálhatjuk a tulajdonságfájlon keresztül; itt van néhány elérhető konfiguráció:

  • spring.freemarker.setting.template_exception_handler = visszadobás újra dobja a kivételt
  • spring.freemarker.setting.template_exception_handler = debug a verem nyomkövetési információit adja ki az ügyfélnek, majd újra dobja a kivételt.
  • spring.freemarker.setting.template_exception_handler = html_debug kiadja a verem nyomkövetési információit az ügyfélnek, formázza azokat, így általában jól olvashatóak lesznek a böngészőben, majd újra dobja a kivételt.
  • spring.freemarker.setting.template_exception_handler = figyelmen kívül hagyja kihagyja a hibás utasításokat, hagyva, hogy a sablon folytassa a végrehajtást.
  • spring.freemarker.setting.template_exception_handler = alapértelmezett

9. Hívási módszerek

Néha a Java módszereket szeretnénk meghívni a FreeMarker sablonjainkból. Most meglátjuk, hogyan kell csinálni.

9.1. Statikus tagok

A statikus tagok elérésének megkezdéséhez frissíthetjük a globális FreeMarker konfigurációt, vagy hozzáadhatunk egy S-ttaticModels type attribútum a modellen, az attribútum neve alatt statika:

model.addAttribute ("statics", új DefaultObjectWrapperBuilder (új verzió ("2.3.28")) .build (). getStaticModels ());

A statikus elemekhez való hozzáférés egyszerű.

Először a hozzárendelés címke segítségével importáljuk osztályunk statikus elemeit, majd döntünk egy névről, végül pedig a Java osztályútról.

Így importáljuk Math osztály a sablonunkban, mutassa meg a statikus értéket PI mezőt, és használja a statikus értéket hadifogoly módszer:

PI érték: $ {MathUtils.PI}

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

A kapott HTML:

PI érték: 3,142

2 * 10 értéke: 1024

9.2. Babtagok

A Bean tagjaihoz nagyon könnyű hozzáférni: használja a pontot (.) és ez az!

Következő példánkhoz hozzáadunk a Véletlen kifogás a modellünk ellen:

model.addAttribute ("random", új Random ());

A FreeMarker sablonban generáljunk véletlenszerű számot:

Véletlenszerű érték: $ {random.nextInt ()}

Ez hasonló kimenetet eredményez:

Véletlenszerű érték: 1 329 970 768

9.3. Egyéni módszerek

Az egyéni módszer hozzáadásának első lépése az, hogy van egy olyan osztály, amely a FreeMarkert alkalmazza TemplateMethodModelEx felületen, és meghatározza a logikánkat a exec módszer:

public class LastCharMethod megvalósítja a TemplateMethodModelEx {public objektum exec (List argumentumok) dobja a TemplateModelException}

Hozzáadunk egy új osztályunk példányát attribútumként a modellhez:

model.addAttribute ("lastChar", új LastCharMethod ());

A következő lépés az új módszerünk használata a sablonunkon belül:

Utolsó karakter példa: $ {lastChar ('mystring')}

Végül a kapott kimenet:

Utolsó karakter példa: g

10. Következtetés

Ebben a cikkben láthattuk, hogyan kell használni a FreeMarker sablonmotort a projektünkön belül. Összpontosítottunk a közös műveletekre, a különböző objektumok manipulálására és néhány fejlettebb témára.

Ezeknek a kivonatoknak a megvalósítása elérhető a GitHubon.