Προγραμματισμός

Ξεκινήστε το Velocity Template Engine

Το Velocity Template Engine σάς επιτρέπει να αποδίδετε δεδομένα από εφαρμογές και servlets. Χρησιμοποιείται κυρίως για την ανάπτυξη δυναμικών ιστοσελίδων που βασίζονται σε servlet, ο καθαρός διαχωρισμός προτύπου και ο κώδικας Java της Velocity το καθιστούν ιδανικό για την ανάπτυξη MVC Web. Ως γενική μηχανή προτύπων, το Velocity ταιριάζει σε πολλούς άλλους σκοπούς, όπως δημιουργία κώδικα, δημιουργία και μετατροπή XML και επεξεργασία ροής κειμένου. Αυτό το άρθρο εισάγει τη γλώσσα προτύπου ταχύτητας (VTL) και παρέχει παραδείγματα σχετικά με τον τρόπο χρήσης της μηχανής ταχύτητας, συμπεριλαμβανομένου του τρόπου δημιουργίας περιεχομένου Web σε περιβάλλον servlet Java.

Το Velocity είναι ένα εργαλείο templating ανοιχτού κώδικα που αναπτύχθηκε από μια διεθνή κοινότητα εθελοντών και φιλοξενείται από το Πρόγραμμα Τζακάρτα του Apache Software Foundation. Στην ιστοσελίδα του Jakarta Velocity Project, όπου μπορείτε να κατεβάσετε τον ελεύθερα διαθέσιμο πηγαίο κώδικα, μια ακμάζουσα και αναπτυσσόμενη κοινότητα χρηστών είναι έτοιμη να απαντήσει σε ερωτήσεις και να προσφέρει λύσεις σε κοινά προβλήματα templating. Το Velocity εμπνεύστηκε από το πρωτοποριακό έργο WebMacro, ένα έργο για το οποίο εμείς στην κοινότητα Velocity είμαστε ευγνώμονες.

Σε αυτό το άρθρο, παρουσιάζω ένα σύντομο αστάρι στο Velocity Template Engine και τη γλώσσα προτύπου του, Velocity Template Language (VTL). Δείχνω επίσης πώς να χρησιμοποιώ το Velocity μέσω πολλών παραδειγμάτων.

Γεια σας, φυσικά

Καμία εξήγηση για ένα θέμα που σχετίζεται με τον προγραμματισμό δεν θα ήταν πλήρης χωρίς ένα παράδειγμα Hello World. Κάθε εφαρμογή που χρησιμοποιεί Velocity απαιτεί δύο μέρη. Το πρώτο είναι το πρότυπο, το οποίο σε αυτό το παράδειγμα είναι ένα αρχείο που ονομάζεται helloworld.vm:

 Γεια σας $ name! Καλώς ήλθατε στο Velocity! 

Το δεύτερο είναι ένα αντίστοιχο πρόγραμμα Java που ονομάζεται Γεια σου World.java:

εισαγωγή java.io.StringWriter; εισαγωγή org.apache.velocity.app.VelocityEngine; εισαγωγή org.apache.velocity.Template; εισαγωγή org.apache.velocity.VelocityContext; δημόσια τάξη HelloWorld {public static void main (String [] args) ρίχνει την Εξαίρεση {/ * πρώτα, πάρτε και αρχικοποιήστε έναν κινητήρα * / VelocityEngine ve = νέο VelocityEngine (); ve.init (); / * στη συνέχεια, λάβετε το Πρότυπο * / Πρότυπο t = ve.getTemplate ("helloworld.vm"); / * δημιουργήστε ένα πλαίσιο και προσθέστε δεδομένα * / VelocityContext konteks = νέο VelocityContext (); konteks.put ("όνομα", "Κόσμος"); / * αποδώστε τώρα το πρότυπο σε StringWriter * / StringWriter writer = νέο StringWriter (); t.merge (πλαίσιο, συγγραφέας); / * εμφάνιση του κόσμου * / System.out.println (writer.toString ()); }} 

Τώρα, όταν μεταγλωττίζετε και εκτελείτε αυτό το πρόγραμμα, θα δείτε την έξοδο:

 Γειά σου Κόσμε! Καλώς ήλθατε στο Velocity! 

Αυτό είναι ένα ασήμαντο παράδειγμα, αλλά περιέχει τα κρίσιμα κομμάτια για να σας δώσει μια ιδέα για το τι είναι το πρότυπο Velocity.

Γιατί να το χρησιμοποιήσω;

Σχεδιασμένο ως ένα εύχρηστο γενικό εργαλείο templating, το Velocity είναι χρήσιμο σε οποιαδήποτε περιοχή εφαρμογών Java που απαιτεί μορφοποίηση και παρουσίαση δεδομένων. Πρέπει να χρησιμοποιήσετε το Velocity για τους ακόλουθους λόγους:

  • Προσαρμόζεται σε πολλές περιοχές εφαρμογής
  • Προσφέρει μια απλή, σαφή σύνταξη για τον σχεδιαστή προτύπων
  • Προσφέρει ένα απλό μοντέλο προγραμματισμού για τον προγραμματιστή
  • Επειδή τα πρότυπα και ο κωδικός είναι ξεχωριστοί, μπορείτε να τα αναπτύξετε και να τα διατηρήσετε ανεξάρτητα
  • Ο κινητήρας Velocity ενσωματώνεται εύκολα σε οποιοδήποτε περιβάλλον εφαρμογής Java, ειδικά servlets
  • Το Velocity επιτρέπει στα πρότυπα να έχουν πρόσβαση σε οποιαδήποτε δημόσια μέθοδο αντικειμένων δεδομένων στο περιβάλλον

Το τελευταίο σημείο είναι σημαντικό - σημαίνει ότι μπορείτε να επαναχρησιμοποιήσετε τις υπάρχουσες τάξεις σας. Επομένως, τα αντικείμενα που θέλετε να χρησιμοποιήσετε στα πρότυπά σας δεν χρειάζεται να δομηθούν με έναν συγκεκριμένο τρόπο, όπως το JavaBeans ή να εφαρμόσουν ειδικές λειτουργίες I / O ή κύκλου ζωής, όπως ετικέτες JSP (JavaServer Pages). Η μόνη απαίτηση είναι ότι οι μέθοδοι είναι δημόσιες. Θα δείτε περισσότερα από αυτά όταν καλύπτουμε λεπτομερώς τη γλώσσα προτύπου.

Ένα από τα πλεονεκτήματα του Velocity είναι ότι επιβάλλει τον διαχωρισμό της λειτουργικής ευθύνης εντός της εφαρμογής. Αυτό το κάνει περιορίζοντας την πρόσβαση προτύπου σε αντικείμενα που ο κώδικας εφαρμογής διαθέτει ειδικά. Αυτό σημαίνει ότι οι σχεδιαστές μπορούν να εστιάσουν αποκλειστικά στην παρουσίαση δεδομένων (την προβολή) και ο προγραμματιστής εφαρμογών μπορεί να επικεντρωθεί στον έλεγχο της εφαρμογής (ο ελεγκτής) και στην επιχειρησιακή λογική και τη διαχείριση δεδομένων (το μοντέλο) στο Model-View-Controller (MVC) ανάπτυξη. Το MVC είναι ένα αποδεκτό πρότυπο ανάπτυξης που απλοποιεί τόσο την ανάπτυξη όσο και τη συνεχή συντήρηση εξελιγμένων εφαρμογών.

Πού το χρησιμοποιώ;

Το Velocity χρησιμοποιείται επιτυχώς σε:

  • Εφαρμογές Web που βασίζονται σε Servlet
  • Δημιουργία κώδικα Java και SQL
  • Επεξεργασία και μετασχηματισμός XML
  • Επεξεργασία κειμένου, όπως δημιουργία αρχείων RTF

Το Velocity χρησιμοποιείται συνήθως ως μηχανή απόδοσης για την ανάπτυξη εφαρμογών Web που βασίζεται σε servlet Java, αντί για ή σε συνδυασμό με JSP και άλλες τεχνολογίες απόδοσης. Εκτός από την εύκολη, διατηρήσιμη σύνταξη προτύπου, το Velocity χρησιμοποιείται στην ανάπτυξη Ιστού επειδή η γλώσσα προτύπου μπορεί να χειριστεί και να παρουσιάσει τα δεδομένα, όχι να δημιουργήσει δεδομένα. Αυτό αποθαρρύνει προγραμματισμός εντός των προτύπων. Αυτό είναι ένα καλό πράγμα; διατηρεί τη λογική επιχείρησης και εφαρμογής του κώδικα Java όπου ανήκουν.

Το Velocity είναι κατάλληλο για την ανάπτυξη Ιστού J2EE (Java 2 Platform, Enterprise Edition) επειδή η πλατφόρμα φιλοξενεί τεχνολογίες εξόδου εκτός από το JSP. Ενώ το JSP περιλαμβάνεται στις προδιαγραφές J2EE, το J2EE δεν απαιτεί τη χρήση του.

Πώς λειτουργεί;

Χρησιμοποιείτε την ίδια γενική διαδικασία για να δημιουργήσετε μια εφαρμογή που βασίζεται σε ταχύτητα όπως θα κάνατε οποιαδήποτε εφαρμογή. Ας δούμε ένα πιο ενδιαφέρον παράδειγμα από την παραπάνω εφαρμογή Hello World. Ας υποθέσουμε ότι λειτουργείτε ένα κατάστημα κατοικίδιων ζώων και θέλετε να δημιουργήσετε ένα μήνυμα ηλεκτρονικού ταχυδρομείου για να ανακοινώσετε μια πώληση. Αρχικά, πρέπει να σχεδιάσετε το email και, στη συνέχεια, να αναπτύξετε το πρότυπο και τον κώδικα βάσει αυτού του σχεδιασμού.

Σκέψεις σχεδιασμού-χρόνου

Πρέπει να λάβετε υπόψη τρία στοιχεία για το σχέδιό σας:

  • Ποια δεδομένα θα συμπεριληφθούν στο email
  • Τι μορφή πρέπει να λάβουν τα στοιχεία δεδομένων (για παράδειγμα, ως Λίστα, Χάρτης, ή Σειρά)
  • Τι να καλέσετε αυτά τα στοιχεία δεδομένων

Για αυτό το παράδειγμα, ας υποθέσουμε ότι αποφασίζετε για τρία κατοικίδια προς πώληση, το καθένα με διαφορετική διαφημιζόμενη τιμή. Αποφασίζετε να χρησιμοποιήσετε έναν χάρτη για να συσχετίσετε κάθε όνομα κατοικιδίου και την τιμή του και, στη συνέχεια, να αποθηκεύσετε και τους τρεις χάρτες σε μια λίστα. Μπορείτε να καλέσετε αυτήν τη λίστα λίστα κατοικίδιων, το όνομα του κατοικίδιου όνομα, και η τιμή ως τιμή στον χάρτη Τώρα που έχετε προσδιορίσει τα σχετικά δεδομένα, την αναπαράστασή του και τα κριτήρια ονομασίας, μπορείτε να γράψετε τον κώδικα και το σχεδιασμό του προτύπου.

Γράψτε τον κώδικα και το σχέδιο προτύπων

Μόλις συμφωνήσετε για συγκεκριμένα δεδομένα, το Velocity σάς επιτρέπει να γράψετε τον κώδικα και να σχεδιάσετε το πρότυπο παράλληλα. Ο σχεδιαστής ενσωματώνει τα δεδομένα στο περιεχόμενο παρουσίασης nondata (όπως εικόνες, κείμενο και ούτω καθεξής) στο πρότυπο. Σε αυτήν την περίπτωση, γράφουμε απλώς στο σώμα του email:

 $ petList.size () Κατοικίδια προς πώληση! Είμαστε περήφανοι που προσφέρουμε αυτά τα εκλεκτά κατοικίδια σε αυτές τις εκπληκτικές τιμές. Μόνο αυτόν τον μήνα, επιλέξτε από: #foreach ($ pet in $ petList) $ pet.name για $ pet.price #end Call Today! 

Ως προγραμματιστής, πρέπει:

  • Ανάκτηση όλων των δεδομένων από τις πηγές δεδομένων - μια βάση δεδομένων μέσω JDBC (Java Database Connectivity), ενός αρχείου ή μόνο κάτι που υπολογίστηκε
  • Βάλτε αυτά τα δεδομένα στο πλαίσιο χρησιμοποιώντας τα συμφωνημένα ονόματα
  • Δώστε το πρότυπο με το περιβάλλον για να παράγετε έξοδο

Μπορείτε να θυμηθείτε από το παράδειγμα Hello World που αναφέρθηκα στην τάξη VelocityContext ως το συμφραζόμενα. Διαμορφώθηκε μετά από ένα java.util.Map, το περιβάλλον είναι ένα αντικείμενο που κρατά δεδομένα που παρέχονται από την εφαρμογή ή servlet στο οποίο έχει πρόσβαση το πρότυπο.

Για αυτό το παράδειγμα, λαμβάνουμε όλα τα δεδομένα από τις πηγές δεδομένων μας (σε αυτήν την περίπτωση, τα ενσωματώνουμε στον κώδικα), τα οργανώνουμε και τα προσθέτουμε στο περιβάλλον:

 / * δημιουργήστε τη λίστα χαρτών μας * / ArrayList list = new ArrayList (); Χάρτης χάρτη = νέο HashMap (); map.put ("όνομα", "άλογο"); map.put ("τιμή", "00.00"); list.add (χάρτης); map = νέο HashMap (); map.put ("όνομα", "σκύλος"); map.put ("τιμή", "9,99"); list.add (χάρτης); map = νέο HashMap (); map.put ("όνομα", "αρκούδα"); map.put ("τιμή", ".99"); list.add (χάρτης); / * προσθήκη αυτής της λίστας σε VelocityContext * / VelocityContext konteks = νέο VelocityContext (); konteks.put ("petList", λίστα); 

Φαίνεται ότι θέλουμε πραγματικά να απαλλαγούμε από αυτές τις αρκούδες!

Τώρα, με τα δεδομένα οργανωμένα και τοποθετημένα στο περιβάλλον και το πρότυπο έτοιμο, μπορούμε να καταστήσουμε το πρότυπο ενάντια στο περιβάλλον. Εδώ είναι ο κωδικός:

εισαγωγή java.io.StringWriter; εισαγωγή java.util.List; εισαγωγή java.util.ArrayList; εισαγωγή java.util.Map; εισαγωγή java.util.HashMap; εισαγωγή org.apache.velocity.Template; εισαγωγή org.apache.velocity.VelocityContext; εισαγωγή org.apache.velocity.app.VelocityEngine; δημόσια τάξη PetStoreEmail {public static void main (String [] args) ρίχνει την Εξαίρεση {/ * πρώτα, πάρτε και αρχικοποιήστε έναν κινητήρα * / VelocityEngine ve = new VelocityEngine (); ve.init (); / * οργανώστε τα δεδομένα μας * / ArrayList list = new ArrayList (); Χάρτης χάρτη = νέο HashMap (); map.put ("όνομα", "άλογο"); map.put ("τιμή", "00.00"); list.add (χάρτης); map = νέο HashMap (); map.put ("όνομα", "σκύλος"); map.put ("τιμή", "9,99"); list.add (χάρτης); map = νέο HashMap (); map.put ("όνομα", "αρκούδα"); map.put ("τιμή", ".99"); list.add (χάρτης); / * προσθήκη αυτής της λίστας σε VelocityContext * / VelocityContext konteks = νέο VelocityContext (); konteks.put ("petList", λίστα); / * λάβετε το Πρότυπο * / Πρότυπο t = ve.getTemplate ("petstoreemail.vm"); / * αποδώστε το πρότυπο σε Writer * / StringWriter writer = νέο StringWriter (); t.merge (πλαίσιο, συγγραφέας); / * χρησιμοποιήστε την έξοδο στο σώμα του email σας * / sendEmail (writer.toString ()); }} 

Αυτό το πλήρες πρόγραμμα δημιουργεί το σώμα του email σας. Επειδή το Velocity αποδίδει πρότυπα σε ένα Συγγραφέας, μπορείτε να διαχειριστείτε εύκολα την έξοδο. Σε αυτήν την περίπτωση, η απόδοση που αποδόθηκε σε ένα Σειρά μέσω του StringWriter, αλλά θα μπορούσε εύκολα να έχει πάει σε ένα αρχείο, ένα πρόγραμμα περιήγησης ή ένα BLOB (δυαδικό μεγάλο αντικείμενο) σε μια βάση δεδομένων. Αυτός είναι ένας λόγος για τον οποίο το Velocity ενσωματώνεται τόσο εύκολα σε εφαρμογές Java.

Η έξοδος του προγράμματος (το σώμα του email σας) μοιάζει με αυτό:

 3 κατοικίδια για πώληση! Είμαστε περήφανοι που προσφέρουμε αυτά τα εκλεκτά κατοικίδια σε αυτές τις εκπληκτικές τιμές. Μόνο αυτόν τον μήνα, επιλέξτε από: άλογο για μόνο 00,00 σκύλο για μόνο 9,99 αρκούδες για μόνο .99 Καλέστε σήμερα! 

Γλώσσα προτύπου ταχύτητας

Έχω δείξει πρότυπα Velocity για δύο διαφορετικά παραδείγματα, αλλά σε καμία περίπτωση δεν εξήγησα τι έκανε η ειδική σήμανση (αν και μάλλον θα μπορούσατε να μαντέψετε).

Η γλώσσα προτύπου ταχύτητας (VTL) είναι μια απλή σύνταξη που παρέχει δύο μέρη: βιβλιογραφικές αναφορές, ένας φορμαλισμός για την πρόσβαση σε αντικείμενα στο πλαίσιο · και οδηγίες, ένα σύνολο δηλώσεων που χρησιμοποιούνται για έλεγχο και δράση. Περιγράφεται ως "ορισμός γλώσσας με σύνολο χαρακτηριστικών που ταιριάζει άνετα σε μια τυπική επαγγελματική κάρτα" (βλ. "Getting Up to Speed ​​with Velocity" του Jim Jagielski) Το VTL διατηρήθηκε σκόπιμα απλό και μικρό από την κοινότητα.

βιβλιογραφικές αναφορές

Αναφορές στα δεδομένα πρόσβασης προτύπου. Αναμιγνύονται ελεύθερα με το περιεχόμενο εκτός VTL του προτύπου. Ορίζεται επίσημα, μια αναφορά είναι οτιδήποτε σε ένα πρότυπο που ξεκινά με το χαρακτήρα "$" και αναφέρεται σε κάτι στο πλαίσιο. Εάν δεν υπάρχει αντίστοιχο αντικείμενο δεδομένων στο περιβάλλον, το πρότυπο αντιμετωπίζει απλώς την αναφορά ως κείμενο και την καθιστά ως έχει στη ροή εξόδου.

Ακολουθεί ένα σύντομο πρότυπο που περιέχει μια απλή αναφορά αναμεμιγμένη με περιεχόμενο εκτός VTL:

 Γεια σας $ name! Καλώς ήλθατε στο Velocity! 

Εδώ, η αναφορά είναι $ όνομα. Όπως στο παράδειγμα Hello World, το Velocity αντικαθιστά $ όνομα στο πρότυπο με το toString () τιμή επιστροφής αυτού που τοποθετείται στο περιβάλλον κάτω από το κλειδί όνομα:

 Γειά σου Κόσμε! Καλώς ήλθατε στο Velocity! 

Η αναφορά Velocity επιτρέπει την πρόσβαση στη δημόσια μέθοδο οποιουδήποτε αντικειμένου και η σύνταξη του προτύπου είναι η ίδια όπως θα ήταν στον κώδικα Java. Ακολουθούν μερικά παραδείγματα:

 Υπάρχουν στοιχεία $ myBean.getSize (). $ myObject.anotherMethod (1, "more data") $ foo.getBar (). barMethod ("hello", $ moredata) $ foo.myMethod ($ bar.callThis ()) 

Μπορεί να θυμάστε από το παράδειγμα ηλεκτρονικού ταχυδρομείου του Pet Store ότι αποθηκεύσαμε τις πληροφορίες ονόματος και τιμής στο java.util.Mapκαι προσπελάσατε τα δεδομένα χρησιμοποιώντας δύο διακριτικά όνομα και τιμή, οι οποίες δεν υπάρχουν ως μέθοδοι στο java.util.Map τάξη:

 $ pet.name μόνο για $ pet.price 

Αυτό λειτουργεί επειδή το Velocity ενσωματώνει έναν μηχανισμό ενδοσκόπησης τύπου JavaBean που σας επιτρέπει να εκφράζετε πρόσβαση στη μέθοδο σε αναφορές χρησιμοποιώντας μια σημείωση ιδιότητας. Στο παράδειγμα του Pet Store, η δυνατότητα ενδοσκόπησης της Velocity βρίσκει και επικαλείται το Χάρτης'μικρό δημόσια Αντικείμενο get (String) μέθοδο με τα πλήκτρα όνομα και τιμή. Θα μπορούσαμε να έχουμε πρόσβαση στα ίδια δεδομένα με διαφορετικό τρόπο επικαλούμενος το λήψη (String) μέθοδο απευθείας στο πρότυπο:

 $ pet.get ('name') για μόνο $ pet.get ('price') 

Αυτό θα παράγει την ίδια έξοδο και αντιπροσωπεύει καλύτερα αυτό που πραγματικά συμβαίνει. Ωστόσο, ο άλλος τρόπος που χρησιμοποιεί τη σημείωση ιδιοτήτων είναι ευκολότερος να διαβαστεί και δεν συνδέει το πρότυπό σας με τη συγκεκριμένη εφαρμογή της κλάσης δεδομένων. Για παράδειγμα, μπορείτε να αντικαταστήσετε το Χάρτης στο Λίστα με μια τάξη που έχει δημόσιες μεθόδους getName () και getPrice ()και το αρχικό πρότυπο παραδείγματος που περιέχει τα ακόλουθα θα συνεχίσει να λειτουργεί:

 $ pet.name μόνο για $ pet.price