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

    #ellers

    Læ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)  #slutt

    Denne makroen kan nå plasseres hvor som helst i malen som #tablerows ():

    #macro (tablerows $ color $ productList) #foreach ($ product in $ productList) $ product.name #end #end

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)

#foreach ($ produkt i $ produkter) #set ($ count = $ count + 1) #end
SerienummerProduktnavnPris
$ count)$ product.getName ()$ product.getPrice ()

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.


$config[zx-auto] not found$config[zx-overlay] not found