Einführung in Apache Velocity
1. Überblick
Velocity ist eine Java-basierte Template-Engine.
Es handelt sich um ein Open Source-Webframework, das als Ansichtskomponente in der MVC-Architektur verwendet werden soll, und bietet eine Alternative zu einigen vorhandenen Technologien wie JSP.
Mit Velocity können XML-Dateien, SQL, PostScript und die meisten anderen textbasierten Formate generiert werden.
In diesem Artikel erfahren Sie, wie Sie damit dynamische Webseiten erstellen können.
2. Wie Geschwindigkeit funktioniert
Die Kernklasse der Geschwindigkeit istVelocityEngine.
Es koordiniert den gesamten Prozess des Lesens, Analysierens und Generierens von Inhalten mithilfe des Datenmodells und der Geschwindigkeitsvorlage.
Einfach ausgedrückt, hier sind die Schritte, die wir für jede typische Velocity-Anwendung ausführen müssen:
-
Initialisieren Sie die Geschwindigkeitsmaschine
-
Lesen Sie die Vorlage
-
Setzen Sie das Datenmodell in das Kontextobjekt
-
Verbinden Sie die Vorlage mit Kontextdaten und rendern Sie die Ansicht
Let’s go through an example folgen diesen einfachen Schritten:
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.init();
Template t = velocityEngine.getTemplate("index.vm");
VelocityContext context = new VelocityContext();
context.put("name", "World");
StringWriter writer = new StringWriter();
t.merge( context, writer );
3. Maven-Abhängigkeiten
Um mit Velocity arbeiten zu können, müssen wir unserem Maven-Projekt die folgenden Abhängigkeiten hinzufügen:
org.apache.velocity
velocity
1.7
org.apache.velocity
velocity-tools
2.0
Die neueste Version dieser beiden Abhängigkeiten kann hier sein:velocity undvelocity-tools.
4. Velocity Template Language
Velocity Template Language (VTL) bietet die einfachste und sauberste Möglichkeit, den dynamischen Inhalt mithilfe von VTL-Referenzen in eine Webseite einzubinden.
Die VTL-Referenz in der Geschwindigkeitsvorlage beginnt mit einem$ und wird verwendet, um den dieser Referenz zugeordneten Wert abzurufen. VTL bietet auch eine Reihe von Anweisungen, mit denen die Ausgabe des Java-Codes bearbeitet werden kann. Diese Anweisungen beginnen mit#.
4.1. Verweise
Es gibt drei Arten von Referenzen in Velocity, Variablen, Eigenschaften und Methoden:
-
variables - innerhalb der Seite mithilfe der Direktive oder des Werts von#setdefiniert, der vom Feld des Java-Objekts zurückgegeben wird:
#set ($message="Hello World")
-
properties - beziehen sich auf Felder innerhalb eines Objekts; Sie können sich auch auf diegetter-Methode der Eigenschaft beziehen:
$customer.name
-
methods - beziehen sich auf die Methode für Java-Objekte:
$customer.getName()
Der aus jeder Referenz resultierende Endwert wird beim Rendern in die endgültige Ausgabe in eine Zeichenfolge konvertiert.
4.2. Richtlinien
VTL bietet eine Vielzahl von Anweisungen:
-
set - kann zum Einstellen des Referenzwerts verwendet werden; Dieser Wert kann einer Variablen oder einer Eigenschaftsreferenz zugewiesen werden:
#set ($message = "Hello World") #set ($customer.name = "Brian Mcdonald")
-
conditionals -#if, #elseif und#else Anweisungen bieten eine Möglichkeit, den Inhalt basierend auf bedingten Überprüfungen zu generieren:
#if($employee.designation == "Manager")
Manager
#elseif($employee.designation == "Senior Developer")Senior Software Engineer
#elseTrainee
#end -
loops -#foreach Direktive ermöglicht das Durchlaufen einer Sammlung von Objekten:
-
#foreach($product in $productList)
- $product #end
-
include -#include Element bietet die Möglichkeit, Dateien in die Vorlage zu importieren:
#include("one.gif","two.txt","three.html"...)
-
Mit der Anweisungparse -#parsekann der Vorlagen-Designer eine andere lokale Datei importieren, die VTL enthält. Velocity analysiert dann den Inhalt und rendert ihn:
#parse (Template)
-
evaluate -#evaluate Direktive kann verwendet werden, um VTL dynamisch auszuwerten; Auf diese Weise kann die Vorlage beim Rendern einen Prozentsatz (t2) auswerten, um beispielsweise die Vorlage zu internationalisieren:
#set($firstName = "David") #set($lastName = "Johnson") #set($dynamicsource = "$firstName$lastName") #evaluate($dynamicsource)
-
break -#break Direktive stoppt jedes weitere Rendern des aktuellen Ausführungsbereichs (d. H. #foreach,#parse)
-
stop - Die Direktive#stoptoppt das weitere Rendern und Ausführen der Vorlage.
-
velocimacros -#macro Direktive ermöglicht es dem Template Designer, ein wiederholtes Segment von VTL zu definieren:
#macro(tablerows)
Dieses Makro kann jetzt an einer beliebigen Stelle in der Vorlage als #tablerows(): eingefügt werden
#macro(tablerows $color $productList) #foreach($product in $productList)
$product.name
4.3. Andere Eigenschaften
-
math - eine Handvoll integrierter mathematischer Funktionen, die in Vorlagen verwendet werden können:
#set($percent = $number / 100) #set($remainder = $dividend % $divisor)
-
range operator - kann in Verbindung mit#set und#foreach: verwendet werden
#set($array = [0..10]) #foreach($elem in $arr) $elem #end
5. Velocity Servlet
Die Hauptaufgabe der Velocity Engine besteht darin, Inhalte auf der Grundlage einer Vorlage zu generieren.
Die Engine enthält an sich keine webbezogenen Funktionen. Um eine Webanwendung zu implementieren, müssen Sie ein Servlet oder ein servletbasiertes Framework verwenden.
Velocity bietet eine sofort einsatzbereite ImplementierungVelocityViewServlet, die Teil des Teilprojekts Velocity-Tools ist.
Um die integrierte Funktionalität vonVelocityViewServlet, zu nutzen, können wir unser Servlet vonVelocityViewServlet erweitern und die MethodehandleRequest() überschreiben:
public class ProductServlet extends VelocityViewServlet {
ProductService service = new ProductService();
@Override
public Template handleRequest(
HttpServletRequest request,
HttpServletResponse response,
Context context) throws Exception {
List products = service.getProducts();
context.put("products", products);
return getTemplate("index.vm");
}
}
6. Aufbau
6.1. Webkonfiguration
Lassen Sie uns nun sehen, wie Sie dieVelocityViewServlet inweb.xml konfigurieren.
Wir müssen die optionalen Initialisierungsparameter angeben, dievelocity.properties undtoolbox.xml umfassen:
apache-velocity
//...
velocity
org.apache.velocity.tools.view.VelocityViewServlet
org.apache.velocity.properties
/WEB-INF/velocity.properties
//...
Wir müssen auch die Zuordnung für dieses Servlet angeben. Alle Anforderungen für Geschwindigkeitsvorlagen (*.vm) müssen vom Geschwindigkeitsservlet bedient werden:
velocityLayout
*.vm
6.2. Ressourcenlader
Velocity bietet ein flexibles System zum Laden von Ressourcen. Damit können ein oder mehrere Resource Loader gleichzeitig in Betrieb sein:
-
FileResourceLoader
-
JarResourceLoader
-
ClassPathResourceLoader
-
URLResourceLoader
-
DataSourceResourceLoader
-
WebappResourceLoader
Diese Ressourcenlader werden invelocity.properties: konfiguriert
resource.loader=webapp
webapp.resource.loader.class=org.apache.velocity.tools.view.WebappResourceLoader
webapp.resource.loader.path =
webapp.resource.loader.cache = true
7. Geschwindigkeitsvorlage
Die Velocity-Vorlage ist der Ort, an dem die gesamte Logik zur Generierung von Ansichten geschrieben wird. Diese Seiten wurden mit Velocity Template Language (VTL) geschrieben:
...
...
$products.size() Products on Sale!
We are proud to offer these fine products
at these amazing prices.
...
#set( $count = 1 )
Serial #
Product Name
Price
#foreach( $product in $products )
$count)
$product.getName()
$product.getPrice()
#set( $count = $count + 1 )
#end
8. Seitenlayout verwalten
Velocity bietet eine einfache Layoutsteuerung und anpassbare Fehlerbildschirme für die Velocity Tool-basierte Anwendung.
VelocityLayoutServlet kapselt diese Funktion zum Rendern der angegebenen Layouts. VelocityLayoutServlet ist eine Erweiterung vonVelocityViewServlet.
8.1. Webkonfiguration
Sehen wir uns an, wieVelocityLayoutServlet. konfiguriert werden. Das Servlet ist zum Abfangen der Anforderungen für Geschwindigkeitsvorlagenseiten definiert, und die layoutspezifischen Eigenschaften sind in der Dateivelocity.propertiesdefiniert:
// ...
velocityLayout
org.apache.velocity.tools.view.VelocityLayoutServlet
org.apache.velocity.properties
/WEB-INF/velocity.properties
// ...
velocityLayout
*.vm
// ...
8.2. Layoutvorlagen
Die Layoutvorlage definiert die typische Struktur einer Velocity-Seite. Standardmäßig suchtVelocityLayoutServlet im Layoutordner nachDefault.vm. Durch Überschreiben weniger Eigenschaften kann dieser Speicherort geändert werden:
tools.view.servlet.layout.directory = layout/
tools.view.servlet.layout.default.template = Default.vm
Die Layoutdatei besteht aus einer Kopf- und einer Fußzeilenvorlage sowie einer Geschwindigkeitsvariablen$screen_content, die den Inhalt der angeforderten Geschwindigkeitsseite wiedergibt:
Velocity
#parse("/fragments/header.vm")
$screen_content
#parse("/fragments/footer.vm")
8.3. Layoutspezifikation im angeforderten Bildschirm
Das Layout für einen bestimmten Bildschirm kann als Geschwindigkeitsvariable am Anfang einer Seite definiert werden. Dazu setzen Sie diese Zeile in die Seite:
#set($layout = "MyOtherLayout.vm")
8.4. Layoutspezifikation im Anforderungsparameter
Wir können einen Anforderungsparameter in die Abfragezeichenfolgelayout=MyOtherLayout.vm einfügen, und VLS findet ihn und rendert den Bildschirm in diesem Layout, anstatt nach dem Standardlayout zu suchen.
8.5. Fehlerbildschirme
Der benutzerdefinierte Fehlerbildschirm kann mithilfe des Geschwindigkeitslayouts implementiert werden. VelocityLayoutServlet bietet zwei Variablen$error_cause und$stack_trace, um die Ausnahmedetails darzustellen.
Die Fehlerseite kann in der Dateivelocity.propertieskonfiguriert werden:
tools.view.servlet.error.template = Error.vm
9. Fazit
In diesem Artikel haben wir gelernt, wie Velocity ein nützliches Werkzeug zum Rendern der dynamischen Webseiten ist. Wir haben auch verschiedene Arten der Verwendung von Servlets mit Geschwindigkeit gesehen.
Wir haben auch einen Artikel über eine Geschwindigkeitskonfiguration mit Spring MVChere at example.
Der vollständige Code für dieses Tutorial istover on GitHub verfügbar.