Programovanie

Naštartujte motor šablón rýchlosti

Velocity Template Engine vám umožňuje vykresľovať údaje z aplikácií a servletov. Čisté oddelenie šablón a kódu Java od spoločnosti Velocity sa primárne používa na vývoj dynamických webových stránok založených na servletoch a je tak ideálne pre vývoj webových aplikácií MVC. Ako všeobecný šablónový modul Velocity vyhovuje mnohým ďalším účelom, ako je generovanie kódu, generovanie a transformácia XML a spracovanie textového toku. Tento článok predstavuje VTL (Velocity Template Language) a poskytuje príklady toho, ako používať motor Velocity, vrátane toho, ako generovať webový obsah v prostredí servletu Java.

Velocity je otvorený zdrojový šablónový nástroj vyvinutý medzinárodnou dobrovoľníckou komunitou a hostený v Jakartskom projekte Apache Software Foundation. Na webových stránkach projektu Velocity v Jakarte, kde si môžete stiahnuť voľne dostupný zdrojový kód, je prosperujúca a rastúca komunita používateľov pripravená odpovedať na otázky a ponúkať riešenia bežných problémov so šablónami. Spoločnosť Velocity sa inšpirovala priekopníckym projektom WebMacro, za ktorý sme v komunite spoločnosti Velocity vďační.

V tomto článku uvádzam krátky základ pre Velocity Template Engine a jeho šablónový jazyk, Velocity Template Language (VTL). Na niekoľkých príkladoch tiež demonštrujem, ako používať rýchlosť.

Ahoj svet, samozrejme

Žiadne vysvetlenie predmetu súvisiaceho s programovaním by nebolo úplné bez príkladu Hello World. Akákoľvek aplikácia využívajúca Velocity vyžaduje dve časti. Prvou je šablóna, ktorou je v tomto príklade súbor s názvom helloworld.vm:

 Ahoj $ meno! Vitajte na stránke Velocity! 

Druhým je zodpovedajúci program Java s názvom 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 a engine * / VelocityEngine ve = new VelocityEngine (); ve.init (); / * ďalej získate šablónu * / šablónu t = ve.getTemplate ("helloworld.vm"); / * vytvoriť kontext a pridať údaje * / VelocityContext context = nový VelocityContext (); context.put ("meno", "svet"); / * teraz vykreslí šablónu na StringWriter * / StringWriter Writer = nový StringWriter (); t.merge (kontext, pisateľ); / * ukázať svet * / System.out.println (writer.toString ()); }} 

Teraz, keď kompilujete a spustíte tento program, uvidíte výstup:

 Ahoj Svet! Vitajte na stránke Velocity! 

Toto je triviálny príklad, ale obsahuje rozhodujúce prvky, ktoré vám poskytnú predstavu o tom, o čom je tempo šablón Velocity.

Prečo by som to mal používať?

Velocity je navrhnutý ako ľahko použiteľný všeobecný šablónový nástroj a je užitočný v akejkoľvek oblasti aplikácií Java, ktorá vyžaduje formátovanie a prezentáciu údajov. Velocity by ste mali používať z nasledujúcich dôvodov:

  • Prispôsobí sa mnohým oblastiam použitia
  • Ponúka jednoduchú a jasnú syntax pre návrhárov šablón
  • Ponúka jednoduchý programovací model pre vývojárov
  • Pretože šablóny a kód sú samostatné, môžete ich vyvíjať a udržiavať nezávisle
  • Motor Velocity sa ľahko integruje do ľubovoľného aplikačného prostredia Java, najmä servletov
  • Velocity umožňuje šablónam prístup k akejkoľvek verejnej metóde dátových objektov v kontexte

Posledný bod je dôležitý - znamená to, že môžete znova použiť svoje existujúce triedy. Takže objekty, ktoré chcete použiť vo svojich šablónach, nemusia byť štruktúrované určitým spôsobom, napríklad JavaBeans, alebo implementovať špeciálne I / O alebo režimy životného cyklu, napríklad taglibs JSP (JavaServer Pages). Jedinou požiadavkou je, aby boli metódy verejné. Uvidíte viac z toho, keď sa podrobne zaoberáme jazykom šablón.

Jednou zo silných stránok spoločnosti Velocity je, že dôrazne presadzuje oddelenie funkčnej zodpovednosti v rámci aplikácie. Dosahuje to obmedzením prístupu šablón k objektom, ktoré kód aplikácie konkrétne sprístupňuje. To znamená, že návrhári sa môžu sústrediť výlučne na prezentáciu údajov (pohľad) a aplikačný programátor sa môžu sústrediť na riadenie aplikácií (radič) a obchodnú logiku a správu údajov (model) v aplikácii Model-View-Controller (MVC). rozvoja. MVC je dobre akceptovaný vývojový model, ktorý zjednodušuje vývoj aj priebežnú údržbu sofistikovaných aplikácií.

Kde ho použijem?

Rýchlosť sa úspešne používa v:

  • Servletové webové aplikácie
  • Generovanie kódu Java a SQL
  • Spracovanie a transformácia XML
  • Spracovanie textu, napríklad generovanie súborov RTF

Rýchlosť sa najčastejšie používa ako vykresľovací modul pre vývoj webových aplikácií na báze servletov Java, namiesto alebo v spojení s JSP a inými vykresľovacími technológiami. Okrem ľahkej udržovateľnej syntaxe šablóny sa Velocity používa pri vývoji webu, pretože jej šablónový jazyk dokáže manipulovať a prezentovať údaje, nie ich vytvárať. To odrádza programovanie v rámci šablón. To je dobrá vec; udržiava obchodnú a aplikačnú logiku vášho Java kódu tam, kam patrí.

Rýchlosť sa dobre hodí na vývoj webu J2EE (Java 2 Platform, Enterprise Edition), pretože platforma umožňuje použitie iných výstupných technológií ako JSP. Zatiaľ čo JSP je zahrnutý v špecifikácii J2EE, J2EE nevyžaduje jeho použitie.

Ako to funguje?

Na vytvorenie aplikácie založenej na rýchlosti použijete rovnaký všeobecný postup, ako by ste vytvorili ktorúkoľvek inú aplikáciu. Zvážme zaujímavejší príklad ako vyššie uvedená aplikácia Hello World. Predpokladajme, že prevádzkujete obchod so zvieratami a chcete vygenerovať e-mail s oznámením predaja. Najprv musíte navrhnúť e-mail a potom na základe tohto návrhu vytvoriť šablónu a kód.

Úvahy o dizajne

Pri návrhu musíte brať do úvahy tri prvky:

  • Ktoré údaje zahrnúť do e-mailu
  • Aká forma by mali mať dátové prvky (napríklad ako Zoznam, Mapaalebo String)
  • Ako sa dajú nazvať tieto dátové prvky

V tomto príklade predpokladajme, že sa rozhodnete pre tri domáce zvieratá na predaj, každé s inou inzerovanou cenou. Rozhodnete sa pomocou mapy spojiť meno každého zvieraťa a jeho cenu a potom všetky tri mapy uložíte do zoznamu. Vy hovoríte tento zoznam zoznam zvierat, meno domáceho maznáčika názova cena ako cena na mape. Teraz, keď ste identifikovali príslušné údaje, ich zastúpenie a kritériá pre pomenovanie, môžete napísať kód a návrh šablóny.

Napíšte kód a návrh šablóny

Keď sa dohodnete na konkrétnych údajoch, Velocity vám umožní napísať kód a navrhnúť šablónu paralelne. Návrhár integruje údaje do prezentačného obsahu nedata (napríklad obrázky, text atď.) V šablóne. V takom prípade jednoducho napíšeme do tela e-mailu:

 $ petList.size () Domáce zvieratá sú v predaji! Sme hrdí na to, že vám môžeme ponúknuť tieto vynikajúce domáce zvieratá za tieto úžasné ceny. Iba tento mesiac vyberte z týchto možností: #foreach ($ pet v $ petList) $ pet.name iba za $ pet.price #end Volajte ešte dnes! 

Ako programátor musíte:

  • Načítajte všetky údaje zo zdrojov údajov - databáza prostredníctvom JDBC (Java Database Connectivity), súbor alebo iba niečo vypočítané
  • Dajte tieto údaje do kontextu pomocou dohodnutých mien
  • Vykreslite šablónu s kontextom a vytvorte výstup

Z príkladu Hello World si možno spomeniete, že som sa zmienil o triede VelocityContext ako kontext. Po vzore a java.util.Map, kontext je objekt, ktorý uchováva údaje poskytnuté aplikáciou alebo servletom, ku ktorým šablóna pristupuje.

V tomto príklade získame všetky údaje z našich zdrojov údajov (v tomto prípade ich pevne zapojíme do kódu), usporiadame a pridáme do kontextu:

 / * vytvorte náš zoznam máp * / ArrayList list = nový ArrayList (); Mapová mapa = nová HashMap (); map.put ("meno", "kôň"); map.put ("cena", "00,00"); list.add (mapa); mapa = nová HashMap (); map.put ("meno", "pes"); map.put ("cena", "9,99"); list.add (mapa); mapa = nová HashMap (); map.put ("meno", "medveď"); map.put ("cena", "0,99"); list.add (mapa); / * pridať tento zoznam do VelocityContext * / VelocityContext context = nový VelocityContext (); context.put ("petList", zoznam); 

Zdá sa, že sa tých medveďov naozaj chceme zbaviť!

Teraz, keď sú údaje usporiadané a umiestnené v kontexte a šablóna pripravená, môžeme šablónu vykresliť oproti kontextu. Tu 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) najskôr hodí Exception {/ *, získa a inicializuje engine * / VelocityEngine ve = new VelocityEngine (); ve.init (); / * usporiadať naše údaje * / ArrayList list = new ArrayList (); Mapová mapa = nová HashMap (); map.put ("meno", "kôň"); map.put ("cena", "00,00"); list.add (mapa); mapa = nová HashMap (); map.put ("meno", "pes"); map.put ("cena", "9,99"); list.add (mapa); mapa = nová HashMap (); map.put ("meno", "medveď"); map.put ("cena", "0,99"); list.add (mapa); / * pridať tento zoznam do VelocityContext * / VelocityContext context = nový VelocityContext (); context.put ("petList", zoznam); / * získať šablónu * / šablóna t = ve.getTemplate ("petstoreemail.vm"); / * teraz vykreslí šablónu na Writer * / StringWriter writer = nový StringWriter (); t.merge (kontext, pisateľ); / * použite výstup v tele e-mailu * / sendEmail (writer.toString ()); }} 

Tento kompletný program generuje váš e-mail. Pretože Velocity vykresľuje šablóny do a Spisovateľ, môžete ľahko spravovať výstup. V tomto prípade sa vykreslený výstup dostal do a String cez StringWriter, ale mohol by ľahko prejsť do súboru, prehliadača alebo BLOBu (veľký binárny objekt) v databáze. To je jeden z dôvodov, prečo sa Velocity tak ľahko integruje do aplikácií Java.

Výstup programu (váš e-mail) vyzerá takto:

 3 domáce zvieratá v akcii! Sme hrdí na to, že vám môžeme ponúknuť tieto vynikajúce domáce zvieratá za tieto úžasné ceny. Iba tento mesiac na výber: kôň iba za 00,00 pes len za 9,99 medveď len za 0,99 Volajte ešte dnes! 

Jazyk šablóny rýchlosti

Ukázal som šablóny rýchlosti pre dva rôzne príklady, ale ani v jednom prípade som nevysvetlil, čo urobilo špeciálne označenie (aj keď by ste to asi mohli hádať).

Jazyk šablón rýchlosti (VTL) je jednoduchá syntax poskytujúca dve časti: referencie, formalizmus prístupu k objektom v kontexte; a smernice, súbor príkazov používaných na kontrolu a konanie. Popísaný ako „jazyková definícia so sadou funkcií, ktorá sa pohodlne zmestí na štandardnú vizitku“ (pozri „Jim Jagielski„ Rýchlosť s rýchlosťou “), komunita VTL bola zámerne jednoduchá a malá.

Referencie

Odkazy v prístupových údajoch k šablóne. Voľne sa miešajú s obsahom šablóny iným ako VTL. Formálne definovaný je odkaz čokoľvek v šablóne, ktoré sa začína znakom „$“ a odkazuje na niečo v kontexte. Ak v kontexte neexistuje žiadny zodpovedajúci údajový objekt, šablóna jednoducho zaobchádza s odkazom ako s textom a vykreslí ho ako taký do výstupného toku.

Tu je krátka šablóna obsahujúca jednoduchý odkaz zmiešaný s obsahom, ktorý nie je VTL:

 Ahoj $ meno! Vitajte na stránke Velocity! 

Tu je odkaz $ meno. Rovnako ako v príklade Hello World, nahrádza Velocity $ meno v šablóne s natiahnuť() návratová hodnota toho, čo je umiestnené v kontexte pod kľúčom názov:

 Ahoj Svet! Vitajte na stránke Velocity! 

Odkaz Velocity umožňuje prístup k verejnej metóde ľubovoľného objektu a syntax šablóny je rovnaká ako v kóde Java. Tu je niekoľko príkladov:

 Existujú prvky $ myBean.getSize (). $ myObject.anotherMethod (1, "viac údajov") $ foo.getBar (). barMethod ("ahoj", $ moredata) $ foo.myMethod ($ bar.callThis ()) 

Z e-mailového príkladu Zverimex si môžete spomenúť, že sme informácie o mene a cene uložili do a java.util.Mapa pristupovali k údajom pomocou dvoch tokenov názov a cena, ktoré neexistujú ako metódy v java.util.Map trieda:

 $ pet.name iba za $ pet.cena 

Funguje to preto, lebo Velocity obsahuje introspekčný mechanizmus podobný JavaBean, ktorý vám umožní vyjadriť prístupy k metódam v odkazoch pomocou zápisu vlastnosti. V ukážkovej šablóne Zverimex vyhľadá introspekčné zariadenie spoločnosti Velocity a vyvolá Mapaje získať verejný objekt (reťazec) metóda s kľúčmi názov a cena. K rovnakým údajom by sme mohli získať iný prístup vyvolaním súboru získať (reťazec) metóda priamo v šablóne:

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

To by produkovalo rovnaký výstup a lepšie reprezentovalo to, čo sa v skutočnosti deje. Iný spôsob, ktorý používa zápis vlastnosti, je však ľahšie čitateľný a nespája vašu šablónu s konkrétnou implementáciou dátovej triedy. Môžete napríklad nahradiť Mapa v Zoznam s triedou, ktorá má verejné metódy getName () a getPrice ()a pôvodná vzorová šablóna obsahujúca nasledujúce bude naďalej fungovať:

 $ pet.name iba za $ pet.cena 
$config[zx-auto] not found$config[zx-overlay] not found