Programavimas

Paleiskite „Velocity Template Engine“

„Velocity Template Engine“ leidžia atkurti duomenis iš programų ir servletų. „Velocity“ švarus šablonų ir „Java“ kodų atskyrimas, pirmiausia naudojamas kuriant dinamiškas, servletais pagrįstas svetaines, yra idealus MVC žiniatinklio kūrimui. Kaip bendras šablonų variklis, „Velocity“ tinka daugeliui kitų tikslų, tokių kaip kodų generavimas, XML generavimas ir transformavimas bei teksto srautų apdorojimas. Šiame straipsnyje pristatoma „Velocity Template Language“ (VTL) ir pateikiami „Velocity“ variklio naudojimo pavyzdžiai, įskaitant tai, kaip generuoti žiniatinklio turinį „Java“ servleto aplinkoje.

„Velocity“ yra atviro kodo šablonų įrankis, kurį sukūrė tarptautinė savanorių bendruomenė ir kurį organizuoja „Apache Software Foundation“ vykdomas Džakartos projektas. „Jakarta Velocity Project“ svetainėje, kur galite atsisiųsti laisvai prieinamą šaltinio kodą, klestinti ir auganti vartotojų bendruomenė yra pasirengusi atsakyti į klausimus ir pasiūlyti dažniausiai pasitaikančių šablonų problemų sprendimus. „Velocity“ įkvėpė novatoriškas „WebMacro“ projektas, už kurį mes, „Velocity“ bendruomenės nariai, esame dėkingi.

Šiame straipsnyje pateikiu trumpą „Velocity Template Engine“ ir jo šablonų kalbos „Velocity Template Language“ (VTL) pradmenis. Keletas pavyzdžių taip pat pademonstruoju, kaip naudoti greitį.

Sveikas pasaulis, žinoma

Joks su programavimu susijusio dalyko paaiškinimas nebūtų išsamus be „Hello World“ pavyzdžio. Bet kuriai programai, naudojančiai greitį, reikia dviejų dalių. Pirmasis yra šablonas, kuris šiame pavyzdyje yra failas, vadinamas kolegos pasaulis.vm:

 Labas $ name! Sveiki atvykę į „Velocity“! 

Antrasis yra atitinkama „Java“ programa, vadinama HelloWorld.java:

importuoti java.io.StringWriter; importuoti org.apache.velocity.app.VelocityEngine; importuoti org.apache.velocity.Template; importuoti org.apache.velocity.VelocityContext; public class HelloWorld {public static void main (String [] args) pirmiausia išmeta išimtį {/ *, gaukite ir inicijuokite variklį * / VelocityEngine ve = new VelocityEngine (); ve.init (); / * tada gaukite Šabloną * / Šabloną t = ve.getTemplate ("helloworld.vm"); / * sukurkite kontekstą ir pridėkite duomenis * / VelocityContext context = new VelocityContext (); context.put („vardas“, „Pasaulis“); / * dabar pateikite šabloną į StringWriter * / StringWriter rašytojas = new StringWriter (); t.merge (kontekstas, rašytojas); / * parodyti pasauliui * / System.out.println (rašytojas.String ()); }} 

Dabar, kai sukompiliuosite ir paleisite šią programą, pamatysite išvestį:

 Labas pasauli! Sveiki atvykę į „Velocity“! 

Tai yra nereikšmingas pavyzdys, tačiau jame yra svarbiausių dalių, leidžiančių suprasti, kas yra „Velocity“ šablonai.

Kodėl turėčiau jį naudoti?

Sukurtas kaip lengvai naudojamas bendras šablonų įrankis, „Velocity“ yra naudingas bet kurioje „Java“ programų srityje, kur reikalingas duomenų formatavimas ir pateikimas. „Velocity“ turėtumėte naudoti dėl šių priežasčių:

  • Jis prisitaiko prie daugelio taikymo sričių
  • Tai siūlo paprastą, aiškią sintaksę šablonų dizaineriui
  • Jis siūlo paprastą programavimo modelį kūrėjui
  • Kadangi šablonai ir kodas yra atskiri, galite juos kurti ir prižiūrėti savarankiškai
  • „Velocity“ variklis lengvai integruojasi į bet kurią „Java“ programų aplinką, ypač servletus
  • „Greitis“ leidžia šablonams pasiekti bet kurį viešą duomenų objektų metodą kontekste

Paskutinis punktas yra svarbus - tai reiškia, kad galite pakartotinai naudoti esamas klases. Taigi objektų, kuriuos norite naudoti savo šablonuose, nereikia tam tikru būdu struktūrizuoti, pvz., „JavaBeans“, arba įgyvendinti specialius įvesties / išvesties ar gyvavimo ciklo režimus, tokius kaip JSP („JavaServer Pages“) žymekliai. Vienintelis reikalavimas yra tas, kad metodai būtų vieši. Tai pamatysite daugiau, kai išsamiai aptarsime šablono kalbą.

Viena iš „Velocity“ stipriųjų pusių yra ta, kad programoje griežtai siekiama atskirti funkcinę atsakomybę. Tai daro apribodamas šablonų prieigą prie objektų, kuriuos specialiai suteikia programos kodas. Tai reiškia, kad dizaineriai gali sutelkti dėmesį tik į duomenų pateikimą (vaizdą), o programų programuotojas - į „Model-View-Controller“ (MVC) - programos valdymą (valdiklį) ir verslo logiką bei duomenų valdymą (modelis). plėtrą. MVC yra gerai priimtas kūrimo modelis, kuris supaprastina sudėtingų programų kūrimą ir nuolatinę priežiūrą.

Kur aš jį naudoju?

Greitis sėkmingai naudojamas:

  • „Servlet“ pagrindu sukurtos žiniatinklio programos
  • Java ir SQL kodų generavimas
  • XML apdorojimas ir transformavimas
  • Teksto apdorojimas, pvz., RTF failų generavimas

„Velocity“ dažniausiai naudojamas kaip atvaizdavimo variklis, skirtas kurti „Java“ servletais pagrįstoms žiniatinklio programoms, vietoj JSP ar kitų atvaizdavimo technologijų arba kartu su jomis. Be paprastos, prižiūrimos šablonų sintaksės, „Velocity“ yra naudojamas kuriant žiniatinklį, nes jo šablono kalba gali manipuliuoti ir pateikti duomenis, o ne kurti duomenis. Tai atgraso programavimas šablonuose. Tai yra geras dalykas; jis išlaiko jūsų „Java“ kodo verslo ir programų logiką ten, kur jie priklauso.

„Velocity“ puikiai tinka J2EE („Java 2 Platform“, „Enterprise Edition“) žiniatinklio plėtrai, nes platforma pritaikyta kitoms nei JSP išvesties technologijoms. Nors JSP yra įtrauktas į J2EE specifikaciją, J2EE jo naudoti nereikia.

Kaip tai veikia?

Norėdami sukurti „Velocity“ programą, naudojate tą patį bendrą procesą, kaip ir bet kurią kitą programą. Panagrinėkime įdomesnį pavyzdį nei aukščiau pateikta „Hello World“ programa. Tarkime, kad jūs valdote naminių gyvūnėlių parduotuvę ir norite sugadinti el. Laišką, kad paskelbtumėte apie pardavimą. Pirmiausia turite sukurti el. Pašto adresą, tada sukurti šabloną ir kodą, pagrįstą tuo dizainu.

Projektavimo laiko svarstymai

Turite atsižvelgti į tris savo dizaino elementus:

  • Kokius duomenis įtraukti į el. Laišką
  • Kokia turėtų būti duomenų elementų forma (pavyzdžiui, kaip Sąrašas, Žemėlapisarba Stygos)
  • Kaip vadinti tuos duomenų elementus

Tarkime, kad šiame pavyzdyje pasirenkate tris parduodamus naminius gyvūnėlius, kurių kiekvieno skelbiama kaina skiriasi. Jūs nuspręsite naudoti žemėlapį susieti kiekvieno augintinio vardą ir kainą, tada visus tris žemėlapius išsaugosite sąraše. Jūs vadinate šį sąrašą „petList“, augintinio vardas vardas, o kaina kaip kaina žemėlapyje. Dabar, kai nustatėte reikiamus duomenis, jų atvaizdavimą ir pavadinimo kriterijus, galite parašyti kodą ir šablono dizainą.

Parašykite kodą ir šablono dizainą

Kai susitarsite dėl duomenų specifikos, „Velocity“ leis lygiagrečiai rašyti kodą ir kurti šabloną. Dizaineris integruoja duomenis į nondata pateikimo turinį (pvz., Paveikslėlius, tekstą ir pan.) Šablone. Tokiu atveju tiesiog rašome el. Laiško tekste:

 $ petList.size () Parduodami naminiai gyvūnai! Mes didžiuojamės galėdami pasiūlyti šiuos puikius augintinius šiomis nuostabiomis kainomis. Tik šį mėnesį pasirinkite iš: #foreach ($ pet in $ petList) $ pet.name tik $ pet.price #end Skambinkite šiandien! 

Kaip programuotojas, turite:

  • Gauti visus duomenis iš duomenų šaltinių - duomenų bazę per JDBC („Java Database Connectivity“), failą ar tiesiog ką nors apskaičiuoto
  • Įdėkite tuos duomenis į kontekstą naudodami sutartus pavadinimus
  • Pateikite šabloną su kontekstu, kad gautumėte išvestį

Galite prisiminti „Hello World“ pavyzdį, kurį paminėjau pamokoje „VelocityContext“ kaip kontekste. Modeliuojama pagal a java.util.Žemėlapis, kontekstas yra objektas, kuriame yra duomenys, kuriuos pateikia programa arba servletas, prie kurio prieina šablonas.

Šiame pavyzdyje mes gauname visus duomenis iš savo duomenų šaltinių (šiuo atveju sujungiame juos į kodą), sutvarkome ir įtraukiame į kontekstą:

 / * sukurkite mūsų žemėlapių sąrašą * / ArrayList list = new ArrayList (); Žemėlapio žemėlapis = new HashMap (); map.put („vardas“, „arklys“); map.put ("kaina", "00.00"); sąrašas.add (žemėlapis); map = new HashMap (); map.put („vardas“, „šuo“); map.put („kaina“, „9,99“); sąrašas.add (žemėlapis); map = new HashMap (); map.put („vardas“, „lokys“); map.put ("kaina", ".99"); sąrašas.add (žemėlapis); / * pridėti tą sąrašą prie „VelocityContext“ * / „VelocityContext“ kontekstas = naujas „VelocityContext“); context.put („petList“, sąrašas); 

Atrodo, kad mes tikrai norime atsikratyti tų lokių!

Dabar, kai duomenys bus sutvarkyti ir patalpinti kontekste, o šablonas bus paruoštas, mes galėsime pateikti šabloną pagal kontekstą. Štai kodas:

importuoti java.io.StringWriter; importuoti java.util.List; importuoti java.util.ArrayList; importuoti java.util.Žemėlapis; importuoti java.util.HashMap; importuoti org.apache.velocity.Template; importuoti org.apache.velocity.VelocityContext; importuoti org.apache.velocity.app.VelocityEngine; public class PetStoreEmail {public static void main (String [] args) pirmiausia išmeta išimtį {/ *, gaukite ir inicializuokite variklį * / VelocityEngine ve = new VelocityEngine (); ve.init (); / * sutvarkykite mūsų duomenis * / ArrayList list = new ArrayList (); Žemėlapio žemėlapis = new HashMap (); map.put („vardas“, „arklys“); map.put ("kaina", "00.00"); sąrašas.add (žemėlapis); map = new HashMap (); map.put („vardas“, „šuo“); map.put („kaina“, „9,99“); sąrašas.add (žemėlapis); map = new HashMap (); map.put („vardas“, „lokys“); map.put ("kaina", ".99"); sąrašas.add (žemėlapis); / * pridėti tą sąrašą prie „VelocityContext“ * / „VelocityContext“ kontekstas = naujas „VelocityContext“); context.put („petList“, sąrašas); / * gauti šabloną * / šabloną t = ve.getTemplate ("petstoreemail.vm"); / * dabar pateikite šabloną į Writer * / StringWriter rašytojas = new StringWriter (); t.merge (kontekstas, rašytojas); / * naudokite išvestį savo el. pašto kūne * / sendEmail (rašytojas.toString ()); }} 

Ši visa programa sukuria jūsų el. Pašto turinį. Kadangi „Velocity“ šablonus paverčia a Rašytojas, galite lengvai valdyti išvestį. Šiuo atveju atvaizduota išvestis pateko į a Stygos per StringWriter, bet lengvai galėjo patekti į failą, naršyklę ar BLOB (dvejetainis didelis objektas) duomenų bazėje. Tai yra viena iš priežasčių, kodėl „Velocity“ taip lengvai integruojasi į „Java“ programas.

Programos išvestis (jūsų el. Pašto turinys) atrodo taip:

 3 naminiai gyvūnai parduodami! Mes didžiuojamės galėdami pasiūlyti šiuos puikius augintinius šiomis nuostabiomis kainomis. Tik šį mėnesį rinkitės: arklys tik 00,00 šuniui tik 9,99 meškos tik 0,99 Skambinkite šiandien! 

Greičio šablono kalba

Parodžiau „Velocity“ šablonus dviem skirtingiems pavyzdžiams, tačiau nei vienu, nei kitu atveju nepaaiškinau, ką padarė specialus žymėjimas (nors tikriausiai galėjote atspėti).

„Velocity Template Language“ (VTL) yra paprasta sintaksė, sudaranti dvi dalis: nuorodos, prieigos prie objektų konteksto formalizmas; ir direktyvos, teiginių rinkinys, naudojamas kontrolei ir veiksmams. VTL apibūdinamas kaip „kalbos apibrėžimas su funkcijų rinkiniu, kuris patogiai telpa ant standartinės vizitinės kortelės“ (žr. Jimo Jagielskio knygą „Greitis su greičiu“). VTL bendruomenė tyčia laikė paprastą ir mažą.

Literatūra

Nuorodos šablono prieigos duomenyse. Jie laisvai maišosi su šablono ne VTL turiniu. Oficialiai apibrėžta, nuoroda yra bet kokia šablono dalis, prasidedanti simboliu „$“ ir nurodo į kažką kontekste. Jei kontekste nėra atitinkamo duomenų objekto, šablonas paprasčiausiai traktuoja nuorodą kaip tekstą ir pateikia ją tokią, kokia yra, išvesties sraute.

Čia yra trumpas šablonas, kuriame pateikiama paprasta nuoroda, sumaišyta su ne VTL turiniu:

 Labas $ name! Sveiki atvykę į „Velocity“! 

Čia nuoroda yra $ vardas. Kaip ir „Hello World“ pavyzdyje, „Velocity“ pakeičia $ vardas šablone su toString () grįžtamoji vertė to, kas patalpinta kontekste po raktu vardas:

 Labas pasauli! Sveiki atvykę į „Velocity“! 

Nuoroda „Greitis“ suteikia prieigą prie bet kokio objekto viešojo metodo, o šablono sintaksė yra tokia pati, kokia būtų „Java“ kode. Štai keli pavyzdžiai:

 Yra elementai $ myBean.getSize (). $ myObject.anotherMethod (1, "daugiau duomenų") $ foo.getBar (). barMethod ("labas", $ moredata) $ foo.myMethod ($ bar.callThis ()) 

Iš „Pet Store“ el. Pašto pavyzdžio galite prisiminti, kad vardą ir kainą mes išsaugojome a java.util.Žemėlapisir pasiekė duomenis naudodamas du žetonus vardas ir kaina, kurių kaip metodų nėra java.util.Žemėlapis klasė:

 $ pet.name tik $ pet.price 

Tai veikia, nes „Velocity“ apima į „JavaBean“ panašų introspekcijos mechanizmą, kuris leidžia jums išreikšti metodo prieigą nuorodose naudojant nuosavybės žymėjimą. „Pet Store“ pavyzdžio šablone „Velocity“ introspekcijos priemonė suranda ir iškviečia Žemėlapis's viešojo objekto gavimas (eilutė) metodas su klavišais vardas ir kaina. Tais pačiais duomenimis galėtume prisijungti kitaip gauti (stygos) metodas tiesiogiai šablone:

 $ pet.get ('name') tik už $ pet.get ('price') 

Tai suteiktų tą patį rezultatą ir geriau atspindėtų tai, kas iš tikrųjų vyksta. Tačiau kitą būdą, kuris naudoja ypatybių žymėjimą, yra lengviau perskaityti ir jis nesieja jūsų šablono su konkrečia duomenų klasės įgyvendinimu. Pvz., Galite pakeisti Žemėlapis viduje konors Sąrašas su klase, kuri turi viešuosius metodus getName () ir „getPrice“ ()ir toliau veiks originalus pavyzdinis šablonas, kuriame yra:

 $ pet.name tik $ pet.price