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.