Programování

Spusťte Velocity Template Engine

Velocity Template Engine umožňuje vykreslovat data z aplikací a servletů. Velocity, které se primárně používá k vývoji dynamických webových stránek založených na servletech, je díky čistému oddělení šablony a kódu Java ideální pro vývoj webových aplikací MVC. Jako obecný stroj šablony Velocity vyhovuje mnoha dalším účelům, jako je generování kódu, generování a transformace XML a zpracování textového proudu. Tento článek představuje jazyk Velocity Template Language (VTL) a poskytuje příklady použití motoru Velocity, včetně způsobu generování webového obsahu v prostředí servletu Java.

Velocity je open source šablonový nástroj vyvinutý mezinárodní komunitou dobrovolníků a hostovaný v Jakartském projektu Apache Software Foundation. Na webových stránkách projektu Velocity v Jakartě, kde si můžete stáhnout volně dostupný zdrojový kód, je prosperující a rostoucí komunita uživatelů připravena odpovídat na otázky a nabízet řešení běžných problémů se šablonami. Společnost Velocity byla inspirována průkopnickým projektem WebMacro, za který jsme v komunitě Velocity vděční.

V tomto článku představuji krátký úvod do Velocity Template Engine a jeho šablony jazyka, Velocity Template Language (VTL). Na několika příkladech také ukazuji, jak používat rychlost.

Ahoj světe, samozřejmě

Žádné vysvětlení předmětu souvisejícího s programováním by nebylo úplné bez příkladu Hello World. Jakákoli aplikace používající Velocity vyžaduje dvě části. První je šablona, ​​kterou v tomto příkladu nazývá soubor helloworld.vm:

 Ahoj $ jméno! Vítejte na Velocity! 

Druhým je odpovídající program Java s názvem HelloWorld.java:

import java.io.StringWriter; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; public class HelloWorld {public static void main (String [] args) throws Exception {/ * first, get and initialize an engine * / VelocityEngine ve = new VelocityEngine (); ve.init (); / * dále získáte šablonu * / Template t = ve.getTemplate ("helloworld.vm"); / * vytvořit kontext a přidat data * / VelocityContext context = new VelocityContext (); context.put ("name", "World"); / * nyní vykreslí šablonu na StringWriter * / StringWriter Writer = nový StringWriter (); t.merge (kontext, autor); / * zobrazit svět * / System.out.println (writer.toString ()); }} 

Nyní, když kompilujete a spustíte tento program, uvidíte výstup:

 Ahoj světe! Vítejte na Velocity! 

Toto je triviální příklad, ale obsahuje klíčové kousky, které vám poskytnou představu o tom, o čem je Velocity templating.

Proč bych to měl používat?

Velocity, navržené jako snadno použitelný obecný šablonový nástroj, je užitečné v jakékoli oblasti aplikace Java, která vyžaduje formátování a prezentaci dat. Měli byste použít rychlost z následujících důvodů:

  • Přizpůsobuje se mnoha aplikačním oblastem
  • Nabízí jednoduchou a jasnou syntaxi pro návrháře šablon
  • Nabízí jednoduchý programovací model pro vývojáře
  • Protože šablony a kód jsou oddělené, můžete je vyvíjet a udržovat samostatně
  • Motor Velocity se snadno integruje do libovolného prostředí Java aplikací, zejména servletů
  • Rychlost umožňuje šablonám přístup k jakékoli veřejné metodě datových objektů v kontextu

Poslední bod je důležitý - to znamená, že můžete znovu použít své stávající třídy. Objekty, které chcete použít ve svých šablonách, tedy nemusí být určitým způsobem strukturovány, například JavaBeans, nebo implementovat speciální I / O nebo režimy životního cyklu, jako jsou taglibs JSP (JavaServer Pages). Jediným požadavkem je, aby metody byly veřejné. Uvidíte více z toho, když podrobně pokryjeme jazyk šablony.

Jednou ze silných stránek společnosti Velocity je, že silně prosazuje oddělení funkční odpovědnosti v rámci aplikace. Dělá to omezením přístupu šablony k objektům, které kód aplikace konkrétně zpřístupňuje. To znamená, že návrháři se mohou soustředit výhradně na prezentaci dat (pohled) a aplikační programátor se mohou soustředit na řízení aplikací (řadič) a obchodní logiku a správu dat (model) v Model-View-Controller (MVC). rozvoj. MVC je dobře přijímaný vývojový vzor, ​​který zjednodušuje vývoj i průběžnou údržbu sofistikovaných aplikací.

Kde ji použiji?

Rychlost se úspěšně používá v:

  • Servletové webové aplikace
  • Generování kódu Java a SQL
  • Zpracování a transformace XML
  • Zpracování textu, například generování souborů RTF

Rychlost se nejčastěji používá jako vykreslovací modul pro vývoj webových aplikací založených na servletu Java, místo nebo ve spojení s JSP a jinými vykreslovacími technologiemi. Kromě snadné a udržovatelné syntaxe šablony se Velocity používá při vývoji webu, protože jeho jazyk šablony může manipulovat a prezentovat data, nikoli vytvářet data. To odrazuje programování v šablonách. To je dobrá věc; udržuje obchodní a aplikační logiku vašeho Java kódu tam, kam patří.

Rychlost se dobře hodí pro webový vývoj J2EE (Java 2 Platform, Enterprise Edition), protože platforma pojme jiné výstupní technologie než JSP. Zatímco JSP je součástí specifikace J2EE, J2EE nevyžaduje jeho použití.

Jak to funguje?

K vytvoření aplikace založené na rychlosti použijete stejný obecný proces jako jakoukoli jinou aplikaci. Uvažujme o zajímavějším příkladu než výše uvedená aplikace Hello World. Předpokládejme, že provozujete obchod se zvířaty a chcete vygenerovat e-mail s oznámením prodeje. Nejprve musíte navrhnout e-mail a poté na základě tohoto návrhu vyvinout šablonu a kód.

Úvahy o době návrhu

Pro návrh je třeba vzít v úvahu tři prvky:

  • Jaká data zahrnout do e-mailu
  • Jakou formu by měly mít datové prvky (například jako Seznam, Mapanebo Tětiva)
  • Jak nazvat tyto datové prvky

V tomto příkladu předpokládejme, že se rozhodnete pro tři domácí mazlíčky k prodeji, každé s jinou inzerovanou cenou. Rozhodnete se použít mapu k přiřazení jména každého mazlíčka a jeho ceny a poté uložíte všechny tři mapy do seznamu. Tomuto seznamu říkáte petList, jméno domácího mazlíčka názeva cena jako cena na mapě. Nyní, když jste identifikovali relevantní data, jejich reprezentaci a kritéria pojmenování, můžete napsat kód a design šablony.

Napište kód a design šablony

Jakmile se dohodnete na specifikách dat, Velocity vám umožní napsat kód a navrhnout šablonu paralelně. Návrhář integruje data do obsahu prezentace nedata (například obrázky, text atd.) V šabloně. V tomto případě jednoduše napíšeme do těla e-mailu:

 $ petList.size () Domácí zvířata v prodeji! Jsme hrdí na to, že můžeme nabídnout tato skvělá zvířata za tyto úžasné ceny. Pouze tento měsíc, vyberte si z: #foreach ($ pet v $ petList) $ pet.name pouze za $ pet.price #end Volejte ještě dnes! 

Jako programátor musíte:

  • Načíst všechna data ze zdrojů dat - databáze prostřednictvím JDBC (Java Database Connectivity), soubor nebo jen něco vypočítaného
  • Vložte tato data do kontextu pomocí dohodnutých jmen
  • Vykreslete šablonu s kontextem a vytvořte výstup

Z příkladu Hello World si můžete vzpomenout, že jsem odkazoval na třídu VelocityContext jako kontext. Po vzoru a java.util.Map, kontext je objekt, který obsahuje data poskytovaná aplikací nebo servletem, ke kterým šablona přistupuje.

V tomto příkladu získáme všechna data z našich zdrojů dat (v tomto případě je pevně propojíme do kódu), uspořádáme je a přidáme do kontextu:

 / * vytvořte náš seznam map * / ArrayList list = new ArrayList (); Mapa mapy = nový HashMap (); map.put ("jméno", "kůň"); map.put ("cena", "00,00"); list.add (mapa); mapa = nová HashMap (); map.put ("jméno", "pes"); map.put ("cena", "9,99"); list.add (mapa); mapa = nová HashMap (); map.put ("jméno", "medvěd"); map.put ("cena", "0,99"); list.add (mapa); / * přidat tento seznam do VelocityContext * / VelocityContext kontext = nový VelocityContext (); context.put ("petList", seznam); 

Zdá se, že se těch medvědů opravdu chceme zbavit!

Nyní, když jsou data organizována a umístěna do kontextu a připravená šablona, ​​můžeme vykreslit šablonu proti kontextu. Zde je kód:

import java.io.StringWriter; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; public class PetStoreEmail {public static void main (String [] args) nejprve hodí Exception {/ *, získá a inicializuje engine * / VelocityEngine ve = new VelocityEngine (); ve.init (); / * uspořádat naše data * / ArrayList list = new ArrayList (); Mapa mapy = nový HashMap (); map.put ("jméno", "kůň"); map.put ("cena", "00,00"); list.add (mapa); mapa = nová HashMap (); map.put ("jméno", "pes"); map.put ("cena", "9,99"); list.add (mapa); mapa = nová HashMap (); map.put ("jméno", "medvěd"); map.put ("cena", "0,99"); list.add (mapa); / * přidat tento seznam do VelocityContext * / VelocityContext kontext = nový VelocityContext (); context.put ("petList", seznam); / * získat šablonu * / Template t = ve.getTemplate ("petstoreemail.vm"); / * nyní vykreslí šablonu do Writeru * / StringWriter writer = nový StringWriter (); t.merge (kontext, autor); / * použijte výstup v těle e-mailu * / sendEmail (writer.toString ()); }} 

Tento kompletní program generuje vaše tělo e-mailu. Protože Velocity vykresluje šablony do a Spisovatel, můžete snadno spravovat výstup. V tomto případě se vykreslený výstup dostal do a Tětiva přes StringWriter, ale mohl snadno přejít do souboru, prohlížeče nebo BLOBu (velký binární objekt) v databázi. To je jeden z důvodů, proč se Velocity tak snadno integruje do Java aplikací.

Výstup programu (vaše tělo e-mailu) vypadá takto:

 3 domácí mazlíčci v prodeji! Jsme hrdí na to, že můžeme nabídnout tato skvělá zvířata za tyto úžasné ceny. Pouze tento měsíc na výběr: kůň pouze za 00,00 pes za pouhých 9,99 medvěd za pouhých 0,99 Volejte ještě dnes! 

Jazyk šablony rychlosti

Ukázal jsem šablony rychlosti pro dva různé příklady, ale ani v jednom případě jsem nevysvětlil, co speciální označení udělalo (i když byste to asi mohli uhodnout).

Velocity Template Language (VTL) je jednoduchá syntaxe poskytující dvě části: Reference, formalismus pro přístup k objektům v kontextu; a směrnice, sada příkazů používaných pro kontrolu a akci. Popsáno jako „jazyková definice se sadou funkcí, která se pohodlně vejde na standardní vizitku“ (viz Jim Jagielski „Get Up to Speed ​​with Velocity“), komunita záměrně udržovala VTL jednoduchou a malou.

Reference

Odkazy v přístupových datech šablony. Volně se mísí s obsahem VTL bez šablony. Formálně definovaný odkaz je cokoli v šabloně, která začíná znakem „$“ a odkazuje na něco v kontextu. Pokud v kontextu neexistuje žádný odpovídající datový objekt, šablona jednoduše zachází s odkazem jako s textem a vykresluje jej tak, jak je, do výstupního proudu.

Zde je krátká šablona obsahující jednoduchou referenci smíchanou s obsahem, který není VTL:

 Ahoj $ jméno! Vítejte na Velocity! 

Zde je odkaz $ jméno. Stejně jako v příkladu Hello World nahradí Velocity $ jméno v šabloně s toString () návratová hodnota toho, co je umístěno v kontextu pod klíčem název:

 Ahoj světe! Vítejte na Velocity! 

Odkaz Velocity umožňuje přístup k veřejné metodě libovolného objektu a syntaxe šablony je stejná jako v kódu Java. Zde je několik příkladů:

 Existují prvky $ myBean.getSize (). $ myObject.anotherMethod (1, "více dat") $ foo.getBar (). barMethod ("ahoj", $ moredata) $ foo.myMethod ($ bar.callThis ()) 

Z e-mailového příkladu Pet Store si můžete vzpomenout, že jsme uložili informace o jménu a ceně do a java.util.Mapa přistupoval k datům pomocí dvou tokenů název a cena, které neexistují jako metody v java.util.Map třída:

 $ pet.name pouze za $ pet.price 

To funguje, protože Velocity obsahuje introspekční mechanismus podobný JavaBean, který vám umožňuje vyjádřit přístupy k metodám v odkazech pomocí notace vlastnosti. V ukázkové šabloně obchodu se zvířaty introspekční zařízení Velocity najde a vyvolá Mapaje public object get (řetězec) metoda s klíči název a cena. Ke stejným datům bychom mohli přistupovat jiným způsobem vyvoláním získat (řetězec) metoda přímo v šabloně:

 $ pet.get ('name') pouze za $ pet.get ('price') 

To by produkovalo stejný výstup a lépe by představovalo, co se ve skutečnosti děje. Jiný způsob, který používá notaci vlastnosti, je však snazší číst a neváže vaši šablonu ke konkrétní implementaci datové třídy. Například můžete nahradit Mapa v Seznam s třídou, která má veřejné metody getName () a getPrice ()a původní ukázková šablona obsahující následující bude nadále fungovat:

 $ pet.name pouze za $ pet.price 
$config[zx-auto] not found$config[zx-overlay] not found