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

Java-Side Server: Χρησιμοποιώντας XML και JSP μαζί

Για τους σκοπούς αυτού του άρθρου θα υποθέσω ότι γνωρίζετε τι είναι οι JavaServer Pages (JSP) και Extensible Markup Language (XML), αλλά μπορεί να είστε λίγο ασαφείς για το πώς μπορείτε να τις χρησιμοποιήσετε. Η χρήση JSP είναι αρκετά εύκολη στην άμυνα. Σας επιτρέπει να σχεδιάσετε έναν ιστότοπο που δημιουργήθηκε από αρχεία που μοιάζουν και λειτουργούν σαν HTML. Η μόνη διαφορά είναι ότι τα JSP ενεργούν επίσης δυναμικά - για παράδειγμα, μπορούν να επεξεργαστούν φόρμες ή να διαβάσουν βάσεις δεδομένων - χρησιμοποιώντας το Java ως γλώσσα scripting από την πλευρά του διακομιστή. Η χρήση XML είναι πιο δύσκολο να δικαιολογηθεί. Παρόλο που φαίνεται ότι κάθε νέο προϊόν το υποστηρίζει, το καθένα φαίνεται να χρησιμοποιεί XML για διαφορετικό σκοπό.

Σε αυτό το άρθρο, θα μάθετε να σχεδιάζετε ένα σύστημα χρησιμοποιώντας XML με αρκετά μετριοπαθή τρόπο. Πολλοί ιστότοποι έχουν τεράστιες συλλογές δεδομένων που εμφανίζονται με περισσότερο ή λιγότερο τυπικό τρόπο. Θα σχεδιάσω ένα σύστημα που χρησιμοποιεί αρχεία XML για την αποθήκευση δεδομένων σε διακομιστή Web και αρχεία JSP για την εμφάνιση αυτών των δεδομένων.

XML έναντι σχεσιακών βάσεων δεδομένων

"Αλλά περιμένετε", μπορείτε να ρωτήσετε, "χρησιμοποιείτε XML για την αποθήκευση δεδομένων; Γιατί να μην χρησιμοποιήσετε μια βάση δεδομένων;" Καλή ερώτηση. Η απάντηση είναι ότι για πολλούς σκοπούς, μια βάση δεδομένων είναι υπερβολική. Για να χρησιμοποιήσετε μια βάση δεδομένων, πρέπει να εγκαταστήσετε και να υποστηρίξετε μια ξεχωριστή διαδικασία διακομιστή, η οποία συχνά απαιτεί επίσης εγκατάσταση και υποστήριξη διαχειριστή βάσης δεδομένων. Πρέπει να μάθετε SQL και να γράψετε ερωτήματα SQL που μετατρέπουν δεδομένα από μια σχέση σε δομή αντικειμένου και ξανά. Εάν αποθηκεύσετε τα δεδομένα σας ως αρχεία XML, χάνετε τα γενικά έξοδα ενός επιπλέον διακομιστή. Κερδίζετε επίσης έναν εύκολο τρόπο επεξεργασίας των δεδομένων σας: απλώς χρησιμοποιήστε ένα πρόγραμμα επεξεργασίας κειμένου και όχι ένα περίπλοκο εργαλείο βάσης δεδομένων. Τα αρχεία XML είναι επίσης ευκολότερα στη δημιουργία αντιγράφων ασφαλείας, την κοινή χρήση με τους φίλους σας ή τη λήψη στους πελάτες σας. Μπορείτε επίσης να ανεβάσετε εύκολα νέα δεδομένα στον ιστότοπό σας, χρησιμοποιώντας FTP.

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

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

(Σημείωση: Μπορείτε να χρησιμοποιήσετε απλό κλείδωμα αρχείων για να παρέχετε έναν διακομιστή συναλλαγών ενός φτωχού. Και μπορείτε επίσης να εφαρμόσετε ένα εργαλείο ευρετηρίου και αναζήτησης XML στην Java, αλλά αυτό είναι ένα θέμα για άλλο άρθρο.)

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

Τέλος, είναι απολύτως δυνατό να παρέχετε ένα περιτύλιγμα για τη βάση δεδομένων σας που κάνει ερωτήματα SQL και τα μεταφράζει σε ροές XML, ώστε να μπορείτε να το έχετε και με τους δύο τρόπους. Το XML γίνεται ένα πιο ισχυρό, φιλικό προς τον προγραμματιστή frontend σε μια ώριμη βάση δεδομένων για αποθήκευση και αναζήτηση. (Το servlet XSQL της Oracle είναι ένα παράδειγμα αυτής της τεχνικής.)

Η εφαρμογή: Ένα online άλμπουμ φωτογραφιών

Όλοι αγαπούν τις φωτογραφίες! Οι άνθρωποι λατρεύουν να δείχνουν εικόνες για τον εαυτό τους, τους φίλους τους, τα κατοικίδια ζώα τους και τις διακοπές τους. Ο Ιστός είναι το απόλυτο μέσο για αυτοεξυπηρετούμενα σφάλματα - μπορούν να ενοχλήσουν τους συγγενείς τους από χιλιάδες μίλια μακριά. Ενώ ένας πλήρης ιστότοπος άλμπουμ φωτογραφιών θα απαιτούσε ένα περίπλοκο μοντέλο αντικειμένου, θα επικεντρωθώ στον ορισμό ενός μόνο Εικόνα αντικείμενο. (Ο πηγαίος κώδικας για αυτήν την εφαρμογή διατίθεται στους πόρους.) Το αντικείμενο που αντιπροσωπεύει μια εικόνα χρειάζεται πεδία που αντιπροσωπεύουν τον τίτλο της, την ημερομηνία λήψης, μια προαιρετική λεζάντα και, προφανώς, ένα δείκτη προς την πηγή της εικόνας.

Μια εικόνα, με τη σειρά της, χρειάζεται μερικά δικά της πεδία: τη θέση του αρχείου προέλευσης (GIF ή JPEG) και το ύψος και το πλάτος σε εικονοστοιχεία (για να σας βοηθήσει να δημιουργήσετε ετικέτες). Εδώ υπάρχει ένα καλό πλεονέκτημα στη χρήση του συστήματος αρχείων ως βάση δεδομένων σας: μπορείτε να αποθηκεύσετε τα αρχεία εικόνας στον ίδιο κατάλογο με τα αρχεία δεδομένων.

Τέλος, ας επεκτείνουμε την εγγραφή εικόνας με ένα στοιχείο που ορίζει ένα σύνολο μικρογραφιών εικόνων για χρήση στον πίνακα περιεχομένων ή αλλού. Εδώ χρησιμοποιώ την ίδια έννοια του εικόνα Έχω ορίσει νωρίτερα.

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

 Alex On The Beach 1999-08-08 Προσπαθώντας μάταια να αποκτήσετε ένα μαύρισμα alex-beach.jpg 340 200 alex-beach-sm.jpg 72 72 alex-beach-med.jpg 150 99 

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

 summer99 / alex-beach.pix summer99 / alex-beach.jpg summer99 / alex-beach-sm.jpg summer99 / alex-beach-med.jpg summer99 / alex-snorkeling.pix κ.λπ. 

Τεχνικές

Υπάρχουν περισσότεροι από ένας τρόποι για την επιδερμίδα μιας γάτας και υπάρχουν περισσότεροι από ένας τρόποι για να μεταφέρετε δεδομένα XML στη σελίδα σας JSP. Εδώ είναι μια λίστα με μερικούς από αυτούς τους τρόπους. (Αυτή η λίστα δεν είναι εξαντλητική · πολλά άλλα προϊόντα και πλαίσια θα εξυπηρετούσαν εξίσου καλά.)

  • ΝΟΜ: Μπορείτε να χρησιμοποιήσετε τάξεις που εφαρμόζουν τη διεπαφή DOM για να αναλύσετε και να ελέγξετε το αρχείο XML
  • XMLEntryList: Μπορείτε να χρησιμοποιήσετε τον κωδικό μου για να φορτώσετε το XML σε ένα java.util. Λίστα ζεύγη ονομασίας-τιμής
  • XPath: Μπορείτε να χρησιμοποιήσετε έναν επεξεργαστή XPath (όπως Resin) για να εντοπίσετε στοιχεία στο αρχείο XML κατά όνομα διαδρομής
  • XSL: Μπορείτε να χρησιμοποιήσετε έναν επεξεργαστή XSL για να μετατρέψετε το XML σε HTML
  • Κουκούλι: Μπορείτε να χρησιμοποιήσετε το πλαίσιο ανοιχτού κώδικα Cocoon
  • Ρίξτε το δικό σας φασόλι: Μπορείτε να γράψετε μια τάξη περιτυλίγματος που χρησιμοποιεί μία από τις άλλες τεχνικές για τη φόρτωση των δεδομένων σε ένα προσαρμοσμένο JavaBean

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

Σελίδες JavaServer

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

  • Υποστηρίζει τις πιο ενημερωμένες εκδόσεις των προδιαγραφών JSP και servlet
  • Υποστηρίζεται από τους Sun και Apache
  • Μπορείτε να το εκτελέσετε αυτόνομο χωρίς να διαμορφώσετε ξεχωριστό διακομιστή Web
  • Είναι ανοιχτού κώδικα

(Για περισσότερες πληροφορίες σχετικά με το Tomcat, ανατρέξτε στην ενότητα Πόροι.)

Είστε ευπρόσδεκτοι να χρησιμοποιήσετε οποιονδήποτε κινητήρα JSP θέλετε, αλλά η διαμόρφωση εξαρτάται από εσάς! Βεβαιωθείτε ότι ο κινητήρας υποστηρίζει τουλάχιστον τις προδιαγραφές JSP 1.0. υπήρξαν πολλές αλλαγές μεταξύ 0,91 και 1,0. Το JSWDK (Java Server Web Development Kit) θα λειτουργήσει μια χαρά.

Η δομή JSP

Κατά τη δημιουργία ενός ιστότοπου που βασίζεται σε JSP (γνωστό και ως WebappΠροτιμώ να βάζω κοινές συναρτήσεις, εισαγωγές, σταθερές και μεταβλητές δηλώσεις σε ένα ξεχωριστό αρχείο που ονομάζεται init.jsp, βρίσκεται στον πηγαίο κώδικα για αυτό το άρθρο.

Στη συνέχεια, φορτώνω αυτό το αρχείο σε κάθε αρχείο JSP χρησιμοποιώντας . ο Η οδηγία ενεργεί όπως η γλώσσα Γ #περιλαμβάνω, τραβώντας το κείμενο του συμπεριλαμβανόμενου αρχείου (εδώ, init.jsp) και τη σύνταξη σαν να ήταν μέρος του αρχείου συμπερίληψης (εδώ, εικόνα.jsp). Αντίθετα, το Η ετικέτα μεταγλωττίζει το αρχείο ως ξεχωριστό αρχείο JSP και ενσωματώνει μια κλήση σε αυτό στο μεταγλωττισμένο JSP.

Εύρεση του αρχείου

Όταν ξεκινά το JSP, το πρώτο πράγμα που πρέπει να κάνει μετά την αρχικοποίηση είναι να βρείτε το αρχείο XML που θέλετε. Πώς ξέρει ποιο από τα πολλά αρχεία χρειάζεστε; Η απάντηση είναι από μια παράμετρο CGI. Ο χρήστης θα καλέσει το JSP με τη διεύθυνση URL picture.jsp? file = summer99 / alex-beach.pix (ή περνώντας α αρχείο παράμετρος μέσω φόρμας HTML).

Ωστόσο, όταν το JSP λαμβάνει την παράμετρο, είστε ακόμα στη μέση εκεί. Πρέπει ακόμα να ξέρετε πού βρίσκεται στο σύστημα αρχείων στον ριζικό κατάλογο. Για παράδειγμα, σε ένα σύστημα Unix, το πραγματικό αρχείο μπορεί να βρίσκεται στον κατάλογο /home/alex/public_html/pictures/summer99/alex-beach.pix. Τα JSP δεν έχουν την έννοια ενός τρέχοντος καταλόγου κατά την εκτέλεση, επομένως πρέπει να δώσετε ένα απόλυτο όνομα διαδρομής στο java.io πακέτο.

Το Servlet API παρέχει μια μέθοδο για να μετατρέψετε μια διαδρομή URL, σε σχέση με το τρέχον JSP ή Servlet, σε μια απόλυτη διαδρομή συστήματος αρχείων. Η μέθοδος ServletContext.getRealPath (συμβολοσειρά) κάνει το κόλπο. Κάθε JSP έχει ένα ServletContext αντικείμενο που ονομάζεται εφαρμογή, οπότε ο κωδικός θα είναι:

String picturefile = application.getRealPath ("/" + request.getParameter ("αρχείο")); 

ή

String picturefile = getServletContext (). GetRealPath ("/" + request.getParameter ("αρχείο")); 

που λειτουργεί επίσης μέσα σε servlet. (Πρέπει να προσθέσετε ένα / επειδή η μέθοδος αναμένει να περάσει τα αποτελέσματα του request.getPathInfo ().)

Μια σημαντική σημείωση: όποτε έχετε πρόσβαση σε τοπικούς πόρους, προσέξτε να επικυρώσετε τα εισερχόμενα δεδομένα. Ένας χάκερ, ή ένας απρόσεκτος χρήστης, μπορεί να στείλει ψευδή δεδομένα για να χαράξει τον ιστότοπό σας. Για παράδειγμα, σκεφτείτε τι θα συνέβαινε εάν η τιμή αρχείο = .. / .. / .. / .. / etc / passwd εισήχθησαν. Ο χρήστης θα μπορούσε με αυτόν τον τρόπο να διαβάσει το αρχείο κωδικού πρόσβασης του διακομιστή σας.

Το μοντέλο αντικειμένου εγγράφου

Το DOM σημαίνει το Μοντέλο αντικειμένου εγγράφου. Είναι ένα τυπικό API για περιήγηση σε έγγραφα XML, το οποίο αναπτύχθηκε από το World Wide Web Consortium (W3C). Οι διεπαφές είναι σε πακέτο org.w3c.dom και τεκμηριώνονται στον ιστότοπο του W3C (βλ. πόρους).

Υπάρχουν πολλές διαθέσιμες εφαρμογές ανάλυσης DOM. Έχω επιλέξει το XML4J της IBM, αλλά μπορείτε να χρησιμοποιήσετε οποιοδήποτε πρόγραμμα ανάλυσης DOM. Αυτό συμβαίνει επειδή το DOM είναι ένα σύνολο διεπαφών, όχι κλάσεων - και όλοι οι αναλυτές DOM πρέπει να επιστρέφουν αντικείμενα που εφαρμόζουν πιστά αυτές τις διεπαφές.

Δυστυχώς, αν και τυπικό, το DOM έχει δύο μεγάλα ελαττώματα:

  1. Το API, αν και προσανατολισμένο σε αντικείμενα, είναι αρκετά δυσκίνητο.
  2. Δεν υπάρχει τυπικό API για ένα πρόγραμμα ανάλυσης DOM, έτσι, ενώ κάθε πρόγραμμα ανάλυσης επιστρέφει a org.w3c.dom.Document αντικείμενο, τα μέσα για την αρχικοποίηση του προγράμματος ανάλυσης και τη φόρτωση του ίδιου του αρχείου είναι πάντα συγκεκριμένα.

Το απλό αρχείο εικόνας που περιγράφεται παραπάνω αντιπροσωπεύεται στο DOM από διάφορα αντικείμενα σε μια δομή δέντρου.

Κόμβος εγγράφου -> Κόμβος στοιχείου "εικόνα" -> Κόμβος κειμένου "\ n" (κενό διάστημα) -> Κόμβος στοιχείου "τίτλος" -> Κόμβος κειμένου "Alex On The Beach" -> Κόμβος στοιχείου "ημερομηνία" - -> ... κ.λπ. 

Για να αποκτήσετε την αξία Ο Άλεξ στην παραλία θα πρέπει να πραγματοποιήσετε πολλές κλήσεις μεθόδου, περπατώντας το δέντρο DOM. Επιπλέον, ο αναλυτής μπορεί να επιλέξει να διασταυρώσει οποιονδήποτε αριθμό κόμβων κειμένου στο κενό διάστημα, μέσω των οποίων θα πρέπει να κάνετε βρόχο και είτε να αγνοήσετε είτε να συνενώσετε (μπορείτε να το διορθώσετε καλώντας το ομαλύνω() μέθοδος). Το πρόγραμμα ανάλυσης μπορεί επίσης να περιλαμβάνει ξεχωριστούς κόμβους για οντότητες XML (όπως &), Κόμβοι CDATA ή άλλοι κόμβοι στοιχείων (για παράδειγμα, ο μεγάλο αρκούδα θα μετατραπεί σε τουλάχιστον τρεις κόμβους, ένας από τους οποίους είναι σι στοιχείο, που περιέχει έναν κόμβο κειμένου, που περιέχει το κείμενο μεγάλο). Δεν υπάρχει μέθοδος στο DOM που να λέει απλώς "λήψη της τιμής κειμένου του στοιχείου τίτλου". Εν ολίγοις, το περπάτημα του DOM είναι λίγο δυσκίνητο. (Ανατρέξτε στην ενότητα XPath αυτού του άρθρου για εναλλακτική λύση στο DOM.)

Από μια υψηλότερη προοπτική, το πρόβλημα με το DOM είναι ότι τα αντικείμενα XML δεν είναι διαθέσιμα απευθείας ως αντικείμενα Java, αλλά πρέπει να έχουν πρόσβαση σταδιακά μέσω του API DOM. Δείτε το συμπέρασμά μου για μια συζήτηση για την τεχνολογία δέσμευσης δεδομένων Java-XML, η οποία χρησιμοποιεί αυτήν την προσέγγιση straight-to-Java για πρόσβαση σε δεδομένα XML.

Έχω γράψει μια μικρή τάξη χρησιμότητας, που ονομάζεται DOMUtils, που περιέχει στατικές μεθόδους για την εκτέλεση κοινών εργασιών DOM. Για παράδειγμα, για να αποκτήσετε το περιεχόμενο κειμένου του τίτλος θυγατρικό στοιχείο της ρίζας (εικόνα) στοιχείο, θα γράφατε τον ακόλουθο κώδικα:

Έγγραφο doc = DOMUtils.xml4jParse (picturefile); Στοιχείο nodeRoot = doc.getDocumentElement (); Κόμβος nodeTitle = DOMUtils.getChild (nodeRoot, "title"); String title = (nodeTitle == null); null: DOMUtils.getTextValue (nodeTitle); 

Η λήψη των τιμών για τα υποστοιχεία εικόνας είναι εξίσου απλή:

Κόμβος nodeImage = DOMUtils.getChild (nodeRoot, "image"); Κόμβος nodeSrc = DOMUtils.getChild (nodeImage, "src"); String src = DOMUtils.getTextValue (nodeSrc); 

Και ούτω καθεξής.

Μόλις έχετε μεταβλητές Java για κάθε σχετικό στοιχείο, το μόνο που πρέπει να κάνετε είναι να ενσωματώσετε τις μεταβλητές μέσα στη σήμανση HTML, χρησιμοποιώντας τυπικές ετικέτες JSP

Ανατρέξτε στον πλήρη πηγαίο κώδικα για περισσότερες λεπτομέρειες. Η έξοδος HTML που παράγεται από το αρχείο JSP - ένα στιγμιότυπο οθόνης HTML, εάν θέλετε - είναι μέσα εικόνα-dom.html.

$config[zx-auto] not found$config[zx-overlay] not found