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

Πρότυπα JSP

Παρόλο που τα εργαλεία ανάπτυξης Ιστού προχωρούν με ταχείς ρυθμούς, εξακολουθούν να υστερούν σε σχέση με τις περισσότερες γραφικές διεπαφές χρήστη (GUI), όπως Swing ή VisualWorks Smalltalk. Για παράδειγμα, τα παραδοσιακά κιτ εργαλείων GUI παρέχουν διαχειριστές διάταξης, με τη μία ή την άλλη μορφή, που επιτρέπουν την ενσωμάτωση και επαναχρησιμοποίηση αλγορίθμων διάταξης. Αυτό το άρθρο διερευνά έναν μηχανισμό προτύπων για JavaServer Pages (JSP) που, όπως και οι διαχειριστές διάταξης, ενσωματώνει διάταξη ώστε να μπορεί να επαναχρησιμοποιηθεί αντί να αναπαραχθεί.

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

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

Η διάταξη της σελίδας που φαίνεται στο Σχήμα 1 εφαρμόζεται με ετικέτες πίνακα HTML:

Παράδειγμα 1. Συμπεριλαμβανομένου του περιεχομένου

Πρότυπα JSP 
<%@include file="sidebar.html"%>
<%@include file="header.html"%>
<%@include file="introduction.html"%>
<%@include file="footer.html"%>

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

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

Χρήση προτύπων

Τα πρότυπα είναι αρχεία JSP που περιλαμβάνουν παραμετροποιημένο περιεχόμενο. Τα πρότυπα που συζητούνται σε αυτό το άρθρο εφαρμόζονται με ένα σύνολο προσαρμοσμένων ετικετών: πρότυπο: λήψη, πρότυπο: βάλτε, και πρότυπο: ένθετο. ο πρότυπο: λήψη Η ετικέτα αποκτά πρόσβαση σε παραμετροποιημένο περιεχόμενο, όπως φαίνεται στο Παράδειγμα 2.α, το οποίο παράγει ιστοσελίδες με τη μορφή που φαίνεται στο Σχήμα 1.

Παράδειγμα 2.α Ένα πρότυπο

<πρότυπο: get name = "title"/>
<πρότυπο: λήψη όνομα = "κεφαλίδα" />

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

πρότυπο: λήψη ανακτά ένα Java bean με το καθορισμένο όνομα από το πεδίο εφαρμογής. Το φασόλι περιέχει το URI (Uniform Resource Identifier) ​​ενός στοιχείου Web που περιλαμβάνεται στο πρότυπο: λήψη. Για παράδειγμα, στο πρότυπο που αναφέρεται στο Παράδειγμα 2.α, πρότυπο: λήψη αποκτά URI - κεφαλίδα.html - από ένα φασόλι που ονομάζεται επί κεφαλής στο πεδίο εφαρμογής. Ακολούθως, πρότυπο: λήψη περιλαμβάνει header.html.

πρότυπο: βάλτε βάζει τα φασόλια σε πεδίο εφαρμογής που στη συνέχεια ανακτώνται από πρότυπο: λήψη. Το πρότυπο περιλαμβάνεται στο πρότυπο: ένθετο. Το παράδειγμα 2.β απεικονίζει τη χρήση του βάζω και εισάγετε ετικέτες:

Παράδειγμα 2.β. Χρήση του προτύπου από το Παράδειγμα 2.α

<>εισάγετε template = "/ articleTemplate.jsp"><>βάζω name = "title" content = "Templates" direct = "true" /><>βάζω name = "header" content = "/ header.html" /><>βάζω name = "sidebar" content = "/ sidebar.jsp" /><>βάζω name = "content" content = "/ εισαγωγή.html" /><>βάζω name = "footer" content = "/ footer.html" />

ο εισάγετε Η ετικέτα έναρξης καθορίζει το πρότυπο που θα συμπεριληφθεί, στην περίπτωση αυτή το πρότυπο που αναφέρεται στο Παράδειγμα 2.α. Καθε βάζω Η ετικέτα αποθηκεύει ένα φασόλι στο πεδίο αίτησης και το εισάγετε Η ετικέτα λήξης περιλαμβάνει το πρότυπο. Στη συνέχεια, το πρότυπο έχει πρόσβαση στα φασόλια όπως περιγράφεται παραπάνω.

ΕΝΑ απευθείας χαρακτηριστικό μπορεί να καθοριστεί για πρότυπο: βάλτε; αν απευθείας Έχει οριστεί αληθής, το περιεχόμενο που σχετίζεται με την ετικέτα δεν περιλαμβάνεται στο πρότυπο: λήψη, αλλά εκτυπώνεται απευθείας στο σιωπηρό έξω μεταβλητός. Στο παράδειγμα 2.β, για παράδειγμα, το περιεχόμενο τίτλου - Πρότυπα JSP - χρησιμοποιείται για τον τίτλο του παραθύρου.

Οι ιστότοποι που περιέχουν πολλές σελίδες με πανομοιότυπες μορφές έχουν ένα πρότυπο, όπως αυτό που αναφέρεται στο Παράδειγμα 2.α και πολλές σελίδες JSP, όπως το Παράδειγμα 2.β, που χρησιμοποιούν το πρότυπο. Εάν η μορφή τροποποιηθεί, οι αλλαγές περιορίζονται στο πρότυπο.

Ένα άλλο πλεονέκτημα των προτύπων και συμπεριλαμβανομένου του περιεχομένου γενικά είναι η αρθρωτή σχεδίαση. Για παράδειγμα, το αρχείο JSP που αναφέρεται στο Παράδειγμα 2.b περιλαμβάνει τελικά κεφαλίδα.html, που αναφέρονται στο Παράδειγμα 2.γ.

Παράδειγμα 2.γ. κεφαλίδα.html


Επειδή κεφαλίδα.html Περιλαμβάνεται περιεχόμενο, δεν χρειάζεται να αναπαραχθεί μεταξύ των σελίδων που εμφανίζουν μια κεφαλίδα. Επίσης, αν και κεφαλίδα.html είναι ένα αρχείο HTML, δεν περιέχει το συνηθισμένο προοίμιο των ετικετών HTML όπως ή επειδή αυτές οι ετικέτες ορίζονται από το πρότυπο. Δηλαδή, επειδή το πρότυπο περιλαμβάνει κεφαλίδα.html, αυτές οι ετικέτες δεν πρέπει να επαναλαμβάνονται στο κεφαλίδα.html.

Σημείωση: Το JSP παρέχει δύο τρόπους για να συμπεριλάβετε περιεχόμενο: στατικά, με το περιλαμβάνω οδηγία, και δυναμικά, με το περιλαμβάνω δράση. ο περιλαμβάνω Η οδηγία περιλαμβάνει την πηγή της σελίδας προορισμού κατά το χρόνο μεταγλώττισης και είναι ισοδύναμη με τη C #περιλαμβάνω ή Java εισαγωγή. ο περιλαμβάνω Η ενέργεια περιλαμβάνει την απόκριση του στόχου που δημιουργείται κατά το χρόνο εκτέλεσης.

Όπως το JSP περιλαμβάνω δράση, τα πρότυπα περιλαμβάνουν περιεχόμενο δυναμικά. Έτσι, αν και οι σελίδες JSP στο Παράδειγμα 1 και στο Παράδειγμα 2.β είναι λειτουργικά πανομοιότυπες, η πρώτη περιλαμβάνει στατικά περιεχόμενο, ενώ το δεύτερο το συμπεριλαμβάνει δυναμικά.

Προαιρετικό περιεχόμενο

Όλο το περιεχόμενο του προτύπου είναι προαιρετικό, γεγονός που καθιστά ένα πρότυπο χρήσιμο σε περισσότερες ιστοσελίδες. Για παράδειγμα, το Σχήμα 2.α και το Σχήμα 2.β δείχνουν δύο σελίδες - σύνδεση και απόθεμα - που χρησιμοποιούν το ίδιο πρότυπο. Και οι δύο σελίδες έχουν κεφαλίδα, υποσέλιδο και κύριο περιεχόμενο. Η σελίδα αποθέματος διαθέτει έναν πίνακα επεξεργασίας (στον οποίο λείπει η σελίδα σύνδεσης) για την πραγματοποίηση αλλαγών αποθέματος.

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

 ... 
όνομα = 'editPanel'/>
...

Η σελίδα αποθέματος χρησιμοποιεί το πρότυπο που αναφέρεται παραπάνω και καθορίζει περιεχόμενο για τον πίνακα επεξεργασίας:

   ...  ...  

Αντίθετα, η σελίδα σύνδεσης δεν καθορίζει περιεχόμενο για τον πίνακα επεξεργασίας:

Επειδή η σελίδα σύνδεσης δεν καθορίζει περιεχόμενο για τον πίνακα επεξεργασίας, δεν περιλαμβάνεται.

Περιεχόμενο βάσει ρόλου

Οι διαδικτυακές εφαρμογές διακρίνουν συχνά περιεχόμενο βάσει του ρόλου του χρήστη. Για παράδειγμα, το ίδιο πρότυπο JSP, το οποίο περιλαμβάνει τον πίνακα επεξεργασίας μόνο όταν ο ρόλος του χρήστη είναι επιμελητής, παράγει τις δύο σελίδες που φαίνονται στα Σχήματα 3.α και 3.β.

Το πρότυπο που χρησιμοποιείται στα σχήματα 3.α και 3.β χρησιμοποιεί πρότυπο: λήψη'μικρό ρόλος Χαρακτηριστικό:

 ...  ...  ... 
role = «επιμελητής»/>
...

ο παίρνω Η ετικέτα περιλαμβάνει περιεχόμενο μόνο εάν ο ρόλος του χρήστη ταιριάζει με το ρόλος Χαρακτηριστικό. Ας δούμε πώς λειτουργεί ο διαχειριστής ετικετών πρότυπο: λήψη χρησιμοποιεί το ρόλος Χαρακτηριστικό:

Η δημόσια τάξη GetTag επεκτείνει το TagSupport {private String name = null, role = null; ... public void setRole (String role) {this.role = role; } ... public int doStartTag () ρίχνει το JspException {... if (param! = null) {if (roleIsValid ()) { // συμπεριλάβετε ή εκτυπώστε περιεχόμενο ... }} ...} ιδιωτικό boolean roleIsValid ()  } 

Εφαρμογή προτύπων

Τα πρότυπα που συζητούνται σε αυτό το άρθρο εφαρμόζονται με τρεις προσαρμοσμένες ετικέτες:

  • πρότυπο: ένθετο
  • πρότυπο: βάλτε
  • πρότυπο: λήψη

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

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

Για να διασφαλιστεί ότι κάθε πρότυπο έχει πρόσβαση μόνο στις δικές του πληροφορίες, πρότυπο: ένθετο διατηρεί μια στοίβα hashtables. Καθε εισάγετε η ετικέτα έναρξης δημιουργεί ένα hashtable και την ωθεί στη στοίβα. Το κλειστό βάζω οι ετικέτες δημιουργούν φασόλια και τα αποθηκεύουν στο νέο hashtable. Ακολούθως, παίρνω Οι ετικέτες στο συμπεριλαμβανόμενο πρότυπο έχουν πρόσβαση στα φασόλια στο hashtable. Το σχήμα 4 δείχνει πώς διατηρείται η στοίβα για ένθετα πρότυπα.

Κάθε πρότυπο στο σχήμα 4 έχει πρόσβαση στο σωστό υποσέλιδο. footer.html για template_1.jsp και footer_2.html για template_2.jsp. Εάν τα φασόλια αποθηκεύονταν απευθείας στο πεδίο αίτησης, το βήμα 5 στο σχήμα 4 θα αντικατέστησε το υποσέλιδο φασόλι που καθορίζεται στο βήμα 2.

Εφαρμογές ετικετών προτύπου

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

Εάν δεν υπάρχει ήδη στοίβα προτύπου, το εισάγετε Η ετικέτα έναρξης δημιουργεί μία και την τοποθετεί στο πεδίο αίτησης. Στη συνέχεια δημιουργείται ένα hashtable και ωθείται στη στοίβα.

Καθε βάζω η ετικέτα έναρξης δημιουργεί ένα Παράμετρος σελίδας φασόλι, αποθηκευμένο στο hashtable που δημιουργήθηκε από το περίβλημα εισάγετε ετικέτα.

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

Το Σχήμα 6 δείχνει το διάγραμμα ακολουθίας για πρότυπο: λήψη.

Λίστα ετικετών προτύπων

Οι εφαρμογές χειρισμού ετικετών για τις ετικέτες προτύπων αποδεικνύονται απλές. Το Παράδειγμα 3.α παραθέτει το Εισαγωγή ετικέτας class - ο χειριστής ετικετών για πρότυπο: ένθετο.

Παράδειγμα 3.α ΕισαγωγήTag.java