Programiranje

Zaženite Velocity Template Engine

Velocity Template Engine vam omogoča upodabljanje podatkov znotraj aplikacij in strežniških programčkov. Čisto ločevanje predloge in kode Java, ki se velocity uporablja predvsem za razvoj dinamičnih spletnih strani na osnovi servletov, je idealno za spletni razvoj MVC. Kot splošni mehanizem predlog Velocity ustreza številnim drugim namenom, kot so generiranje kode, generiranje in pretvorba XML ter obdelava besedilnega toka. Ta članek predstavlja jezik predloge za hitrost (VTL) in ponuja primere, kako uporabljati mehanizem za hitrost, vključno s tem, kako ustvariti spletno vsebino v okolju Java servlet.

Velocity je odprtokodno orodje za predloge, ki ga je razvila mednarodna prostovoljna skupnost in ga gosti projekt Jakarta iz Apache Software Foundation. Na spletnem mestu Jakarta Velocity Project, kamor lahko prenesete brezplačno dostopno izvorno kodo, je uspešna in naraščajoča skupnost uporabnikov pripravljena odgovoriti na vprašanja in ponuditi rešitve za pogoste težave s predlogami. Velocity je navdihnil pionirski projekt WebMacro, delo, za katerega smo v skupnosti Velocity hvaležni.

V tem članku predstavljam kratek priročnik o Velocity Template Engine in njegovem jeziku predloge, Velocity Template Language (VTL). V nekaj primerih tudi predstavim, kako uporabljati hitrost.

Pozdravljen svet, seveda

Nobena razlaga predmeta, povezanega s programiranjem, ne bi bila popolna brez primera Hello World. Vsaka aplikacija, ki uporablja Velocity, zahteva dva dela. Prva je predloga, ki je v tem primeru datoteka z imenom helloworld.vm:

 Pozdravljeni $ name! Dobrodošli v Velocity! 

Drugi je ustrezen program Java, imenovan HelloWorld.java:

uvoz java.io.StringWriter; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; javni razred HelloWorld {public static void main (String [] args) najprej vrže izjemo {/ *, pridobi in inicializira motor * / VelocityEngine ve = new VelocityEngine (); ve.init (); / * nato dobite predlogo * / Template t = ve.getTemplate ("helloworld.vm"); / * ustvarite kontekst in dodajte podatke * / VelocityContext context = new VelocityContext (); context.put ("ime", "Svet"); / * zdaj upodobi predlogo v StringWriter * / StringWriter Writer = new StringWriter (); t.merge (kontekst, pisatelj); / * prikaže svet * / System.out.println (writer.toString ()); }} 

Zdaj, ko prevedete in zaženete ta program, boste videli rezultate:

 Pozdravljen, svet! Dobrodošli v Velocity! 

To je nepomemben primer, vendar vsebuje ključne dele, ki vam dajo idejo, kaj sploh predstavlja predloga za hitrost.

Zakaj naj ga uporabljam?

Velocity je zasnovan kot enostavno za uporabo splošnega orodja za predloge in je uporaben v vseh področjih uporabe Java, ki zahtevajo oblikovanje in predstavitev podatkov. Uporabite Velocity iz naslednjih razlogov:

  • Prilagaja se številnim področjem uporabe
  • Ponuja preprosto, jasno sintakso za oblikovalca predlog
  • Ponuja preprost programski model za razvijalce
  • Ker sta predlogi in koda ločeni, jih lahko razvijate in vzdržujete samostojno
  • Mehanizem Velocity se zlahka vključi v katero koli aplikacijsko okolje Java, zlasti v servlete
  • Velocity omogoča predlogam dostop do katere koli javne metode podatkovnih objektov v kontekstu

Zadnja točka je pomembna - to pomeni, da lahko obstoječe razrede ponovno uporabite. Torej, predmetov, ki jih želite uporabiti v predlogah, ni treba strukturirati na določen način, na primer JavaBeans, ali izvajati posebnih načinov V / I ali življenjskega cikla, kot so taglibi JSP (JavaServer Pages). Edina zahteva je, da so metode javne. Več o tem boste videli, ko bomo podrobno zajeli jezik predloge.

Ena od prednosti Velocityja je ta, da močno uveljavlja ločevanje funkcionalne odgovornosti znotraj aplikacije. To naredi tako, da omeji dostop do predloge do predmetov, ki jih koda aplikacije posebej daje na voljo. To pomeni, da se lahko oblikovalci osredotočijo izključno na predstavitev podatkov (pogled), programer programov pa na nadzor aplikacije (krmilnik) in poslovno logiko in upravljanje podatkov (model) v Model-View-Controller (MVC) razvoj. MVC je dobro sprejet vzorec razvoja, ki poenostavlja razvoj in stalno vzdrževanje dovršenih aplikacij.

Kje ga uporabim?

Hitrost se uspešno uporablja pri:

  • Spletne aplikacije na osnovi strežnika
  • Ustvarjanje kode Java in SQL
  • Obdelava in preoblikovanje XML
  • Obdelava besedila, na primer ustvarjanje datotek RTF

Hitrost se najpogosteje uporablja kot mehanizem upodabljanja za razvoj spletnih aplikacij na osnovi Java-servletov, namesto ali v povezavi z JSP-ji in drugimi tehnologijami upodabljanja. Poleg enostavne, vzdrževalne sintakse predloge se Velocity uporablja pri spletnem razvoju, saj lahko njen jezik predloge manipulira in predstavlja podatke, ne pa ustvarjati podatkov. To odvrača programiranje v predlogah. To je dobro; ohranja poslovno in aplikacijsko logiko vaše kode Java tam, kamor spadata.

Velocity je zelo primeren za spletni razvoj J2EE (Java 2 Platform, Enterprise Edition), ker platforma prilagaja izhodne tehnologije, ki niso JSP. Medtem ko je JSP vključen v specifikacijo J2EE, J2EE ne zahteva njegove uporabe.

Kako deluje?

Za ustvarjanje aplikacije, ki temelji na hitrosti, uporabljate enak splošen postopek kot katero koli drugo aplikacijo. Poglejmo si bolj zanimiv primer kot zgoraj navedena aplikacija Hello World. Recimo, da upravljate trgovino z živalmi in želite e-poštno sporočilo razglasiti o prodaji. Najprej morate oblikovati e-poštno sporočilo in nato razviti predlogo in kodo, ki temelji na tej zasnovi.

Upoštevanje časa načrtovanja

Za svoj dizajn morate upoštevati tri elemente:

  • Katere podatke vključiti v e-poštno sporočilo
  • V kakšni obliki bi morali biti elementi podatkov (na primer kot Seznam, Zemljevid, ali Vrvica)
  • Kako imenovati te podatkovne elemente

V tem primeru predpostavimo, da se odločite za tri hišne ljubljenčke na prodaj, vsak z drugačno oglaševano ceno. Odločite se, da boste z zemljevidom povezali ime vsakega ljubljenčka in njegovo ceno, nato pa vse tri zemljevide shranili na seznam. Pokličete ta seznam petList, ime hišnega ljubljenčka ime, in cena kot cena na zemljevidu. Zdaj, ko ste prepoznali ustrezne podatke, njihovo predstavitev in merila za poimenovanje, lahko napišete kodo in zasnovo predloge.

Napišite kodo in obliko predloge

Ko se strinjate glede podatkov, vam Velocity omogoča, da vzporedno napišete kodo in oblikujete predlogo. Oblikovalec podatke vključi v predstavitveno vsebino brez podatkov (na primer slike, besedilo itd.) V predlogi. V tem primeru preprosto vpišemo v telo e-pošte:

 $ petList.size () Hišni ljubljenčki na akciji! Ponosni smo, da ponujamo te čudovite hišne ljubljenčke po teh neverjetnih cenah. Samo ta mesec izberite med: #foreach ($ pet v $ petList) $ pet.name za samo $ pet.price #end Call Today! 

Kot programer morate:

  • Pridobite vse podatke iz virov podatkov - zbirko podatkov prek JDBC (Java Database Connectivity), datoteko ali samo nekaj izračunanega
  • Dajte te podatke v kontekst z uporabo dogovorjenih imen
  • Predložite predlogo s kontekstom, da ustvarite izhodne podatke

Iz primera Hello World se lahko spomnite, da sem se skliceval na razred VelocityContext kot kontekstu. Po vzoru a java.util.Map, kontekst je objekt, ki vsebuje podatke, ki jih zagotavlja aplikacija ali strežniški programček, do katerega dostopa predloga.

V tem primeru dobimo vse podatke iz naših podatkovnih virov (v tem primeru jih vstavimo v kodo), jih organiziramo in dodamo v kontekst:

 / * ustvarite naš seznam zemljevidov * / ArrayList list = new ArrayList (); Zemljevid zemljevida = nov HashMap (); map.put ("ime", "konj"); map.put ("cena", "00.00"); list.add (zemljevid); map = nov HashMap (); map.put ("ime", "pes"); map.put ("cena", "9,99"); list.add (zemljevid); map = nov HashMap (); map.put ("ime", "medved"); map.put ("cena", ", 99"); list.add (zemljevid); / * dodajte ta seznam v kontekst VelocityContext * / VelocityContext = new VelocityContext (); context.put ("petList", seznam); 

Zdi se, da se resnično želimo znebiti teh medvedov!

Zdaj, ko so podatki organizirani in umeščeni v kontekst ter predloga pripravljena, lahko predlogo upodobimo kontekstu. Tu je koda:

uvoz java.io.StringWriter; uvoz java.util.List; uvoz java.util.ArrayList; uvoz java.util.Map; uvoz java.util.HashMap; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; javni razred PetStoreEmail {public static void main (String [] args) najprej vrže izjemo {/ *, pridobi in inicializira motor * / VelocityEngine ve = new VelocityEngine (); ve.init (); / * organiziramo naše podatke * / ArrayList list = new ArrayList (); Zemljevid zemljevida = nov HashMap (); map.put ("ime", "konj"); map.put ("cena", "00.00"); list.add (zemljevid); map = nov HashMap (); map.put ("ime", "pes"); map.put ("cena", "9,99"); list.add (zemljevid); map = nov HashMap (); map.put ("ime", "medved"); map.put ("cena", ", 99"); list.add (zemljevid); / * dodajte ta seznam v kontekst VelocityContext * / VelocityContext = new VelocityContext (); context.put ("petList", seznam); / * dobite predlogo * / Template t = ve.getTemplate ("petstoreemail.vm"); / * zdaj upodobi predlogo v Writer * / StringWriter Writer = new StringWriter (); t.merge (kontekst, pisatelj); / * uporabite izhod v telesu e-pošte * / sendEmail (Writer.toString ()); }} 

Ta celoten program ustvari vaše telo e-pošte. Ker Velocity upodablja predloge v Pisatelj, lahko enostavno upravljate z izhodom. V tem primeru je upodobljeni izhod prešel v Vrvica prek StringWriter, vendar bi lahko zlahka prešel v datoteko, brskalnik ali BLOB (binarni velik predmet) v zbirki podatkov. To je eden od razlogov, zakaj se Velocity tako enostavno integrira v programe Java.

Izhod programa (vaše telo e-pošte) je videti takole:

 3 Hišni ljubljenčki na akciji! Ponosni smo, da lahko ponudimo te čudovite hišne ljubljenčke po teh neverjetnih cenah. Samo ta mesec izberite: konj za samo 00,00 pes za samo 9,99 medved za samo 0,99 Pokliči danes! 

Jezik predloge za hitrost

Predloge Velocity sem prikazal za dva različna primera, vendar v nobenem primeru nisem razložil, kaj je naredil poseben označevalnik (čeprav bi verjetno lahko uganili).

Velocity Template Language (VTL) je preprosta skladnja, ki vsebuje dva dela: reference, formalizem za dostop do predmetov v kontekstu; in direktive, niz izjav, ki se uporabljajo za nadzor in ukrepanje. Opisan kot "jezikovna opredelitev z naborom funkcij, ki se udobno prilega običajni vizitki" (glej "Približevanje hitrosti s hitrostjo" Jima Jagielskega) VTL je bila skupnost namenoma preprosta in majhna.

Reference

Sklici v podatkih za dostop do predloge. Prosto se mešajo z vsebino predloge, ki ni VTL. Formalno opredeljen sklic je vse v predlogi, ki se začne z znakom '$' in se nanaša na nekaj v kontekstu. Če v kontekstu ne obstaja noben ustrezen podatkovni objekt, predloga referenco preprosto obravnava kot besedilo in upodobi, kot je, v izhodni tok.

Tu je kratka predloga, ki vsebuje preprosto referenco, pomešano z vsebino, ki ni VTL:

 Pozdravljeni $ name! Dobrodošli v Velocity! 

Tukaj je referenca $ ime. Tako kot v primeru Hello World, tudi Velocity nadomešča $ ime v predlogi z toString () vrnjena vrednost tistega, kar je postavljeno v kontekst pod ključem ime:

 Pozdravljen, svet! Dobrodošli v Velocity! 

Referenca Velocity omogoča dostop do javne metode katerega koli predmeta, sintaksa predloge pa je enaka kot v kodi Java. Tu je nekaj primerov:

 Obstajajo elementi $ myBean.getSize (). $ myObject.anotherMethod (1, "več podatkov") $ foo.getBar (). barMethod ("zdravo", $ moredata) $ foo.myMethod ($ bar.callThis ()) 

Iz e-poštnega primera trgovine Pet Store se lahko spomnite, da smo ime in podatke o ceni shranili v java.util.Mapin do podatkov dostopali z uporabo dveh žetonov ime in cena, ki ne obstajajo kot metode v java.util.Map razred:

 $ pet.name samo za $ pet.price 

To deluje, ker Velocity vključuje mehanizem introspekcije, podoben JavaBean, ki vam omogoča izražanje dostopov do metode v referencah z uporabo zapisa lastnosti. V predlogi primera Pet Store objekt za iskanje Velocity poišče in prikliče datoteko Zemljevidje javni objekt pridobi (niz) s tipkami ime in cena. Do istih podatkov bi lahko dostopali na drugačen način, če bi poklicali get (String) metoda neposredno v predlogi:

 $ pet.get ('ime') samo za $ pet.get ('cena') 

To bi prineslo enake rezultate in bolje predstavilo, kaj se dejansko dogaja. Vendar je drugačen način, ki uporablja zapis lastnosti, lažje brati in predloge ne veže na izvedbo podatkovnega razreda. Na primer, lahko zamenjate Zemljevid v Seznam z razredom, ki ima javne metode getName () in getPrice ()in izvirna vzorčna predloga, ki vsebuje naslednje, bo še naprej delovala:

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