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

Καλέστε μεθόδους JavaBean από σελίδες JSP 2.0

Η νέα έκδοση JavaServer Pages (JSP) ενσωματώνει τη γλώσσα έκφρασης (EL) που εισήγαγε η JSP Standard Tag Library (JSTL) για να επιτρέψει στους σχεδιαστές ιστοσελίδων να παράγουν σελίδες JSP χωρίς script που δεν περιέχουν κώδικα Java. Δεδομένου ότι το JSP 2.0 παρέχει συμβατότητα προς τα πίσω με το JSP 1.x, ενδέχεται να εξακολουθείτε να συμπεριλαμβάνετε αποσπάσματα Java στις σελίδες σας, αλλά οι χειριστές ετικετών και τα στοιχεία JavaBean είναι πολύ καλύτερα μέρη για λειτουργικότητα που βασίζεται σε Java.

Το JSP 2.0 παρέχει νέες δυνατότητες για χειριστές ετικετών, όπως δυναμικά χαρακτηριστικά, το Πρωτόκολλο Simple Invocation και .ετικέτα αρχεία. Εξακολουθείτε να χρησιμοποιείτε τις παλιές τυπικές ενέργειες JSP 1.0 για τη δημιουργία στιγμιότυπων JavaBean και τον ορισμό των ιδιοτήτων τους, αλλά τώρα μπορείτε να αποκτήσετε πρόσβαση σε ιδιότητες φασολιών, παραμέτρους αιτήματος και χαρακτηριστικά / μεταβλητές JSP με τη νέα γλώσσα έκφρασης.

Όλες αυτές οι βελτιώσεις τεχνολογίας JSP σάς επιτρέπουν να επιτύχετε το στόχο του διαχωρισμού της σήμανσης JSP / HTML από τον κώδικα Java. Ένα πράγμα λείπει, ωστόσο. Το JSP 2.0 δεν έχει σύνταξη για την κλήση μιας δημόσιας μη στατικής μεθόδου JavaBean από μια σελίδα JSP χωρίς script. Αυτό το άρθρο επιλύει αυτό το ζήτημα παρέχοντας μια απλή ετικέτα JSP 2.0 με δυναμικά χαρακτηριστικά.

Σημείωση: Μπορείτε να κατεβάσετε τον πηγαίο κώδικα αυτού του άρθρου από τους πόρους.

Απαιτείται γλώσσα έκφρασης

Ας υποθέσουμε ότι έχετε ένα java.util. Λίστα περίπτωση που πρέπει να παρουσιάσετε ως λίστα HTML. Ακολουθεί μια γρήγορη λύση που βασίζεται στο JSP 1.x:

Οι υπάρχουσες εφαρμογές Web που βασίζονται σε JSP αποτελούνται από κώδικα Java αναμεμιγμένο με σήμανση HTML όπως το παραπάνω τμήμα κώδικα. Η διατήρηση εκατοντάδων σελίδων σαν αυτή μπορεί να είναι ένας εφιάλτης αν έχετε ξεχωριστές ομάδες ανάπτυξης Java και Web design. Η λύση είναι να μετακινήσετε τον κώδικα Java σε βιβλιοθήκες ετικετών, έτσι ώστε οι προγραμματιστές να μπορούν να κάνουν τις εργασίες τους χωρίς να επικολλήσουν κώδικα Java σε ιστοσελίδες και οι σχεδιαστές μπορούν να επεξεργαστούν τις ιστοσελίδες τους χωρίς να ανησυχούν για το σπάσιμο του κώδικα Java.

Ωστόσο, το JSP 1.x έχει πολλά προβλήματα που δεν σας επιτρέπουν να αναπτύξετε εύκολα σελίδες JSP χωρίς script. Μέχρι πρόσφατα, δεν υπήρχε τυπική μέθοδος πρόσβασης σε αντικείμενα Java από μια σελίδα JSP χωρίς τη χρήση κώδικα Java. Επιπλέον, οι τάξεις χειρισμού ετικετών κωδικοποίησης δεν ήταν τόσο απλές όσο θα μπορούσαν.

Οι ακόλουθες γραμμές κώδικα βασίζονται στο JSTL 1.0, το οποίο μπορεί να χρησιμοποιηθεί με το JSP 1.2. ο ετικέτα επαναλαμβάνεται πάνω από τα στοιχεία του δεδομένου λίστα και εξάγει το elem μεταβλητή για κάθε στοιχείο. Αντί να δηλώσει elem ως τοπική μεταβλητή, το Η ετικέτα δημιουργεί ένα χαρακτηριστικό σελίδας με pageContext.setAttribute (). Η τιμή αυτού του χαρακτηριστικού εκτυπώνεται με JSTL's ετικέτα:

Το JSTL παρέχει τυπικές ετικέτες για την επεξεργασία εγγράφων XML και την πρόσβαση σε σχεσιακές βάσεις δεδομένων μαζί με ετικέτες μορφοποίησης, ετικέτες διεθνοποίησης, ετικέτες υπό όρους, ετικέτες επαναληπτικού χαρακτήρα, ετικέτες που σχετίζονται με URL και άλλες ετικέτες γενικού σκοπού. Το JSTL έχει λύσει πολλά από τα προβλήματα του JSP 1.x με τη βοήθεια μιας γλώσσας έκφρασης που σας επιτρέπει να έχετε πρόσβαση σε αντικείμενα Java από σελίδες JSP χωρίς να χρησιμοποιείτε κώδικα Java. Για παράδειγμα, αντί να αναζητήσετε ένα χαρακτηριστικό ή να αποκτήσετε πρόσβαση σε μια παράμετρο αιτήματος με:

μπορείτε τώρα να χρησιμοποιήσετε:

$ {a} $ {param.p} 

Μπορείτε να αποκτήσετε πρόσβαση σε αντικείμενα περιβάλλοντος σελίδας JSP, χαρακτηριστικά σελίδας / αίτησης / περιόδου λειτουργίας / εφαρμογής (επίσης γνωστά ως μεταβλητές JSP), ιδιότητες JavaBean, στοιχεία συλλογής, παράμετροι αιτήματος, παραμέτρους αρχικοποίησης, cookie και κεφαλίδες HTTP.

Με το JSP 1.2, η γλώσσα έκφρασης είναι διαθέσιμη μόνο σε εφαρμογές που βασίζονται σε JSTL και βιβλιοθήκες ετικετών. Το JSP 2.0 καθιστά το EL διαθέσιμο σε όλες τις εφαρμογές JSP και σε όλες τις βιβλιοθήκες ετικετών (συμπεριλαμβανομένων των παλιών ετικετών ετικετών που έχουν σχεδιαστεί για το JSP 1.x). Το JSP 2.0 απλοποιεί επίσης την ανάπτυξη βιβλιοθήκης ετικετών, όπως θα δείτε αργότερα σε αυτό το άρθρο.

Από την πρώτη του έκδοση, το JSP παρέχει τυπικές ετικέτες για τη χρήση JavaBeans σε σελίδες JSP. Μπορείτε να δημιουργήσετε ή να βρείτε στιγμιότυπα JavaBean με και, στη συνέχεια, μπορείτε να πάρετε και να ορίσετε τις ιδιότητές τους με και . Με το JSP 2.0, μπορείτε επίσης να λάβετε την αξία μιας ιδιοκτησίας με:

$ {bean.property} 

Εκτός από τις ιδιότητες, τα στοιχεία JavaBean έχουν δημόσιες μεθόδους που συχνά πρέπει να κληθούν από σελίδες JSP. Το υπόλοιπο αυτού του άρθρου θα παρουσιάσει τρεις τρόπους για την κλήση μεθόδων JavaBean χωρίς τη χρήση κώδικα Java. Το ένα βασίζεται στην υποστήριξη JSP 2.0 για συναρτήσεις, οι οποίες είναι κατασκευές EL που σας επιτρέπουν να καλέσετε τις στατικές μεθόδους των τάξεων Java. Μια άλλη λύση χρησιμοποιεί προσαρμοσμένες ετικέτες που λαμβάνουν τις παραμέτρους μεθόδου ως χαρακτηριστικά ετικετών. Ο τρίτος τρόπος βασίζεται σε μια γενική ετικέτα που σας επιτρέπει να καλέσετε οποιαδήποτε δημόσια μέθοδο οποιασδήποτε κλάσης JavaBean από μια σελίδα JSP.

Χρησιμοποιήστε συναρτήσεις

Το αρχικό JSTL 1.0 EL δεν είχε υποστήριξη για λειτουργίες. Το JSP 2.0 EL σας επιτρέπει να καλέσετε μια δημόσια στατική μέθοδο μιας κλάσης Java χρησιμοποιώντας την ακόλουθη σύνταξη:

$ {πρόθεμα: methodName (param1, param2, ...)} 

Η συνάρτηση JSP πρέπει να δηλωθεί σε έναν περιγραφέα βιβλιοθήκης ετικετών (TLD):

 methodName className returnType methodName (param1Type, param2Type, ...) 

Η κλάση Java δεν χρειάζεται να εφαρμόσει καμία ειδική διεπαφή. Η μόνη απαίτηση είναι να γίνει η μέθοδος Java δημόσια και στατική.

Η τάξη TestBean

ο TestBean Το class έχει μια δημόσια μέθοδο που ονομάζεται μέθοδος ελέγχου(), που καλείται από τις σελίδες JSP που παρουσιάζονται στις ακόλουθες ενότητες. Το JavaBean έχει τρεις ιδιότητες κείμενο, αριθμός, και λογική. Αυτές οι ιδιότητες τροποποιούνται από μέθοδος ελέγχου(), η οποία επιστρέφει μια συμβολοσειρά που περιέχει τις τροποποιημένες τιμές των τριών ιδιοτήτων:

πακέτο com.devsphere.articles.calltag; δημόσια τάξη TestBean {ιδιωτικό κείμενο συμβολοσειράς; ιδιωτικό αριθμό int? ιδιωτική λογική boolean; δημόσιο TestBean () {text = ""; αριθμός = 0; λογική = false; } δημόσια συμβολοσειρά getText () {επιστροφή κειμένου; } public void setText (κείμενο συμβολοσειράς) {this.text = text; } δημόσιο int getNumber () {αριθμός επιστροφής; } public void setNumber (αριθμός int) {this.number = number; } δημόσια boolean getLogic () {λογική επιστροφής; } public void setLogic (λογική boolean) {this.logic = logic; } Δημόσια συμβολοσειρά δοκιμή (κείμενο συμβολοσειράς, αριθμός int, λογική boolean) setText (getText () + κείμενο); setNumber (getNumber () + αριθμός); setLogic (getLogic ()}) 

Η κλάση TestFunction

Επειδή το JSP 2.0 EL επιτρέπει μόνο κλήσεις σε στατικές μεθόδους, TestBean'μικρό μέθοδος ελέγχου() πρέπει να τυλιχτεί με στατική μέθοδο. ο Δοκιμή λειτουργίας Η κλάση παρέχει ένα τέτοιο στατικό περιτύλιγμα που παίρνει τις ίδιες παραμέτρους με τη μέθοδο φασολιών συν το αντικείμενο φασολιού του οποίου η μέθοδος πρέπει να καλείται

πακέτο com.devsphere.articles.calltag; δημόσια κλάση TestFunction {public static String testMethod (αντικείμενο TestBean, String text, int number, boolean logic) {return object.testMethod (κείμενο, αριθμός, λογική); }} 

Το μεταγλωττισμένο TestFunction.class το αρχείο πρέπει να τοποθετηθεί μαζί με TestBean.class στην εφαρμογή Ιστού / WEB-INF / τάξεις Ευρετήριο. Εναλλακτικά, τα δύο classfiles μπορούν να συσκευαστούν σε ένα αρχείο βάζου και να αποθηκευτούν σε / WEB-INF / lib.

Το TestFunction JSP

Πριν καλέσετε το μέθοδος ελέγχου() συνάρτηση, το TestFunction.jsp Η σελίδα πρέπει να καθορίζει το πρόθεμα της συνάρτησης και το Uniform Resource Identifier (URI) της βιβλιοθήκης:

ο δημιουργεί μια παρουσία του TestBean τάξη:

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

  $ {tf: testMethod (obj, "abc", 123, true)} 
$ {tf: testMethod (obj, obj.text, obj.number, obj.logic)}

ο TestFunction.jsp Η σελίδα παράγει την ακόλουθη έξοδο HTML:

  abc 123 αλήθεια 
abcabc 246 αλήθεια

Το TestFunction TLD

Όπως αναφέρθηκε προηγουμένως, η συνάρτηση JSP πρέπει να δηλωθεί σε μια περιγραφή βιβλιοθήκης ετικετών. ο TestFunction.tld Το αρχείο ορίζει κάποιον αριθμό έκδοσης, το στ σύντομο όνομα που χρησιμοποιείται σε σελίδες JSP ως πρόθεμα για μέθοδος ελέγχου(), το URI της βιβλιοθήκης, το όνομα της συνάρτησης, το όνομα της κλάσης που περιέχει τη στατική μέθοδο και την υπογραφή της μεθόδου. Το URI δεν χρειάζεται να δείχνει έναν υπάρχοντα πόρο στο Web, αλλά πρέπει να είναι μοναδικό. Δεν μπορείτε να χρησιμοποιήσετε το ίδιο URI για δύο διαφορετικές βιβλιοθήκες ετικετών.

Εδώ είναι το TestFunction.tld περιεχόμενο του αρχείου:

  1.0 tf //devsphere.com/articles/calltag/TestFunction.tld testMethod com.devsphere.articles.calltag.TestFunction java.lang.String testM Method (com.devsphere.articles.calltag.TestBean, java.lang.String, int, int, int, δυαδικό) 

ο TestFunction.tld Το αρχείο πρέπει να τοποθετηθεί στις εφαρμογές Web / WEB-INF Ευρετήριο. Ο ίδιος κατάλογος περιέχει επίσης το web.xml περιγραφή της εφαρμογής, η οποία δηλώνει τη βιβλιοθήκη εντός ενός στοιχείο. Το URI που προσδιορίζει τη βιβλιοθήκη σε σελίδες JSP και την τοποθεσία του αρχείου TLD καθορίζονται σε δύο ξεχωριστά στοιχεία XML, και :

  //devsphere.com/articles/calltag/TestFunction.tld /WEB-INF/TestFunction.tld 

Χρησιμοποιήστε προσαρμοσμένες ετικέτες

Οι βιβλιοθήκες ετικετών εισήχθησαν από το JSP 1.1, το οποίο καθόρισε το Ετικέτα και BodyTag διεπαφές. Προστέθηκε το JSP 1.2 Ετικέτα Iteration και υποστήριξη για εξαίρεση. Αυτές οι διεπαφές έχουν μεθόδους χειριστή όπως doStartTag (), doInitBody (), doAfterBody (), και doEndTag (). Μόλις καταλάβετε πώς πρέπει να εφαρμοστούν αυτές οι μέθοδοι, είναι εύκολο να δημιουργήσετε βιβλιοθήκες ετικετών. Ωστόσο, πολλοί προγραμματιστές θεώρησαν τον μηχανισμό χειρισμού ετικετών του JSP 1.x ως άσκοπα περίπλοκο.

Το JSP 2.0 παρουσίασε ένα πολύ απλούστερο πρωτόκολλο χειρισμού ετικετών. Εάν επεκτείνετε το Υποστήριξη SimpleTag τάξη, απλά πρέπει να εφαρμόσετε το doTag () μέθοδος χειρισμού ετικέτας JSP.

Η κλάση TestMethodTag

ο TestMethodTag.jsp η σελίδα καλεί το μέθοδος ελέγχου() Μέθοδος JavaBean χρησιμοποιώντας την ακόλουθη σύνταξη:

Όταν ο διακομιστής εφαρμογών μεταφράζει τη σελίδα JSP σε servlet, η παραπάνω ετικέτα αντικαθίσταται με ένα τμήμα κώδικα Java που καλεί τις μεθόδους ενός TestMethodTag παρουσία δημιουργήθηκε για το χειρισμό της ετικέτας.

Ο χειριστής ετικετών επεκτείνει τα API JSP 2.0 Υποστήριξη SimpleTag class και ορίζει ένα πεδίο για κάθε χαρακτηριστικό. Αυτά τα πεδία θα διατηρήσουν τις τιμές των χαρακτηριστικών της ετικέτας:

πακέτο com.devsphere.articles.calltag; εισαγωγή javax.servlet.jsp.JspException; εισαγωγή javax.servlet.jsp.JspWriter; εισαγωγή javax.servlet.jsp.tagext.SimpleTagSupport; εισαγωγή java.io.IOException; δημόσια κλάση TestMethodTag επεκτείνει το SimpleTagSupport {ιδιωτικό αντικείμενο TestBean. ιδιωτικό κείμενο συμβολοσειράς; ιδιωτικό αριθμό int? ιδιωτική λογική boolean; 

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

 public void setObject (αντικείμενο TestBean) {this.object = αντικείμενο; } public void setText (κείμενο συμβολοσειράς) {this.text = text; } public void setNumber (αριθμός int) {this.number = number; } public void setLogic (λογική boolean) {this.logic = logic; } 

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

 public void doTag () ρίχνει JspException, IOException {String ret = object.testMethod (κείμενο, αριθμός, λογική); JspWriter out = getJspContext (). GetOut (); out.println (ret); }} 

Η κλάση TestMethodTag2

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

 ... $ {ret} ... 
$config[zx-auto] not found$config[zx-overlay] not found