Programmēšana

Palaidiet ātruma veidnes motoru

Ātruma veidņu programma ļauj renderēt datus no lietojumprogrammām un servletiem. Velocity tīrā veidņu un Java koda atdalīšana, ko galvenokārt izmanto dinamisku, uz servletiem balstītu vietņu izstrādei, padara to ideāli piemērotu MVC Web izstrādei. Kā vispārīgs veidņu motors, Velocity ir piemērots daudziem citiem mērķiem, piemēram, kodu ģenerēšanai, XML ģenerēšanai un pārveidošanai, kā arī teksta plūsmas apstrādei. Šis raksts iepazīstina ar ātruma veidnes valodu (VTL) un sniedz ātruma motora izmantošanas piemērus, tostarp par Web satura ģenerēšanu Java servlet vidē.

Velocity ir atvērtā koda veidņu rīks, ko izstrādājusi starptautiska brīvprātīgo kopiena un ko rīko Apache programmatūras fonda Džakartas projekts. Džakartas ātruma projekta vietnē, kurā varat lejupielādēt brīvi pieejamo pirmkodu, plaukstoša un augoša lietotāju kopiena ir gatava atbildēt uz jautājumiem un piedāvāt risinājumus izplatītākajām veidņu problēmām. Velocity iedvesmoja novatoriskais WebMacro projekts, darbs, par kuru mēs Velocity sabiedrībā esam pateicīgi.

Šajā rakstā es iepazīstinu ar īsu pamatu par Velocity Template Engine un tā veidņu valodu Velocity Template Language (VTL). Es arī parādīju, kā izmantot ātrumu, izmantojot vairākus piemērus.

Sveika pasaule, protams

Neviens ar programmēšanu saistītā priekšmeta skaidrojums nebūtu pilnīgs bez Hello World piemēra. Jebkurai lietojumprogrammai, izmantojot ātrumu, ir nepieciešamas divas daļas. Pirmais ir veidne, kas šajā piemērā ir fails ar nosaukumu helloworld.vm:

 Sveiks $ name! Laipni lūdzam Velocity! 

Otrais ir atbilstošā Java programma ar nosaukumu HelloWorld.java:

importēt java.io.StringWriter; importēt org.apache.velocity.app.VelocityEngine; importēt org.apache.velocity.Template; importēt org.apache.velocity.VelocityContext; public class HelloWorld {public static void main (String [] args) vispirms izmet Izņēmumu {/ *, iegūstiet un inicializējiet motoru * / VelocityEngine ve = new VelocityEngine (); ve.init (); / * pēc tam iegūstiet Veidni * / Veidni t = ve.getTemplate ("helloworld.vm"); / * izveidot kontekstu un pievienot datus * / VelocityContext context = new VelocityContext (); context.put ("nosaukums", "Pasaule"); / * tagad atveido veidni kā StringWriter * / StringWriter rakstītājs = new StringWriter (); t.merge (konteksts, rakstnieks); / * parādīt pasaulei * / System.out.println (writer.toString ()); }} 

Tagad, kad jūs apkopojat un palaižat šo programmu, redzēsit izvadi:

 Sveika pasaule! Laipni lūdzam Velocity! 

Šis ir niecīgs piemērs, taču tajā ir izšķiroši gabali, lai sniegtu priekšstatu par to, kas ir Velocity veidne.

Kāpēc man to izmantot?

Izstrādāts kā viegli lietojams vispārīgs veidņu rīks, Velocity ir noderīgs jebkurā Java lietojumprogrammas apgabalā, kur nepieciešams datu formatējums un prezentācija. Velocity jāizmanto šādu iemeslu dēļ:

  • Tas pielāgojas daudzām lietojuma jomām
  • Tas piedāvā vienkāršu, skaidru sintaksi veidņu noformētājam
  • Tas piedāvā vienkāršu programmēšanas modeli izstrādātājam
  • Tā kā veidnes un kods ir atsevišķi, varat tos izstrādāt un uzturēt neatkarīgi
  • Motors Velocity viegli integrējas jebkurā Java lietojumprogrammu vidē, it īpaši servletēs
  • Ātrums ļauj veidnēm piekļūt jebkurai publiskai datu objektu metodei kontekstā

Pēdējais punkts ir svarīgs - tas nozīmē, ka jūs varat atkārtoti izmantot esošās klases. Tātad objektiem, kurus vēlaties izmantot veidnēs, nav jābūt strukturētiem noteiktā veidā, piemēram, JavaBeans, vai jāievieš īpaši I / O vai dzīves cikla režīmi, piemēram, JSP (JavaServer Pages) taglibs. Vienīgā prasība ir, lai metodes būtu publiskas. Jūs redzēsiet vairāk par to, kad mēs detalizēti aplūkosim veidnes valodu.

Viena no Velocity priekšrocībām ir tā, ka tā stingri īsteno funkcionālās atbildības nodalīšanu lietojumprogrammā. Tas tiek darīts, ierobežojot piekļuvi veidnēm objektiem, kurus lietojumprogrammas kods īpaši padara pieejamus. Tas nozīmē, ka dizaineri var koncentrēties tikai uz datu prezentāciju (skatu), bet lietojumprogrammu programmētājs var koncentrēties uz lietojumprogrammu vadību (kontrolieris) un biznesa loģiku un datu pārvaldību (modelis) Model-View-Controller (MVC) attīstību. MVC ir labi pieņemts izstrādes modelis, kas vienkāršo gan sarežģītu lietojumprogrammu izstrādi, gan pastāvīgu uzturēšanu.

Kur es to izmantoju?

Ātrums tiek veiksmīgi izmantots:

  • Uz servleta balstītas tīmekļa lietojumprogrammas
  • Java un SQL kodu ģenerēšana
  • XML apstrāde un pārveidošana
  • Teksta apstrāde, piemēram, RTF failu ģenerēšana

Ātrums visbiežāk tiek izmantots kā renderēšanas dzinējs Java servletī balstītu tīmekļa lietojumprogrammu izstrādei JSP un citu renderēšanas tehnoloģiju vietā vai kopā ar tām. Bez ērtas, uzturamas veidņu sintakses, Web izstrādē tiek izmantots ātrums, jo tā veidņu valoda var manipulēt un attēlot datus, nevis veidot datus. Tas attur programmēšana veidnēs. Tā ir laba lieta; tas saglabā jūsu Java koda biznesa un lietojumprogrammu loģiku tur, kur tie pieder.

Ātrums ir labi piemērots J2EE (Java 2 Platform, Enterprise Edition) tīmekļa izstrādei, jo platformā ir izvietotas citas izejas tehnoloģijas, nevis JSP. Kaut arī JSP ir iekļauts J2EE specifikācijā, J2EE to neprasa.

Kā tas darbojas?

Lai izveidotu uz ātrumu balstītu lietojumprogrammu, jūs izmantojat to pašu vispārīgo procesu, ko izmantojat jebkurai lietojumprogrammai. Apsvērsim interesantāku piemēru nekā iepriekš lietotne Hello World. Pieņemsim, ka jūs pārvaldāt pet veikalu un vēlaties ģenerēt e-pasta ziņojumu, lai paziņotu par pārdošanu. Pirmkārt, jums jāveido e-pasts un pēc tam jāizstrādā veidne un kods, pamatojoties uz šo dizainu.

Dizaina laika apsvērumi

Dizainā jāņem vērā trīs elementi:

  • Kādi dati jāiekļauj e-pastā
  • Kādai formai vajadzētu būt datu elementiem (piemēram, kā Saraksts, Kartevai Stīga)
  • Kā tos datu elementus nosaukt

Pieņemsim, ka šajā piemērā jūs nolemjat pārdot trīs mājdzīvniekus, kuriem katram ir atšķirīga reklamētā cena. Jūs nolemjat izmantot karti, lai saistītu katru mājdzīvnieka vārdu un tā cenu, un pēc tam visas trīs kartes glabājat sarakstā. Jūs saucat šo sarakstu petList, mājdzīvnieka vārds nosaukums, un cena kā cena kartē. Tagad, kad esat identificējis attiecīgos datus, to attēlojumu un nosaukšanas kritērijus, varat uzrakstīt kodu un veidnes noformējumu.

Uzrakstiet kodu un veidnes noformējumu

Kad esat vienojies par datu specifiku, Velocity ļauj paralēli rakstīt kodu un noformēt veidni. Dizainers datus integrē nondata prezentācijas saturā (piemēram, attēlos, tekstā utt.) Veidnē. Šajā gadījumā e-pasta pamattekstā vienkārši ierakstām:

 $ petList.size () Mājdzīvnieki pārdošanā! Mēs lepojamies, ka piedāvājam šos lieliskos mājdzīvniekus par šīm apbrīnojamām cenām. Tikai šajā mēnesī izvēlieties kādu no: #foreach ($ pet in $ petList) $ pet.name tikai $ pet.price #end Zvaniet šodien! 

Kā programmētājam jums:

  • Iegūstiet visus datus no datu avotiem - datu bāzes, izmantojot JDBC (Java Database Connectivity), failu vai vienkārši kaut ko aprēķinātu
  • Ievietojiet šos datus kontekstā, izmantojot saskaņotos vārdus
  • Atveidojiet veidni ar kontekstu, lai izveidotu izvadi

Jūs varat atcerēties piemēru Hello World, kuru es atsaucos uz nodarbību VelocityContextkontekstā. Modelēts pēc a java.util.Karte, konteksts ir objekts, kurā glabājas lietojumprogrammas vai servleta sniegtie dati, kuriem piekļūst veidne.

Šajā piemērā mēs iegūstam visus datus no mūsu datu avotiem (šajā gadījumā mēs tos savienojam kodā), sakārtojam un pievienojam kontekstam:

 / * izveidojiet mūsu karšu sarakstu * / ArrayList list = new ArrayList (); Kartes karte = new HashMap (); map.put ("nosaukums", "zirgs"); map.put ("cena", "00.00"); saraksts.pievienot (karte); karte = new HashMap (); map.put ("vārds", "suns"); map.put ("cena", "9,99"); saraksts.pievienot (karte); karte = new HashMap (); map.put ("vārds", "lācis"); map.put ("cena", ".99"); saraksts.pievienot (karte); / * pievienot šo sarakstu VelocityContext * / VelocityContext context = new VelocityContext (); context.put ("petList", saraksts); 

Šķiet, ka mēs patiešām vēlamies atbrīvoties no šiem lāčiem!

Tagad, kad dati ir sakārtoti un ievietoti kontekstā, un veidne ir gatava, mēs varam atveidot veidni atbilstoši kontekstam. Šeit ir kods:

importēt java.io.StringWriter; importēt java.util.List; importēt java.util.ArrayList; importēt java.util.Map; importēt java.util.HashMap; importēt org.apache.velocity.Template; importēt org.apache.velocity.VelocityContext; importēt org.apache.velocity.app.VelocityEngine; public class PetStoreEmail {public static void main (String [] args) vispirms izmet Izņēmumu {/ *, iegūstiet un inicializējiet motoru * / VelocityEngine ve = new VelocityEngine (); ve.init (); / * sakārtot mūsu datus * / ArrayList list = new ArrayList (); Kartes karte = new HashMap (); map.put ("nosaukums", "zirgs"); map.put ("cena", "00.00"); saraksts.pievienot (karte); karte = new HashMap (); map.put ("nosaukums", "suns"); map.put ("cena", "9,99"); saraksts.pievienot (karte); karte = new HashMap (); map.put ("vārds", "lācis"); map.put ("cena", ".99"); saraksts.pievienot (karte); / * pievienot šo sarakstu VelocityContext * / VelocityContext context = new VelocityContext (); context.put ("petList", saraksts); / * iegūstiet veidni * / veidni t = ve.getTemplate ("petstoreemail.vm"); / * tagad renderējiet veidni rakstītājā * / StringWriter rakstītājs = new StringWriter (); t.merge (konteksts, rakstnieks); / * izmantojiet izvadi e-pasta pamattekstā * / sendEmail (writer.toString ()); }} 

Šī pilnīgā programma ģenerē jūsu e-pasta struktūru. Tā kā ātrums padara veidnes par a rakstnieks, jūs varat viegli pārvaldīt izvadi. Šajā gadījumā atveidotā izeja nonāca a Stīga caur StringWriter, taču tas viegli varēja tikt pāriet uz failu, pārlūku vai BLOB (binārs liels objekts) datu bāzē. Tas ir viens iemesls, kāpēc Velocity tik viegli integrējas Java lietojumprogrammās.

Programmas izeja (jūsu e-pasta pamatteksts) izskatās šādi:

 Pārdošanā ir 3 mājdzīvnieki! Mēs lepojamies, ka piedāvājam šos lieliskos mājdzīvniekus par šīm apbrīnojamām cenām. Tikai šajā mēnesī izvēlieties: zirgs tikai 00.00 sunim tikai 9.99 lācim tikai .99 Zvani šodien! 

Ātruma veidnes valoda

Esmu parādījis ātruma veidnes diviem dažādiem piemēriem, taču nevienā no gadījumiem es neesmu paskaidrojis, ko īpašais marķējums darīja (lai gan jūs droši vien varēja uzminēt).

Ātruma veidņu valoda (VTL) ir vienkārša sintakse, kas nodrošina divas daļas: atsauces, formālisms piekļuvei objektiem kontekstā; un direktīvas, paziņojumu kopums, ko izmanto kontrolei un darbībai. Aprakstīts kā "valodas definīcija ar funkciju komplektu, kas ērti ietilpst standarta vizītkartē" (skat. Džima Jagielska "Ātrumu ar ātrumu") VTL kopiena ir tīši turējusi vienkāršu un mazu.

Atsauces

Atsauces veidnes piekļuves datos. Viņi brīvi sajaucas ar veidnes saturu, kas nav VTL. Formāli noteikts, atsauce ir jebkas veidnē, kas sākas ar rakstzīmi '$' un attiecas uz kaut ko kontekstā. Ja kontekstā nepastāv atbilstošs datu objekts, veidne atsauci vienkārši uztver kā tekstu un izvades straumē padara to par tādu, kāds tas ir.

Šeit ir īsa veidne, kurā ir vienkārša atsauce, kas sajaukta ar saturu, kas nav VTL:

 Sveiks $ name! Laipni lūdzam Velocity! 

Šeit atsauce ir $ nosaukums. Tāpat kā Hello World piemērā, Velocity aizstāj $ nosaukums veidnē ar toString () atgriešanas vērtība tam, kas kontekstā ievietots zem atslēgas nosaukums:

 Sveika pasaule! Laipni lūdzam Velocity! 

Ātruma atsauce ļauj piekļūt jebkura objekta publiskajai metodei, un veidnes sintakse ir tāda pati kā Java kodā. Šeit ir daži piemēri:

 Ir $ myBean.getSize () elementi. $ myObject.anotherMethod (1, "vairāk datu") $ foo.getBar (). barMethod ("labdien", $ moredata) $ foo.myMethod ($ bar.callThis ()) 

No Pet Store e-pasta piemēra varat atcerēties, ka mēs saglabājām nosaukumu un cenu a java.util.Karte, un piekļuva datiem, izmantojot divus marķierus nosaukums un cena, kas nav metodes kā java.util.Karte klase:

 $ pet.name tikai par $ pet.price 

Tas darbojas, jo Velocity ietver JavaBean līdzīgu introspekcijas mehānismu, kas ļauj izteikt metodes piekļuves atsaucēs, izmantojot rekvizītu apzīmējumu. Pet Store piemēru veidnē Velocity introspekcijas iekārta atrod un izsauc Karte's publiskā objekta iegūšana (virkne) metodi ar taustiņiem nosaukums un cena. Mēs varētu piekļūt tiem pašiem datiem citādā veidā, atsaucoties uz iegūt (virkne) metodi tieši veidnē:

 $ pet.get ('name') tikai par $ pet.get ('price') 

Tas radītu tādu pašu rezultātu un labāk atspoguļotu to, kas faktiski notiek. Tomēr cits veids, kā tiek izmantots īpašuma apzīmējums, ir vieglāk lasāms un nesaista jūsu veidni ar datu klases specifisko ieviešanu. Piemēram, jūs varat aizstāt Karte iekš Saraksts ar klasi, kurai ir publiskas metodes getName () un getPrice ()un sākotnējā veidnes parauga paraugs, kas satur šādu informāciju, turpinās darboties:

 $ pet.name tikai par $ pet.price 
$config[zx-auto] not found$config[zx-overlay] not found