Inleiding tot Apache Velocity

1. Overzicht

Velocity is een op Java gebaseerde sjabloonengine.

Het is een open source webframework dat is ontworpen om te worden gebruikt als een weergavecomponent in de MVC-architectuur en het biedt een alternatief voor sommige bestaande technologieën zoals JSP.

Velocity kan worden gebruikt om XML-bestanden, SQL, PostScript en de meeste andere op tekst gebaseerde formaten te genereren.

In dit artikel zullen we onderzoeken hoe het kan worden gebruikt om dynamische webpagina's te maken.

2. Hoe Velocity werkt

De kernklasse van Velocity is de VelocityEngine.

Het orkestreert het hele proces van lezen, ontleden en genereren van inhoud met behulp van datamodel en snelheidssjabloon.

Simpel gezegd, hier zijn de stappen die we moeten volgen voor elke typische snelheidstoepassing:

  • Initialiseer de snelheidsmotor
  • Lees het sjabloon
  • Zet het datamodel in contextobject
  • Voeg de sjabloon samen met contextgegevens en geef de weergave weer

Laten we een voorbeeld bekijken door deze eenvoudige stappen te volgen:

VelocityEngine velocityEngine = nieuwe VelocityEngine (); velocityEngine.init (); Sjabloon t = velocityEngine.getTemplate ("index.vm"); VelocityContext context = nieuwe VelocityContext (); context.put ("naam", "Wereld"); StringWriter-schrijver = nieuwe StringWriter (); t.merge (context, schrijver);

3. Maven afhankelijkheden

Om met Velocity te werken, moeten we de volgende afhankelijkheden aan ons Maven-project toevoegen:

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

De laatste versie van beide afhankelijkheden kan hier zijn: velocity en velocity-tools.

4. Velocity-sjabloontaal

Velocity Template Language (VTL) biedt de eenvoudigste en schoonste manier om de dynamische inhoud in een webpagina op te nemen door gebruik te maken van VTL-referenties.

VTL-referentie in snelheidssjabloon begint met een $ en wordt gebruikt om de waarde op te halen die aan die referentie is gekoppeld. VTL biedt ook een reeks richtlijnen die kunnen worden gebruikt voor het manipuleren van de uitvoer van de Java-code. Die richtlijnen beginnen met #.

4.1. Referenties

Er zijn drie soorten verwijzingen in Velocity, variabelen, eigenschappen en methoden:

  • variabelen - gedefinieerd binnen de pagina met #set richtlijn of waarde geretourneerd uit het veld van het Java-object:
    #set ($ message = "Hallo wereld")
  • eigendommen - verwijzen naar velden binnen een object; ze kunnen ook verwijzen naar een getter methode van het onroerend goed:
    $ customer.name
  • methoden - verwijs naar de methode op Java-object:
    $ customer.getName ()

De uiteindelijke waarde die het resultaat is van elke verwijzing, wordt geconverteerd naar een tekenreeks wanneer deze wordt weergegeven in de uiteindelijke uitvoer.

4.2. Richtlijnen

VTL biedt een uitgebreide reeks richtlijnen:

  • set - het kan worden gebruikt om de waarde van een referentie in te stellen; deze waarde kan worden toegewezen aan een variabele of een eigenschapsreferentie:
    #set ($ message = "Hallo wereld") #set ($ customer.name = "Brian Mcdonald")
  • voorwaarden#if, #elseif en #anders richtlijnen bieden een manier om de inhoud te genereren op basis van voorwaardelijke controles:
    #if ($ employee.designation == "Manager") 

    Manager

    #elseif ($ employee.designation == "Senior Developer")

    Senior software-ingenieur

    #anders

    Stagiair

    #einde
  • lussen#voor elk richtlijn maakt het herhalen van een verzameling objecten mogelijk:
      #foreach ($ product in $ productList)
    • $ product
    • #einde
  • omvatten#inclusief element biedt de mogelijkheid om bestanden in de sjabloon te importeren:
    #include ("one.gif", "two.txt", "three.html" ...)
  • ontleden#parse statement stelt de sjabloonontwerper in staat om een ​​ander lokaal bestand te importeren dat VTL bevat; Velocity zal vervolgens de inhoud ontleden en weergeven:
    #parse (sjabloon)
  • evalueren#evalueer richtlijn kan worden gebruikt om VTL dynamisch te evalueren; hierdoor kan de sjabloon een Draad tijdens het renderen, bijvoorbeeld om de sjabloon te internationaliseren:
    #set ($ firstName = "David") #set ($ lastName = "Johnson") #set ($ dynamicsource = "$ firstName $ lastName") #evaluate ($ dynamicsource)
  • breken#breken richtlijn stopt elke verdere weergave van het huidige uitvoeringsbereik (d.w.z. #voor elk, #parse)
  • hou op#hou op richtlijn stopt elke verdere weergave en uitvoering van de sjabloon.
  • velocimacros#macro richtlijn stelt de sjabloonontwerper in staat om een ​​herhaald segment van VTL te definiëren:
    #macro (tablerows)  #einde

    Deze macro kan nu op een willekeurige plaats in het sjabloon worden geplaatst als #tablerows ():

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

4.3. Andere mogelijkheden

  • wiskunde - een handvol ingebouwde wiskundige functies, die in sjablonen kunnen worden gebruikt:
    #set ($ procent = $ getal / 100) #set ($ rest = $ dividend% $ deler)
  • bereik operator - dat kan worden gebruikt in combinatie met #set en #voor elk:
    #set ($ array = [0..10]) #foreach ($ elem in $ arr) $ elem #end

5. Snelheidsservlet

De primaire taak van de Velocity Engine is om inhoud te genereren op basis van een sjabloon.

De Engine bevat op zichzelf geen webgerelateerde functionaliteiten. Om een ​​webapplicatie te implementeren, hebben we een servlet- of servlet-gebaseerd framework nodig.

Velocity biedt een kant-en-klare implementatie VelocityViewServlet, dat deel uitmaakt van het subproject velocity-tools.

Om gebruik te maken van de ingebouwde functionaliteit van VelocityViewServlet, we kunnen onze servlet uitbreiden van VelocityViewServlet en negeer de handleRequest () methode:

public class ProductServlet breidt VelocityViewServlet uit {ProductService service = new ProductService (); @Override openbare sjabloon handleRequest (HttpServletRequest-verzoek, HttpServletResponse-antwoord, contextcontext) genereert uitzondering {List products = service.getProducts (); context.put ("producten", producten); retourneer getTemplate ("index.vm"); }}

6. Configuratie

6.1. Webconfiguratie

Laten we nu kijken hoe we het VelocityViewServlet in de web.xml.

We moeten de optionele initialisatieparameters specificeren, waaronder velocity.properties en toolbox.xml:

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

We moeten ook de toewijzing voor deze servlet specificeren. Alle verzoeken om snelheidssjablonen (* .vm) moeten worden bediend door de snelheidsservlet:

 velocityLayout * .vm 

6.2. Bronlader

Velocity biedt een flexibel systeem voor het laden van bronnen. Hiermee kunnen een of meer bronladers tegelijkertijd in gebruik zijn:

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

Deze bronladers zijn geconfigureerd in velocity.eigenschappen:

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

7. Snelheidssjabloon

Velocity-sjabloon is de plaats waar alle logica voor het genereren van weergaven wordt geschreven. Deze pagina's zijn geschreven met Velocity Template Language (VTL):

 ...   ... 

$ products.size () Producten in de uitverkoop!

We zijn er trots op deze mooie producten aan te bieden voor deze geweldige prijzen. ... #set ($ count = 1)

#foreach ($ product in $ products) #set ($ count = $ count + 1) #end
SerienummerproductnaamPrijs
$ count)$ product.getName ()$ product.getPrice ()

8. De pagina-indeling beheren

Velocity biedt een eenvoudige layoutcontrole en aanpasbare foutschermen voor op Velocity Tool gebaseerde applicaties.

VelocityLayoutServlet omvat deze mogelijkheid om de gespecificeerde lay-outs weer te geven. VelocityLayoutServlet is een extensie van VelocityViewServlet.

8.1. Webconfiguratie

Laten we eens kijken hoe we het VelocityLayoutServlet. De servlet is gedefinieerd voor het onderscheppen van verzoeken voor velocity-sjabloonpagina's en de lay-outspecifieke eigenschappen zijn gedefinieerd in velocity.properties het dossier:

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

8.2. Layout-sjablonen

Lay-outsjabloon definieert de typische structuur van een velocity-pagina. Standaard is het VelocityLayoutServlet zoekt naar Default.vm onder de lay-outmap. Als u enkele eigenschappen overschrijft, kan deze locatie worden gewijzigd:

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

Het lay-outbestand bestaat uit een koptekstsjabloon, voettekstsjabloon en een snelheidsvariabele $ screen_content die de inhoud van de opgevraagde velocity-pagina weergeeft:

  Snelheid #parse ("/ fragmenten / header.vm") $ screen_content #parse ("/ fragmenten / footer.vm") 

8.3. Lay-outspecificatie in het gevraagde scherm

De lay-out voor een bepaald scherm kan worden gedefinieerd als een snelheidsvariabele aan het begin van een pagina. Dat doe je door deze regel op de pagina te zetten:

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

8,4. Lay-outspecificatie in de verzoekparameter

We kunnen een verzoekparameter toevoegen aan de queryreeks layout = MyOtherLayout.vm en VLS zal het vinden en het scherm binnen die lay-out weergeven in plaats van naar de standaardlay-out te zoeken.

8.5. Foutschermen

Een aangepast foutscherm kan worden geïmplementeerd met behulp van de snelheidslay-out. VelocityLayoutServlet biedt twee variabelen $ error_cause en $ stack_trace om de uitzonderingsdetails te presenteren.

Foutpagina kan worden geconfigureerd in velocity.properties het dossier:

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

9. Conclusie

In dit artikel hebben we geleerd hoe Velocity een handig hulpmiddel is voor het weergeven van dynamische webpagina's. We hebben ook verschillende manieren gezien om door snelheid geleverde servlets te gebruiken.

We hebben ook een artikel gericht op een Velocity-configuratie met Spring MVC hier bij Baeldung.

De volledige code voor deze tutorial is beschikbaar op GitHub.