FreeMarker
Author
Albert FloresFreeMarker je šablonovací systém pro Javu. Je navržen s ohledem na čistotu návrhu podle vzoru MVC. Používá se především pro pohled (view) v prostředí Java Servlets, ale může být použit pro generování textů v libovolném prostředí - např. generování statických webových stránek, konfiguračních souborů, e-mailů…
FreeMarker na rozdíl od JavaServer Pages neumožňuje přímé vkládání Java kódu do šablon a šablony jsou interpretovány až za běhu (nejsou předkompilovány do Java bajtkódu). FreeMarker umožňuje automatický výběr šablony podle zvoleného jazyka - např. +more při požadavku na stránku index. ftl pro jazyk cs_CZ se postupně hledají šablony index_cs_CZ. ftl, index_cs. ftl a index. ftl. FreeMarker rovněž umožňuje používat jakýsi systém dědičnosti šablon. Např. v následující struktuře souborů se při vložení (include) obsahu souboru */menu. ftl do souborů /index. ftl a /aktuality. index. ftl vloží soubor /menu. ftl, do souboru /e-shop/index. ftl se ale vloží /e-shop/menu. ftl: /index. ftl /menu. ftl /aktuality/index. ftl /aktuality/menu. ftl /e-shop/index. ftl /e-shop/menu. ftl.
Ve FreeMarkeru lze vytvářet knihovny šablon, které je následně možné naimportovat do jiné šablony. Při importu je určen jmenný prostor knihovny, takže při importu více knihoven s prvky se shodnými názvy nedochází ke konfliktu jmen.
Příklad
Šablona ve FreeMarkeru:
Ahoj světe! Tito ${lide?size} lidé zdraví svět:
[#list lide as osoba] ${osoba.jmeno} ${osoba.prijmeni} (${osoba.vek} let) z obce ${osoba.obec} [/#list]
Model - Java objekty:
public class Osoba { public Osoba(String jmeno, String prijmeni, int vek, String obec) public String getJmeno { … } public String getPrijmeni { … } public int getVek { … } public String getObec { … } }
List osoby = new LinkedList; osoby. add(new Osoba("Marie", "Černá", 32, "Ostrava")); osoby. +moreadd(new Osoba("František", "Novák", 54, "Brno")); osoby. add(new Osoba("Natálie", "Zajícová", 72, "České Budějovice"));.
Map root = new HashMap; root.put("lide", osoby); //root je předáno FreeMarkeru jako datový model
Po spojení šablony a datového modelu je vygenerován výstup:
Ahoj světe! Tito 3 lidé zdraví svět:
Marie Černá (32 let) z obce Ostrava František Novák (54 let) z obce Brno Natálie Zajícová (72 let) z obce České Budějovice
Datový model - Java
Datový model pro šablonu FreeMarkeru může obsahovat tři typy objektů - skalár (text, číslo, datum a čas, logická hodnota), sekvenci (seřazený seznam objektů) nebo mapu (klíče a odpovídající hodnoty). Skaláry je možné přímo vypisovat do výstupu, případně je formátovat (získat část řetězce, formátovat datum a čas nebo číslo). +more Sekvenci je možné procházet pomocí příkazu [#list seznam as položka]…[/#list]. Mapy je možné procházet pomocí tečkové notace mapa. klíč. FreeMarker poskytuje mapování ze standardních Javovských objektů (řetězce, čísla, logické hodnoty, datum a čas) na skaláry, kolekce mapuje na sekvence a mapy a JavaBeany mapuje na mapy - názvy vlastností (properties) JavaBeanu jsou mapovány jako klíče mapy. Toto mapování může programátor předefinovat a přidat mapování vlastních objektů - takto je např. ve FreemarkerServletu mapován kontext atributů HTTP požadavku, HTTP session a aplikace (servlet kontextu) mapován na mapu Freemarkeru. Jako datový model šablony se Freemarkeru předává mapa objektů.
Šablony
Šablony FreeMarkeru umožňují vypisovat a formátovat skalární hodnoty (pomocí konstrukce ${skalár}). Dále mohou obsahovat podmíněné příkazy, příkaz pro procházení sekvence, vytváření maker (opakujících se částí šablony), importovat knihovny maker z jiných souborů a vkládat jiné šablony. +more Do šablon není možné psát Java kód, příkazy šablon jsou orientovány pouze na prezentační logiku.
Použití v prostředí Java servletů
Při použití v prostředí Java servletů je možné používat knihovny tagů pro JSP (taglibs). Freemarker také poskytuje rozšiřitelný FreemarkerServlet, který je možné namapovat například na vzor *. +moreftl. Všechny soubory s koncovkou . ftl jsou pak zpracovány jako FreeMarker šablony, jako datový model je jim předán sloučený kontext HTTP požadavku, session a aplikace - zadané jméno (např. ${osoba}) se postupně hledá jako atribut v HttpServletRequest, HttpSession a ServletContext. Díky tomu je možné použít FreeMarker jako hotovou knihovnu (bez dalšího rozšiřování), v servletu naplnit potřebné hodnoty (model) do atributů požadavku, session nebo aplikace a následně požadavek předat na soubor s koncovkou . ftl.
Příklad
Šablonu z předchozího příkladu uložíme jako soubor /lide.ftl v kořenovém adresáři webové aplikace. Ve web.xml nakonfigurujeme FreemarkerServlet pro zpracování souborů s příponou .ftl:
Freemarker freemarker.ext.servlet.FreemarkerServlet
TemplatePath /
ContentType text/html
auto_import */freemarker/common.ftl as c
tag_syntax square_bracket
template_update_delay 0
default_encoding UTF-8
1
Freemarker *.ftl
Řídící servlet:
… public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOexception, ServletException { List osoby = new LinkedList; osoby. add(new Osoba("Marie", "Černá", 32, "Ostrava")); osoby. +moreadd(new Osoba("František", "Novák", 54, "Brno")); osoby. add(new Osoba("Natálie", "Zajícová", 72, "České Budějovice"));.
request.setAttribute("lide", osoby); request.getServletContext.getRequestDispatcher("/lide.ftl").forward; } …
Požadavek na tento servlet vygeneruje stejný výstup, jako úvodní příklad.
Odkazy
Související články
Externí odkazy
[url=http://freemarker.org]FreeMarker[/url] *[url=http://fmpp.sourceforge.net]FMPP[/url] preprocesor souborů založený na FreeMarkeru