Ohjelmointi

Käynnistä Velocity Template Engine

Velocity Template Enginen avulla voit renderoida tietoja sovelluksista ja servlet-sovelluksista. Ensisijaisesti dynaamisten, servlet-pohjaisten verkkosivustojen kehittämiseen käytetty, Velocityn puhdas malli- ja Java-koodien erottaminen tekee siitä ihanteellisen MVC-verkkokehitykseen. Yleisenä mallimoottorina Velocity sopii moniin muihin tarkoituksiin, kuten koodin generointi, XML-generointi ja muunnos sekä tekstivirran käsittely. Tässä artikkelissa esitellään Velocity Template Language (VTL) -kieli ja annetaan esimerkkejä siitä, kuinka Velocity-moottoria käytetään, mukaan lukien miten Web-sisältöä luodaan Java-servlet-ympäristössä.

Velocity on avoimen lähdekoodin mallityökalu, jonka on kehittänyt kansainvälinen vapaaehtoisyhteisö ja jota isännöi Apache Software Foundation -säätiön Jakarta-projekti. Jakartan Velocity Project -sivustolla, josta voit ladata vapaasti saatavilla olevan lähdekoodin, kukoistava ja kasvava käyttäjäyhteisö on valmis vastaamaan kysymyksiin ja tarjoamaan ratkaisuja yleisiin malliongelmiin. Velocity sai innoituksensa uraauurtavasta WebMacro-projektista, josta olemme Velocity-yhteisössä kiitollisia.

Tässä artikkelissa esitän lyhyen alukkeen Velocity Template Engine -sovelluksesta ja sen mallikielestä, Velocity Template Language (VTL). Esittelen myös kuinka nopeutta käytetään useiden esimerkkien avulla.

Hei maailma, tietysti

Mikään ohjelmointiin liittyvän aiheen selitys ei olisi täydellinen ilman Hello World -esimerkkiä. Kaikki sovellukset, joissa käytetään nopeutta, vaatii kaksi osaa. Ensimmäinen on malli, joka tässä esimerkissä on tiedosto nimeltä helloworld.vm:

 Hei $ nimi! Tervetuloa Velocityyn! 

Toinen on vastaava Java-ohjelma nimeltä HelloWorld.java:

tuo java.io.StringWriter; tuo org.apache.velocity.app.VelocityEngine; tuo org.apache.velocity.Template; tuo org.apache.velocity.VelocityContext; public class HelloWorld {public static void main (String [] args) heittää poikkeuksen {/ * ensin, hanki ja alusta moottori * / VelocityEngine ve = new VelocityEngine (); ve.init (); / *, hae sitten Malli * / Malli t = ve.getTemplate ("helloworld.vm"); / * luoda konteksti ja lisätä tietoja * / VelocityContext context = new VelocityContext (); context.put ("nimi", "maailma"); / * hahmonna nyt malli StringWriteriksi * / StringWriter kirjoittaja = new StringWriter (); t.merge (asiayhteys, kirjailija); / * näytä maailma * / System.out.println (kirjailija.String ()); }} 

Nyt, kun käännät ja suoritat tämän ohjelman, näet tuloksen:

 Hei maailma! Tervetuloa Velocityyn! 

Tämä on triviaali esimerkki, mutta se sisältää tärkeät kappaleet, jotka antavat sinulle käsityksen siitä, mitä Velocity-mallipohjat ovat.

Miksi minun pitäisi käyttää sitä?

Suunniteltu helppokäyttöiseksi yleiseksi mallityökaluksi, Velocity on hyödyllinen kaikilla Java-sovellusalueilla, jotka edellyttävät tietojen muotoilua ja esittelyä. Käytä Velocityä seuraavista syistä:

  • Se sopeutuu moniin käyttöalueisiin
  • Se tarjoaa yksinkertaisen, selkeän syntaksin mallisuunnittelijalle
  • Se tarjoaa yksinkertaisen ohjelmointimallin kehittäjälle
  • Koska mallit ja koodi ovat erillisiä, voit kehittää ja ylläpitää niitä itsenäisesti
  • Velocity-moottori integroituu helposti mihin tahansa Java-sovellusympäristöön, etenkin servlet-sovelluksiin
  • Nopeus mahdollistaa mallien pääsyn mihin tahansa julkisiin menetelmäobjektiin kontekstissa

Viimeinen kohta on tärkeä - se tarkoittaa, että voit käyttää olemassa olevia luokkiasi uudelleen. Joten objektien, joita haluat käyttää malleissasi, ei tarvitse olla jäsennelty tietyllä tavalla, kuten JavaBeans, tai toteuttaa erityisiä I / O- tai elinkaaritiloja, kuten JSP (JavaServer Pages) -tagilibit. Ainoa vaatimus on, että menetelmät ovat julkisia. Näet enemmän tästä, kun käsittelemme mallin kieltä yksityiskohtaisesti.

Yksi Velocityn vahvuuksista on se, että se vahvistaa voimakkaasti toiminnallisen vastuun erottamista sovelluksessa. Se tekee tämän rajoittamalla mallien pääsyn kohteisiin, jotka sovelluskoodi nimenomaan tarjoaa saataville. Tämä tarkoittaa, että suunnittelijat voivat keskittyä yksinomaan datan esitykseen (näkymään) ja sovellusohjelmoija voi keskittyä sovelluksen hallintaan (ohjain) ja liiketoimintalogiikkaan sekä tiedon hallintaan (malli) Model-View-Controllerissa (MVC). kehitystä. MVC on hyvin hyväksytty kehityskuvio, joka yksinkertaistaa kehittyneiden sovellusten kehittämistä ja jatkuvaa ylläpitoa.

Missä sitä käytetään?

Nopeutta käytetään onnistuneesti:

  • Servlet-pohjaiset verkkosovellukset
  • Java- ja SQL-koodien luominen
  • XML-käsittely ja muunnos
  • Tekstinkäsittely, kuten RTF-tiedostojen luominen

Nopeutta käytetään yleisimmin renderöintimoottorina Java-servlet-pohjaisen verkkosovelluskehityksen yhteydessä JSP: iden ja muiden renderointitekniikoiden sijaan tai yhdessä niiden kanssa. Helpon, ylläpidettävän mallin syntaksin lisäksi Velocityä käytetään web-kehityksessä, koska sen mallikieli pystyy käsittelemään ja esittämään tietoja, ei luomaan tietoja. Tämä estää ohjelmointi mallien sisällä. Tämä on hyvä asia; se pitää Java-koodisi liiketoiminta- ja sovelluslogiikan siellä missä ne kuuluvat.

Nopeus sopii hyvin J2EE (Java 2 Platform, Enterprise Edition) -verkkokehitykseen, koska alustaan ​​mahtuu muita tulostustekniikoita kuin JSP. Vaikka JSP sisältyy J2EE-määrittelyyn, J2EE ei vaadi sen käyttöä.

Kuinka se toimii?

Luo Velocity-pohjainen sovellus samalla tavoin kuin mitä tahansa sovellusta. Tarkastellaan mielenkiintoisempaa esimerkkiä kuin yllä oleva Hello World -sovellus. Oletetaan, että sinulla on lemmikkikauppa ja haluat luoda sähköpostiräjähdyksen ilmoittaaksesi myynnistä. Ensin sinun on suunniteltava sähköposti ja kehitettävä malli ja koodi kyseisen mallin perusteella.

Suunnitteluaikaa koskevat näkökohdat

Suunnittelussa on otettava huomioon kolme elementtiä:

  • Mitkä tiedot sisällytetään sähköpostiin
  • Missä muodossa tietoelementtien tulisi olla (esimerkiksi kuten Lista, Karttatai Merkkijono)
  • Mitä kutsutaan näille tietoelementeille

Oletetaan tässä esimerkissä, että päätät myydä kolme lemmikkieläintä, joilla jokaisella on erilainen mainostettu hinta. Päätät yhdistää jokaisen lemmikin nimen ja sen hinnan kartalla ja tallentaa sitten kaikki kolme karttaa luetteloon. Soitat tätä luetteloa petList, lemmikin nimi nimi, ja hinta kuten hinta kartalla. Nyt kun olet tunnistanut tarvittavat tiedot, niiden esityksen ja nimeämiskriteerit, voit kirjoittaa koodin ja mallin ulkoasun.

Kirjoita koodi ja mallin suunnittelu

Kun olet sopinut tietojen yksityiskohdista, Velocity antaa sinun kirjoittaa koodin ja suunnitella mallin rinnakkain. Suunnittelija integroi tiedot mallin sisältämättömän esityksen sisältöön (kuten kuvat, teksti ja niin edelleen). Tässä tapauksessa kirjoitamme yksinkertaisesti sähköpostiosoitteeseen:

 $ petList.size () Lemmikkieläimet myynnissä! Olemme ylpeitä voidessamme tarjota näitä hienoja lemmikkejä hämmästyttävään hintaan. Valitse vain tässä kuussa: #foreach ($ pet in $ petList) $ pet.name vain $ pet.price #end Soita tänään! 

Ohjelmoijana sinun on:

  • Hae kaikki tiedot tietolähteistä - tietokanta JDBC: n (Java Database Connectivity) kautta, tiedosto tai vain jotain laskettua
  • Laita nämä tiedot asiayhteyteen sovittujen nimien avulla
  • Renderöi malli kontekstin kanssa tuotoksen tuottamiseksi

Voit muistaa Hello World -esimerkistä, jonka viittasin luokkaan VelocityContext kuten yhteydessä. Mallinnettu a java.util.Kartta, konteksti on objekti, joka pitää sisällään sovelluksen tai servletin tarjoamia tietoja, joita malli käyttää.

Tässä esimerkissä saamme kaikki tiedot tietolähteistämme (tässä tapauksessa johdotamme ne koodiin), järjestämme ne ja lisätään kontekstiin:

 / * luo karttaluettelomme * / ArrayList list = new ArrayList (); Karttakartta = uusi HashMap (); map.put ("nimi", "hevonen"); map.put ("hinta", "00.00"); list.add (kartta); kartta = uusi HashMap (); map.put ("nimi", "koira"); map.put ("hinta", "9,99"); list.add (kartta); kartta = uusi HashMap (); map.put ("nimi", "karhu"); map.put ("hinta", ".99"); list.add (kartta); / * lisää luettelo VelocityContextiin * / VelocityContext context = new VelocityContext (); context.put ("petList", luettelo); 

Näyttää siltä, ​​että haluamme todella päästä eroon niistä karhuista!

Nyt, kun tiedot on järjestetty ja sijoitettu kontekstiin ja malli on valmis, voimme tehdä mallin kontekstista. Tässä on koodi:

tuo java.io.StringWriter; tuo java.util.List; tuo java.util.ArrayList; tuo java.util.Kartta; tuo java.util.HashMap; tuo org.apache.velocity.Template; tuo org.apache.velocity.VelocityContext; tuo org.apache.velocity.app.VelocityEngine; public class PetStoreEmail {public static void main (String [] args) heittää poikkeuksen {/ * ensin, hanki ja alusta moottori * / VelocityEngine ve = new VelocityEngine (); ve.init (); / * järjestää tietomme * / ArrayList list = new ArrayList (); Karttakartta = uusi HashMap (); map.put ("nimi", "hevonen"); map.put ("hinta", "00.00"); list.add (kartta); kartta = uusi HashMap (); map.put ("nimi", "koira"); map.put ("hinta", "9,99"); list.add (kartta); kartta = uusi HashMap (); map.put ("nimi", "karhu"); map.put ("hinta", ".99"); list.add (kartta); / * lisää luettelo VelocityContextiin * / VelocityContext context = new VelocityContext (); context.put ("petList", luettelo); / * hae malli * / malli t = ve.getTemplate ("petstoreemail.vm"); / * renderoi mallin nyt Writeriksi * / StringWriter kirjoittaja = new StringWriter (); t.merge (asiayhteys, kirjailija); / * käytä lähdettä sähköpostiosoitteessasi * / sendEmail (writer.toString ()); }} 

Tämä täydellinen ohjelma luo sähköpostiosoitteesi. Koska Velocity tekee malleista a Kirjailija, voit hallita tulosta helposti. Tällöin renderoitu tuotos meni a Merkkijono kautta StringWriter, mutta se olisi voinut helposti siirtyä tiedostoon, selaimeen tai BLOB (suuri binääriobjekti) tietokantaan. Tämä on yksi syy, miksi Velocity integroituu niin helposti Java-sovelluksiin.

Ohjelman tulos (sähköpostiosoitteesi) näyttää tältä:

 3 lemmikkiä myynnissä! Olemme ylpeitä voidessamme tarjota näitä hienoja lemmikkejä hämmästyttävään hintaan. Vain tässä kuussa, valitse: hevonen vain 00.00 koiralle vain 9.99 karhu vain .99 Soita tänään! 

Nopeusmallikieli

Olen osoittanut Velocity-malleja kahdelle eri esimerkille, mutta en ole kummassakaan tapauksessa selittänyt, mitä erikoismerkintä teki (vaikka luultavasti arvata).

Velocity Template Language (VTL) on yksinkertainen syntaksi, jossa on kaksi osaa: viitteet, formalismi esineisiin pääsemiseksi kontekstissa; ja direktiivit, joukko lauseita, joita käytetään hallintaan ja toimintaan. VTL on kuvattu "kielen määritelmäksi, jossa on ominaisuusjoukko, joka sopii mukavasti tavalliseen käyntikorttiin" (katso Jim Jagielskin "Nopeudesta nopeudella"). Yhteisö on pitänyt tarkoituksella yksinkertaista ja pientä.

Viitteet

Viitteet mallin käyttötietoihin. Ne sekoittuvat vapaasti mallin muuhun kuin VTL-sisältöön. Virallisesti määritelty viite on mikä tahansa mallipohjassa, joka alkaa '$' -merkillä ja viittaa johonkin asiayhteyteen. Jos kontekstissa ei ole vastaavaa dataobjektia, malli yksinkertaisesti käsittelee viittausta tekstinä ja tekee sen sellaisenaan tulosvirtaan.

Tässä on lyhyt malli, joka sisältää yksinkertaisen viitteen sekoitettuna muuhun kuin VTL-sisältöön:

 Hei $ nimi! Tervetuloa Velocityyn! 

Tässä viite on $ nimi. Kuten Hello World -esimerkissä, Velocity korvaa $ nimi mallissa toString () palautusarvo siitä, mikä on kontekstissa avaimen alla nimi:

 Hei maailma! Tervetuloa Velocityyn! 

Nopeusviite sallii pääsyn minkä tahansa objektin julkiseen menetelmään, ja mallin syntaksit ovat samat kuin Java-koodissa. Tässä on muutama esimerkki:

 Elementtejä on $ myBean.getSize (). $ myObject.anotherMethod (1, "lisätietoja") $ foo.getBar (). barMethod ("hei", $ moredata) $ foo.myMethod ($ bar.callThis ()) 

Voit muistaa Pet Store -esimerkkiesimerkistä, että tallensimme nimen ja hintatiedot a java.util.Karttaja käytti tietoja kahdella tunnuksella nimi ja hinta, joita ei ole olemassa menetelminä java.util.Kartta luokka:

 $ pet.name vain $ pet.price 

Tämä toimii, koska Velocity sisältää JavaBean-tyyppisen itsetarkkailumekanismin, jonka avulla voit ilmaista menetelmän käyttöoikeuksia viitteissä ominaisuusmerkintöjen avulla. Lemmikkikaupan esimerkkimallissa Velocityn itsetarkastustoiminto löytää ja käyttää sitä Karttaon public Object get (merkkijono) menetelmä näppäimillä nimi ja hinta. Voisimme käyttää samoja tietoja eri tavalla kutsumalla saada (merkkijono) menetelmä suoraan malliin:

 $ pet.get ('nimi') vain $ pet.get ('hinta') 

Tämä tuottaisi saman tuotoksen ja edustaisi paremmin sitä, mitä todella tapahtuu. Toinen ominaisuusmerkintää käyttävä tapa on kuitenkin helpompi lukea eikä se sido malliasi tietoluokan erityiseen toteutukseen. Voit esimerkiksi korvata Kartta että Lista luokan kanssa, jolla on julkisia menetelmiä getName () ja getPrice ()ja alkuperäinen esimerkkimalli, joka sisältää seuraavat tiedot, toimivat edelleen:

 $ pet.name vain $ pet.price