Introduktion til Apache Velocity

1. Oversigt

Velocity er en Java-baseret skabelonmotor.

Det er en open source-webramme designet til at blive brugt som en visningskomponent i MVC-arkitekturen, og det giver et alternativ til nogle eksisterende teknologier såsom JSP.

Velocity kan bruges til at generere XML-filer, SQL, PostScript og de fleste andre tekstbaserede formater.

I denne artikel vil vi undersøge, hvordan det kan bruges til at oprette dynamiske websider.

2. Hvordan Velocity fungerer

Kerneklassen af ​​Velocity er VelocityEngine.

Det orkestrerer hele processen med læsning, parsing og generering af indhold ved hjælp af datamodel og hastighedsskabelon.

Kort sagt, her er de trin, vi skal følge for enhver typisk hastighedsapplikation:

  • Initialiser hastighedsmotoren
  • Læs skabelonen
  • Sæt datamodellen i kontekstobjekt
  • Flet skabelonen med kontekstdata, og gengiv visningen

Lad os gennemgå et eksempel ved at følge disse enkle trin:

VelocityEngine velocityEngine = ny VelocityEngine (); velocityEngine.init (); Skabelon t = velocityEngine.getTemplate ("index.vm"); VelocityContext context = ny VelocityContext (); context.put ("navn", "Verden"); StringWriter-forfatter = ny StringWriter (); t.merge (kontekst, forfatter);

3. Maven-afhængigheder

For at arbejde med Velocity skal vi tilføje følgende afhængigheder til vores Maven-projekt:

 org.apache.velocity hastighed 1.7 org.apache.velocity velocity-tools 2.0 

Den seneste version af begge disse afhængigheder kan være her: hastighed og hastighedsværktøjer.

4. Velocity Template Language

Velocity Template Language (VTL) giver den enkleste og reneste måde at integrere det dynamiske indhold på en webside ved hjælp af VTL-referencer.

VTL-reference i hastighedsskabelon starter med en $ og bruges til at hente den værdi, der er knyttet til denne reference. VTL giver også et sæt direktiver, der kan bruges til at manipulere output af Java-koden. Disse direktiver starter med #.

4.1. Referencer

Der er tre typer referencer i hastighed, variabler, egenskaber og metoder:

  • variabler - defineret på siden ved hjælp af #sæt direktiv eller værdi returneret fra Java-objekts felt:
    #set ($ message = "Hello World")
  • ejendomme - henvise til felter i et objekt de kan også henvise til en getter ejendomens metode:
    $ kunde.navn
  • metoder - henvis til metoden på Java-objekt:
    $ customer.getName ()

Den endelige værdi, der er resultatet af hver reference, konverteres til en streng, når den gengives til den endelige output.

4.2. Direktiver

VTL leverer et rigt sæt direktiver:

  • sæt - den kan bruges til at indstille værdien af ​​en reference; denne værdi kan tildeles en variabel eller en egenskabsreference:
    #set ($ message = "Hello World") #set ($ customer.name = "Brian Mcdonald")
  • betingede#if, #elseif og #andet direktiver giver mulighed for at generere indholdet baseret på betinget kontrol:
    #if ($ medarbejder.designation == "Manager") 

    Manager

    #elseif ($ medarbejder.designation == "Seniorudvikler")

    Senior softwareingeniør

    #andet

    Praktikant

    #ende
  • sløjfer#for hver direktivet tillader looping over en samling objekter:
      #foreach ($ produkt i $ productList)
    • $ produkt
    • #ende
  • omfatte#omfatte element giver mulighed for at importere filer til skabelonen:
    #include ("one.gif", "two.txt", "three.html" ...)
  • parse#parse erklæring tillader skabelondesigneren at importere en anden lokal fil, der indeholder VTL; Velocity analyserer derefter indholdet og gengiver det:
    #parse (skabelon)
  • vurdere#vurdere direktiv kan bruges til at evaluere VTL dynamisk; dette gør det muligt for skabelonen at evaluere en Snor på gengivelsestidspunkt, for eksempel for at internationalisere skabelonen:
    #set ($ firstName = "David") #set ($ lastName = "Johnson") #set ($ dynamicsource = "$ firstName $ lastName") #evaluate ($ dynamicsource)
  • pause#pause direktiv stopper enhver yderligere gengivelse af nuværende eksekveringsomfang (dvs. #for hver, #parse)
  • hold op#hold op direktiv stopper enhver yderligere gengivelse og udførelse af skabelonen.
  • velocimacros#makro direktiv giver skabelondesigneren mulighed for at definere et gentaget segment af VTL:
    #makro (tablerows)  #ende

    Denne makro kan nu placeres på ethvert sted i skabelonen som #tablerows ():

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

4.3. Andre funktioner

  • matematik - en håndfuld indbyggede matematiske funktioner, som kan bruges i skabeloner:
    # sæt ($ procent = $ antal / 100) # sæt ($ rest = $ udbytte% $ divisor)
  • rækkeviddeoperatør - der kan bruges sammen med #sæt og #for hver:
    #set ($ array = [0..10]) #foreach ($ elem i $ arr) $ elem #end

5. Velocity Servlet

Det primære job med Velocity Engine er at generere indhold baseret på en skabelon.

Motoren indeholder ikke nogen internetrelaterede funktioner i sig selv. For at implementere en webapplikation skal vi bruge en servlet eller en servletbaseret ramme.

Velocity giver en ud af boksen implementering VelocityViewServlet, som er en del af hastighedsværktøjets delprojekt.

For at gøre brug af den indbyggede funktionalitet, der leveres af VelocityViewServlet, vi kan udvide vores servlet fra VelocityViewServlet og tilsidesætte handleRequest () metode:

offentlig klasse ProductServlet udvider VelocityViewServlet {ProductService service = ny ProductService (); @Override offentlig skabelon handleRequest (HttpServletRequest anmodning, HttpServletResponse svar, Kontekst kontekst) kaster Undtagelse {List produkter = service.getProducts (); context.put ("produkter", produkter); returner getTemplate ("index.vm"); }}

6. Konfiguration

6.1. Webkonfiguration

Lad os nu se, hvordan du konfigurerer VelocityViewServlet i web.xml.

Vi skal specificere de valgfrie initialiseringsparametre, som inkluderer velocity.properties og toolbox.xml:

 apache-velocity // ... velocity org.apache.velocity.tools.view.VelocityViewServlet org.apache.velocity.properties /WEB-INF/velocity.properties // ... 

Vi skal også specificere kortlægningen for denne servlet. Alle anmodninger om hastighedsskabeloner (* .vm) skal betjenes af hastigheds servlet:

 velocityLayout * .vm 

6.2. Ressource Loader

Velocity giver fleksibelt ressourcelæssersystem. Det gør det muligt for en eller flere ressourcelæssere at være i drift på samme tid:

  • FileResourceLoader
  • JarResourceLoader
  • ClassPathResourceLoader
  • URLResourceLoader
  • DataSourceResourceLoader
  • WebappResourceLoader

Disse ressourceindlæsere er konfigureret i velocity.properties:

resource.loader = webapp webapp.resource.loader.class = org.apache.velocity.tools.view.WebappResourceLoader webapp.resource.loader.path = webapp.resource.loader.cache = sand

7. Hastighedsskabelon

Velocity-skabelon er det sted, hvor al logik til visningsgenerering er skrevet. Disse sider er skrevet ved hjælp af Velocity Template Language (VTL):

 ...   ... 

$ products.size () Produkter til salg!

Vi er stolte af at tilbyde disse fine produkter til disse fantastiske priser. ... # sæt ($ count = 1)

#foreach ($ produkt i $ produkter) # sæt ($ count = $ count + 1) # end
SerienummerproduktnavnPris
$ count)$ product.getName ()$ product.getPrice ()

8. Administration af sidelayout

Velocity giver en simpel layoutkontrol og tilpassbare fejlskærme til Velocity Tool-baseret applikation.

VelocityLayoutServlet indkapsler denne mulighed for at gengive de angivne layout. VelocityLayoutServlet er en udvidelse til VelocityViewServlet.

8.1. Webkonfiguration

Lad os se, hvordan du konfigurerer VelocityLayoutServlet. Servlet er defineret til at opfange anmodningerne om hastighedsskabelonsider, og de layoutspecifikke egenskaber er defineret i velocity.properties fil:

 // ... velocityLayout org.apache.velocity.tools.view.VelocityLayoutServlet org.apache.velocity.properties /WEB-INF/velocity.properties // ... velocityLayout * .vm // ... 

8.2. Layoutskabeloner

Layoutskabelon definerer den typiske struktur for en hastighedsside. Som standard er VelocityLayoutServlet søger efter Standard.vm under layoutmappen. Tilsidesættelse af få ejendomme kan ændre denne placering:

tools.view.servlet.layout.directory = layout / tools.view.servlet.layout.default.template = Default.vm 

Layoutfilen består af sidehovedskabelon, sidefodskabelon og en hastighedsvariabel $ screen_content som gengiver indholdet af den anmodede hastighedsside:

  Velocity #parse ("/ fragmenter / header.vm") $ screen_content #parse ("/ fragmenter / footer.vm") 

8.3. Layoutspecifikation i det anmodede skærmbillede

Layout for en bestemt skærm kan defineres som en hastighedsvariabel i begyndelsen af ​​en side. Det gøres ved at sætte denne linje på siden:

#set ($ layout = "MyOtherLayout.vm")

8.4. Layoutspecifikation i anmodningsparameteren

Vi kan tilføje en anmodningsparameter i forespørgselsstrengen layout = MyOtherLayout.vm og VLS finder det og gengiver skærmen inden for dette layout i stedet for at søge efter standardlayout.

8.5. Fejlskærme

Skræddersyet fejlskærm kan implementeres ved hjælp af hastighedslayout. VelocityLayoutServlet giver to variabler $ error_cause og $ stack_trace for at præsentere undtagelsesoplysningerne.

Fejlsiden kan konfigureres i velocity.properties fil:

tools.view.servlet.error.template = Fejl.vm

9. Konklusion

I denne artikel har vi lært, hvordan Velocity er et nyttigt værktøj til gengivelse af de dynamiske websider. Vi har også set forskellige måder at bruge servlets på med hastighed.

Vi har også en artikel med fokus på en hastighedskonfiguration med Spring MVC her på Baeldung.

Den komplette kode til denne vejledning er tilgængelig på GitHub.