Introduksjon til Apache Velocity
1. Oversikt
Velocity er en Java-basert malmotor.
Det er et open source-nettrammeverk designet for å brukes som en visningskomponent i MVC-arkitekturen, og det gir et alternativ til noen eksisterende teknologier som JSP.
Velocity kan brukes til å generere XML-filer, SQL, PostScript og de fleste andre tekstbaserte formater.
I denne artikkelen vil vi utforske hvordan den kan brukes til å lage dynamiske websider.
2. Hvordan Velocity fungerer
Kjerneklassen til Velocity er VelocityEngine.
Den orkestrerer hele prosessen med å lese, analysere og generere innhold ved hjelp av datamodell og hastighetsmal.
Enkelt sagt, her er trinnene vi må følge for alle typiske hastighetsapplikasjoner:
- Initialiser hastighetsmotoren
- Les malen
- Sett datamodellen i kontekstobjekt
- Slå malen sammen med kontekstdata og gjengi visningen
La oss gå gjennom et eksempel ved å følge disse enkle trinnene:
VelocityEngine velocityEngine = ny VelocityEngine (); velocityEngine.init (); Mal t = velocityEngine.getTemplate ("index.vm"); VelocityContext context = ny VelocityContext (); context.put ("navn", "Verden"); StringWriter-forfatter = ny StringWriter (); t.merge (kontekst, forfatter);
3. Maven-avhengigheter
For å jobbe med Velocity, må vi legge til følgende avhengigheter i Maven-prosjektet vårt:
org.apache.velocity velocity 1.7 org.apache.velocity velocity-tools 2.0
Den siste versjonen av begge disse avhengighetene kan være her: hastighet og hastighetsverktøy.
4. Velocity Mal Language
Velocity Template Language (VTL) gir den enkleste og reneste måten å innlemme det dynamiske innholdet på en webside ved hjelp av VTL-referanser.
VTL-referanse i hastighetsmal starter med en $ og brukes til å få verdien som er knyttet til den referansen. VTL gir også et sett med direktiver som kan brukes til å manipulere utgangen av Java-koden. Direktivene starter med #.
4.1. Referanser
Det er tre typer referanser i hastighet, variabler, egenskaper og metoder:
- variabler - definert på siden ved hjelp av #sett direktiv eller verdi returnert fra Java-objektets felt:
#set ($ message = "Hello World")
- eiendommer - referer til felt i et objekt; de kan også referere til a getter metode for eiendommen:
$ customer.name
- metoder - referer til metoden på Java-objekt:
$ customer.getName ()
Den endelige verdien fra hver referanse konverteres til en streng når den gjengis til den endelige utgangen.
4.2. Direktiver
VTL gir et rikt sett med direktiver:
- sett - den kan brukes til å sette verdien til en referanse; denne verdien kan tilordnes en variabel eller en eiendomsreferanse:
#set ($ message = "Hello World") #set ($ customer.name = "Brian Mcdonald")
- betingede – #if, #elseif og #ellers direktiver gir en måte å generere innholdet på grunnlag av betingede kontroller:
#if ($ ansatte.designation == "Manager")
sjef
#elseif ($ ansatte.designation == "Seniorutvikler")Senior programvareingeniør
#ellersLærling
#slutt - løkker – #for hver direktivet tillater looping over en samling objekter:
- #foreach ($ produkt i $ productList)
- $ produkt #slutt
- inkludere – #inkludere element gir muligheten til å importere filer til malen:
#include ("one.gif", "two.txt", "three.html" ...)
- analysere – #parse uttalelse lar maledesigneren importere en annen lokal fil som inneholder VTL; Velocity vil deretter analysere innholdet og gjengi det:
#parse (mal)
- evaluere – #evaluere direktivet kan brukes til å evaluere VTL dynamisk; dette gjør at malen kan evaluere en String på gjengivelsestid, for eksempel for å internasjonalisere malen:
#set ($ firstName = "David") #set ($ lastName = "Johnson") #set ($ dynamicsource = "$ firstName $ lastName") #evaluate ($ dynamicsource)
- gå i stykker – #gå i stykker direktivet stopper enhver videre gjengivelse av gjeldende gjennomføringsomfang (dvs. #for hver, #parse)
- Stoppe – #Stoppe direktivet stopper videre gjengivelse og utførelse av malen.
- velocimacros – #makro direktivet lar maledesigneren definere et gjentatt segment av VTL:
#makro (tablerows)
#sluttDenne makroen kan nå plasseres hvor som helst i malen som #tablerows ():
#macro (tablerows $ color $ productList) #foreach ($ product in $ productList)
#end #end$ product.name
4.3. Andre funksjoner
- matte - en håndfull innebygde matematiske funksjoner, som kan brukes i maler:
#set ($ percent = $ number / 100) #set ($ rest = $ dividend% $ divisor)
- rekkeviddeoperatør - som kan brukes i forbindelse med #sett og #for hver:
#set ($ array = [0..10]) #foreach ($ elem i $ arr) $ elem #end
5. Velocity Servlet
Den primære jobben til Velocity Engine er å generere innhold basert på en mal.
Motoren inneholder ingen nettrelaterte funksjoner i seg selv. For å implementere en webapplikasjon, må vi bruke et servlet eller servletbasert rammeverk.
Velocity gir en ut av boksen implementering VelocityViewServlet, som er en del av delprosjektet velocity-tools.
For å gjøre bruk av den innebygde funksjonaliteten som tilbys av VelocityViewServlet, vi kan utvide servlet fra VelocityViewServlet og overstyre handleRequest () metode:
offentlig klasse ProductServlet utvider VelocityViewServlet {ProductService-tjeneste = ny ProductService (); @Override public Template handleRequest (HttpServletRequest request, HttpServletResponse response, Context context) kaster Unntak {List produkter = service.getProducts (); context.put ("produkter", produkter); returner getTemplate ("index.vm"); }}
6. Konfigurasjon
6.1. Nettkonfigurasjon
La oss nå se hvordan du konfigurerer VelocityViewServlet i web.xml.
Vi må spesifisere de valgfrie initialiseringsparametrene som inkluderer velocity.properties og verktøykasse.xml:
apache-velocity // ... velocity org.apache.velocity.tools.view.VelocityViewServlet org.apache.velocity.properties /WEB-INF/velocity.properties // ...
Vi må også spesifisere kartleggingen for denne servletten. Alle forespørsler om hastighetsmaler (* .vm) må betjenes av hastighetsservlet:
velocityLayout * .vm
6.2. Ressurslaster
Velocity gir fleksibelt ressurslaster system. Det gjør at en eller flere ressurslaster kan være i drift samtidig:
- FileResourceLoader
- JarResourceLoader
- ClassPathResourceLoader
- URLResourceLoader
- DataSourceResourceLoader
- WebappResourceLoader
Disse ressurslasterne er konfigurert i velocity.properties:
resource.loader = webapp webapp.resource.loader.class = org.apache.velocity.tools.view.WebappResourceLoader webapp.resource.loader.path = webapp.resource.loader.cache = true
7. Hastighetsmal
Velocity-mal er stedet der all logikk for visningsgenerering er skrevet. Disse sidene er skrevet ved hjelp av Velocity Template Language (VTL):
... ... $ products.size () Produkter på salg!
Vi er stolte av å tilby disse fine produktene til disse fantastiske prisene. ... # sett ($ count = 1)
Serienummer Produktnavn Pris #foreach ($ produkt i $ produkter) $ count) $ product.getName () $ product.getPrice () #set ($ count = $ count + 1) #end
8. Administrere sidelayout
Velocity gir en enkel layoutkontroll og tilpassbare feilskjermbilder for Velocity Tool-basert applikasjon.
VelocityLayoutServlet innkapsler denne muligheten til å gjengi de angitte oppsettene. VelocityLayoutServlet er en utvidelse til VelocityViewServlet.
8.1. Nettkonfigurasjon
La oss se hvordan du konfigurerer VelocityLayoutServlet. Servletten er definert for å fange opp forespørslene om hastighetsmal-sider, og de layoutspesifikke egenskapene er definert i velocity.properties fil:
// ... velocityLayout org.apache.velocity.tools.view.VelocityLayoutServlet org.apache.velocity.properties /WEB-INF/velocity.properties // ... velocityLayout * .vm // ...
8.2. Layoutmaler
Layoutmal definerer den typiske strukturen til en hastighetsside. Som standard er VelocityLayoutServlet søker etter Standard.vm under layoutmappen. Å overstyre noen eiendommer kan endre denne plasseringen:
tools.view.servlet.layout.directory = layout / tools.view.servlet.layout.default.template = Default.vm
Oppsettfilen består av topptekstmal, bunntekstmal og en hastighetsvariabel $ screen_content som gjengir innholdet på ønsket hastighetsside:
Velocity #parse ("/ fragmenter / header.vm") $ screen_content #parse ("/ fragmenter / footer.vm")
8.3. Layoutspesifikasjon i det forespurte skjermbildet
Oppsett for en bestemt skjerm kan defineres som en hastighetsvariabel i begynnelsen av en side. Det gjøres ved å sette denne linjen på siden:
#set ($ layout = "MyOtherLayout.vm")
8.4. Layoutspesifikasjon i forespørselsparameteren
Vi kan legge til en forespørselsparameter i spørringsstrengen layout = MyOtherLayout.vm og VLS vil finne det og gjengi skjermen i det oppsettet i stedet for å søke etter standardoppsettet.
8.5. Feilskjermbilder
Skreddersydd feilskjerm kan implementeres ved hjelp av hastighetslayout. VelocityLayoutServlet gir to variabler $ error_cause og $ stack_trace for å presentere unntaksdetaljene.
Feilsiden kan konfigureres i velocity.properties fil:
tools.view.servlet.error.template = Feil.vm
9. Konklusjon
I denne artikkelen har vi lært hvordan Velocity er et nyttig verktøy for å gjengi de dynamiske nettsidene. Vi har også sett forskjellige måter å bruke servlets på hastighet.
Vi har også en artikkel fokusert på en Velocity-konfigurasjon med Spring MVC her på Baeldung.
Den komplette koden for denne opplæringen er tilgjengelig på GitHub.