Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ servlets€¦ ·...

25
Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ JAVA SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η τεχνολογία Java Servlets, η οποία είναι κατάλληλη για διαδικτυακό προγραμματισμό, καθώς επιτρέπει τη δημιουργία εφαρμογών, υπηρεσιών και συστημάτων στο περιβάλλον του παγκόσμιου ιστού (World Wide Web/WWW). Συγκεκριμένα, εξετάζονται η τεχνολογία που υποστηρίζει τα Servlets, τα βασικά ιδιαίτερα χαρακτηριστικά τους, καθώς και ο κύκλος ζωής τους. Κατόπιν, αναλύεται ο τρόπος με τον οποίο κατασκευάζεται ένα Servlet, δίνεται μια σειρά από προγραμματιστικά παραδείγματα, μέσω των οποίων επιδεικνύεται η διαχείριση συνεδριών και παρουσιάζεται η αυθεντικοποίηση μέσω σύνδεσης σε βάση δεδομένων. Προαπαιτούμενη γνώση 1) Κεφάλαια 5 και 6 του παρόντος. 2) M. Hall και L. Brown (2007), Servlets και σελίδες διακομιστή Java: Τεχνολογίες πυρήνα, Κλειδάριθμος (Κωδικός Βιβλίου στον Εύδοξο: 13578). 3) Ι. Χ. Παναγιωτόπουλος (2010), Εφαρμογές Διαδικτυακού Προγραμματισμού με JAVΑ, Σταμούλης (Κωδικός Βιβλίου στον Εύδοξο: 148957). 7.1. H γλώσσα προγραμματισμού Java Η Java είναι μια γλώσσα ανάπτυξης εφαρμογών, η οποία δημιουργήθηκε από τη Sun Micrοsystems και πρωτοεμφανίστηκε το 1995. Αποτελεί ένα σημαντικό εργαλείο για τους προγραμματιστές, καθώς μπορεί να χρησιμοποιηθεί σε ένα ευρύ φάσμα εφαρμογών, από εφαρμογές στην πλευρά του εξυπηρετητή (server-side) μέχρι και εφαρμογές κινητών τηλεφώνων. Αναπτύχθηκε ως μια γλώσσα μη εξαρτημένη από πλατφόρμες, για να μπορεί να εκτελείται σε οποιοδήποτε μηχάνημα και όχι μόνο σε εκείνο στο οποίο δημιουργήθηκε η εφαρμογή. Είναι μια αντικειμενοστρεφής γλώσσα και, για την εκτέλεση των προγραμμάτων, απαιτεί μόνο την ύπαρξη μιας εικονικής μηχανής, της Java Virtual Machine (JVM). Μπορεί να εκτελεστεί είτε απευθείας σε ένα μηχάνημα πελάτη είτε μέσω ενός εξυπηρετητή ιστού (Web Server).[1] Τα στοιχεία και οι δυνατότητες που περιέχει η Java προέρχονται κυρίως από άλλες γλώσσες προγραμματισμού, όπως είναι οι C, FORTRAN, Ada και Lisp. Αυτό σημαίνει ότι, για την πλειονότητα των προγραμματιστών, και ιδίως για εκείνους που γνωρίζουν C++, η Java είναι σχετικά εύκολη και γρήγορη στην εκμάθηση. Είναι μια απλή γλώσσα, διότι περιέχει λίγες προγραμματιστικές δομές και εντολές, που έχουν αυστηρά ορισμένη σημασία. Επίσης, χρησιμοποιεί κλάσεις που είναι τουλάχιστον υποκλάσεις ακριβώς μιας άλλης, δηλαδή δεν έχει ούτε πολλαπλή κληρονομικότητα, ούτε δείκτες, όπως έχει η C++, χαρακτηριστικό που της προσδίδει απλότητα. Ακόμα, χρησιμοποιεί απλούς τελεστές, χωρίς να εμφανίζει την υπερφόρτωση τελεστών (operator overloading), που παρατηρείται στην C++. Ένα απλό παράδειγμα κώδικα προγράμματος Java δίνεται στον Κώδικα 7.1. Ο τελικός κώδικας που παράγεται από την Java δεν είναι στοχευμένος σε συγκεκριμένο υπολογιστικό σύστημα. Ο προγραμματιστής μπορεί να γράψει το πρόγραμμά του ακόμα και σε έναν απλό επεξεργαστή κειμένου, όπως είναι το σημειωματάριο των Windows. Στη συνέχεια, με τη βοήθεια του μεταγλωττιστή της Java, ο κώδικας υφίσταται μετάφραση σε έναν ενδιάμεσο κώδικα, που ονομάζεται bytecode (αρχείο με κατάληξη .class). Αυτός ο ενδιάμεσος κώδικας είναι κοινός για όλες τις πλατφόρμες που δέχονται

Upload: others

Post on 07-Aug-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ JAVA

SERVLETS

Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η τεχνολογία Java Servlets, η οποία είναι κατάλληλη για διαδικτυακό προγραµµατισµό, καθώς επιτρέπει τη δηµιουργία εφαρµογών, υπηρεσιών και συστηµάτων στο περιβάλλον του παγκόσµιου ιστού (World Wide Web/WWW). Συγκεκριµένα, εξετάζονται η τεχνολογία που υποστηρίζει τα Servlets, τα βασικά ιδιαίτερα χαρακτηριστικά τους, καθώς και ο κύκλος ζωής τους. Κατόπιν, αναλύεται ο τρόπος µε τον οποίο κατασκευάζεται ένα Servlet, δίνεται µια σειρά από προγραµµατιστικά παραδείγµατα, µέσω των οποίων επιδεικνύεται η διαχείριση συνεδριών και παρουσιάζεται η αυθεντικοποίηση µέσω σύνδεσης σε βάση δεδοµένων. Προαπαιτούµενη γνώση 1) Κεφάλαια 5 και 6 του παρόντος.

2) M. Hall και L. Brown (2007), Servlets και σελίδες διακοµιστή Java: Τεχνολογίες πυρήνα, Κλειδάριθµος (Κωδικός Βιβλίου στον Εύδοξο: 13578). 3) Ι. Χ. Παναγιωτόπουλος (2010), Εφαρµογές Διαδικτυακού Προγραµµατισµού µε JAVΑ, Σταµούλης (Κωδικός Βιβλίου στον Εύδοξο: 148957).

7.1. H γλώσσα προγραµµατισµού Java

Η Java είναι µια γλώσσα ανάπτυξης εφαρµογών, η οποία δηµιουργήθηκε από τη Sun Micrοsystems και πρωτοεµφανίστηκε το 1995. Αποτελεί ένα σηµαντικό εργαλείο για τους προγραµµατιστές, καθώς µπορεί να χρησιµοποιηθεί σε ένα ευρύ φάσµα εφαρµογών, από εφαρµογές στην πλευρά του εξυπηρετητή (server-side) µέχρι και εφαρµογές κινητών τηλεφώνων. Αναπτύχθηκε ως µια γλώσσα µη εξαρτηµένη από πλατφόρµες, για να µπορεί να εκτελείται σε οποιοδήποτε µηχάνηµα και όχι µόνο σε εκείνο στο οποίο δηµιουργήθηκε η εφαρµογή. Είναι µια αντικειµενοστρεφής γλώσσα και, για την εκτέλεση των προγραµµάτων, απαιτεί µόνο την ύπαρξη µιας εικονικής µηχανής, της Java Virtual Machine (JVM). Μπορεί να εκτελεστεί είτε απευθείας σε ένα µηχάνηµα πελάτη είτε µέσω ενός εξυπηρετητή ιστού (Web Server).[1]

Τα στοιχεία και οι δυνατότητες που περιέχει η Java προέρχονται κυρίως από άλλες γλώσσες προγραµµατισµού, όπως είναι οι C, FORTRAN, Ada και Lisp. Αυτό σηµαίνει ότι, για την πλειονότητα των προγραµµατιστών, και ιδίως για εκείνους που γνωρίζουν C++, η Java είναι σχετικά εύκολη και γρήγορη στην εκµάθηση. Είναι µια απλή γλώσσα, διότι περιέχει λίγες προγραµµατιστικές δοµές και εντολές, που έχουν αυστηρά ορισµένη σηµασία. Επίσης, χρησιµοποιεί κλάσεις που είναι τουλάχιστον υποκλάσεις ακριβώς µιας άλλης, δηλαδή δεν έχει ούτε πολλαπλή κληρονοµικότητα, ούτε δείκτες, όπως έχει η C++, χαρακτηριστικό που της προσδίδει απλότητα. Ακόµα, χρησιµοποιεί απλούς τελεστές, χωρίς να εµφανίζει την υπερφόρτωση τελεστών (operator overloading), που παρατηρείται στην C++. Ένα απλό παράδειγµα κώδικα προγράµµατος Java δίνεται στον Κώδικα 7.1.

Ο τελικός κώδικας που παράγεται από την Java δεν είναι στοχευµένος σε συγκεκριµένο υπολογιστικό σύστηµα. Ο προγραµµατιστής µπορεί να γράψει το πρόγραµµά του ακόµα και σε έναν απλό επεξεργαστή κειµένου, όπως είναι το σηµειωµατάριο των Windows. Στη συνέχεια, µε τη βοήθεια του µεταγλωττιστή της Java, ο κώδικας υφίσταται µετάφραση σε έναν ενδιάµεσο κώδικα, που ονοµάζεται bytecode (αρχείο µε κατάληξη .class). Αυτός ο ενδιάµεσος κώδικας είναι κοινός για όλες τις πλατφόρµες που δέχονται

Page 2: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

προγράµµατα σε JAVA. Ωστόσο, τα συστήµατα πρέπει να έχουν ενσωµατωµένο έναν αντίστοιχο διερµηνέα (interpreter) της Java, την Java Virtual Machine (JVM).[2]

Η διαδικασία µεταγλώττισης και εκτέλεσης των προγραµµάτων Java προϋποθέτει τη λήψη και εγκατάσταση του Java Developer Kit (JDK). 1 Επίσης, χρειάζεται και ένας επεξεργαστής κειµένου, για την επεξεργασία των πηγαίων προγραµµάτων. Αρχικά, γίνεται µεταγλώττιση του πηγαίου προγράµµατος Java (π.χ. test.java), µε τη βοήθεια του javac, του µεταγλωττιστή (compiler) της Java και την εκτέλεση της απλής εντολής «javac test.java». Αν δεν υπάρχουν µεταφραστικά λάθη, παράγεται ο ενδιάµεσος κώδικας σε bytecode, σε ένα ή/και περισσότερα αρχεία, τα οποία µπορεί είτε να χρησιµοποιηθούν τοπικά είτε να µεταφερθούν σε άλλους υπολογιστές του δικτύου. Μόλις δηµιουργηθεί ο ενδιάµεσος κώδικας, γίνεται η εκτέλεσή του από την JVM. Η εκτέλεση αρχίζει µε την εντολή: Java test.java.

// Πρόγραµµα σε Java το οποίο εµφανίζει το µήνυµα Hello

Class class HelloClass {

public static void main (String args[]) { // Εµφάνιση του µηνύµατος

System.out.println("Hello Class from Java"); } }

Κώδικας 7.1. Ένα απλό παράδειγµα σε γλώσσα Java.

Οι γραµµές που αρχίζουν µε // αφορούν σχόλια, τα οποία αγνοούνται από το µεταγλωττιστή. Το αρχείο πρέπει να ονοµαστεί HelloClass.java (δηλαδή, να έχει το ίδιο όνοµα µε την κλάση), ώστε να δουλέψει το πρόγραµµα. Η µέθοδος main δείχνει την αρχή της εκτέλεσης του προγράµµατος. Δηλώνεται ως δηµόσια (public), δηλαδή µπορεί να κληθεί από οποιοδήποτε σηµείο του προγράµµατος. Επίσης, δηλώνεται και ως στατική (static), δηλαδή παραµένει ως µόνιµο αντίγραφο, κοινό για τα αντικείµενα της κλάσης σε όλη τη διάρκεια της εκτέλεσης. Τέλος, δηλώνεται ως void, δηλαδή δεν επιστρέφει κάποια τιµή. Όταν καλείται η µέθοδος main, εµφανίζει το µήνυµα «Hello Class from Java». Αυτό επιτυγχάνεται µέσω της µεθόδου System.out.println.

Το περιβάλλον του χρόνου εκτέλεσης (Java Runtime Environment/JRE) της JVM αναλαµβάνει την κατασκευή και την καταστροφή αντικειµένων και, εν γένει, τη διαχείριση της µνήµης, σε πλήρη αλληλεπίδραση και συνεργασία µε το λειτουργικό σύστηµα. Η Java διαθέτει, επίσης, ένα σύστηµα συλλογής απορριµµάτων (garbage collector), το οποίο είναι υπεύθυνο για την απελευθέρωση µη χρησιµοποιούµενης µνήµης. Δηλαδή, η Java δεν απαιτεί από τον προγραµµατιστή να απελευθερώσει τη µνήµη που χρησιµοποιεί στην εφαρµογή του, αλλά το κάνει µόνη της, µε τη χρήση του συστήµατος συλλογής απορριµµάτων, το οποίο αποδεσµεύει οποιοδήποτε κοµµάτι µνήµης είναι πλέον ανενεργό, όπως ένα αντικείµενο που δεν διαθέτει αναφορές προς αυτό. Σηµαντικό πλεονέκτηµα της Java αποτελεί η ασφάλεια του κώδικα, η οποία παρέχεται µέσα από την ίδια την υλοποίηση της εικονικής µηχανής JVM.

Αυτήν τη στιγµή, η Java ενυπάρχει σε ένα µεγάλο ποσοστό εφαρµογών που χρησιµοποιούνται παγκοσµίως, όπως είναι οι εφαρµογές σε προσωπικούς υπολογιστές, τα παιχνίδια, οι κινητές συσκευές κ.ά. Στη συνέχεια του κεφαλαίου, παρουσιάζεται ο τρόπος µε τον οποίο µπορεί να χρησιµοποιηθεί η Java ως γλώσσα διαδικτυακού προγραµµατισµού για τη δηµιουργία Servlets, δηλαδή προγραµµάτων που τρέχουν στην πλευρά ενός εξυπηρετητή ιστού ή ενός εξυπηρετητή εφαρµογών (application server), µε σκοπό να εξυπηρετήσουν τα αιτήµατα του πελάτη.

1 http://www.oracle.com/technetwork/java/javase/downloads/index.html.

Page 3: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

7.2. Στατικές και δυναµικές ιστοσελίδες Όταν πρωτοξεκίνησε ο παγκόσµιος ιστός, οι περισσότερες σελίδες ήταν στατικές, δηλαδή είχαν προκαθορισµένο περιεχόµενο για όλους τους πελάτες-επισκέπτες της ιστοσελίδας. Το περιεχόµενο αυτό µπορούσε να το αλλάξει µόνο ο διαχειριστής της ιστοσελίδας, µε απευθείας επέµβαση στον κώδικα της HyperText Markup Language (HTML). Πλέον, έχει επικρατήσει ένα νέο είδος ιστοσελίδων, οι δυναµικές. Οι δυναµικές ιστοσελίδες δεν διαθέτουν προκαθορισµένο περιεχόµενο, αλλά αυτό διαµορφώνεται σύµφωνα µε τις παραµέτρους της αίτησης (request) του χρήστη. Έτσι, δίνεται στον πελάτη η δυνατότητα να αλληλεπιδράσει µε την ιστοσελίδα και να τη διαµορφώσει ανάλογα µε τις ανάγκες του, στο βαθµό τον οποίο του προσφέρει ο κατασκευαστής της ιστοσελίδας. Επίσης, ο διαχειριστής µπορεί να διαχειριστεί και να διαµορφώσει την ιστοσελίδα πιο εύκολα.

Ένας τρόπος δηµιουργίας δυναµικών ιστοσελίδων αποτελούν τα Java Applets, προγράµµατα που εκτελούνται στην πλευρά του πελάτη. Ο εξυπηρετητής δεν µπορεί να καθορίσει δυναµικά το περιεχόµενο µιας ιστοσελίδας, παρά µόνο να στείλει στατικές ιστοσελίδες, ως απάντηση των αιτήσεων του πελάτη. Γι’ αυτόν το λόγο, στην πλευρά του εξυπηρετητή χρησιµοποιείται µια βοηθητική εφαρµογή της γλώσσας Java, η οποία αναλαµβάνει την επεξεργασία των παραµέτρων των αιτήσεων και τη δυναµική δηµιουργία περιεχοµένου. Η βοηθητική αυτή εφαρµογή είναι τα Java Servlets, από τις λέξεις «server» και «applet», τα οποία είναι ένα είδος Java Applet που τρέχει στον εξυπηρετητή, αντί για το φυλλοµετρητή. Τα Servlet χρησιµοποιούν µεθόδους του πρωτοκόλλου Hypertext Transfer Protocol (HTTP), δηλαδή του προτύπου επικοινωνίας µεταξύ πελάτη και εξυπηρετητή.[3]

Κάθε φορά που ένας εξυπηρετητής λαµβάνει µια αίτηση HTTP, καλεί το αντίστοιχο Servlet που έχει οριστεί να την αναλάβει. Αυτό, µε τη σειρά του, την επεξεργάζεται και επιστρέφει µια απόκριση (response) µε τη µορφή κώδικα HTML. Η σηµαντική διαφορά σε σχέση µε τα σενάρια Common Gateway Interface (CGI) είναι ότι τα τελευταία εκτελούνται στον εξυπηρετητή ιστού, ως ξεχωριστές διαδικασίες, ενώ τα Servlets εκτελούνται από τον εξυπηρετητή. Τα Servlets αναπτύχθηκαν µε στόχο να ξεπεράσουν τις ελλείψεις της τεχνολογίας CGI.[3] Κάθε φορά που ο χρήστης κάνει αίτηση για ένα έγγραφο, ο εξυπηρετητής ιστού µπορεί να εκτελέσει µία από τις εξής τρεις ενέργειες, ανάλογα µε αυτό που διευκρινίζεται στο έγγραφο ότι πρέπει να κάνει:

α) να προσκοµίσει το έγγραφο απευθείας από το τοπικό σύστηµα αρχείων, β) να ξεκινήσει ένα πρόγραµµα CGI, που θα δηµιουργήσει ένα έγγραφο,

ενδεχοµένως µε τη χρήση δεδοµένων από µια τοπική βάση δεδοµένων, και γ) να διαβιβάσει το αίτηµα σε ένα Servlet. Στη συνέχεια, θα δούµε αναλυτικότερα τη λειτουργία και τον προγραµµατισµό των

Java Servlets.

7.3. Java Servlets Το Servlet αποτελεί µια κλάση της γλώσσας προγραµµατισµού Java και ανήκει στην έκδοση της Java για επιχειρήσεις, την Java Enterprise Edition (Java EE). Η πρώτη του έκδοση (1.0) αναπτύχθηκε το 1997 από την εταιρεία Sun Microsystems. Μπορεί να εκτελεστεί σε οποιονδήποτε εξυπηρετητή ιστού στον οποίο έχει ενσωµατωθεί ένας Servlet Container. Χρησιµοποιώντας τα Servlets, µπορεί να συλλεχθεί είσοδος από το χρήστη µέσω διαδικτυακών φορµών, µέσω τρεχουσών εγγραφών από µια βάση δεδοµένων ή µέσω µιας άλλης πηγής, και να δηµιουργηθούν ιστοσελίδες µε δυναµικό τρόπο.[3]

Τα Servlets έχουν ορισµένα σηµαντικά χαρακτηριστικά. Ειδικότερα:[4][5] 1. Μπορεί να εκτελεστούν χωρίς αλλαγές σε εξυπηρετητές διαφορετικού τύπου. 2. Δεδοµένου ότι είναι γραµµένα στη γλώσσα Java, έχουν πρόσβαση σε

πληθώρα σχετικών βιβλιοθηκών, όπως αυτές των CORBA και RMI, ασφαλείας ή σύνδεσης βάσεων δεδοµένων.

Page 4: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

3. Με τον προγραµµατισµό CGI σε γλώσσες όπως η Perl, κάθε φορά που µια νέα αίτηση προωθείται από το φυλλοµετρητή του πελάτη, µια νέα διεργασία πρέπει να ξεκινήσει και να τερµατιστεί µε τη λήξη της σύνδεσης, ενώ το αντίστοιχο πρόγραµµα πρέπει να φορτωθεί και να ξεφορτωθεί από τη µνήµη. Αυτό σηµαίνει ότι το φορτίο µπορεί να είναι µεγάλο για τον εξυπηρετητή ιστού. Αντίθετα, τα Servlets δεν απαιτούν κάτι τέτοιο, επειδή είναι εγκατεστηµένα στη µνήµη, δηλαδή παρέχουν καλύτερη απόδοση από την τεχνολογία CGI σε σχέση µε το χρόνο επεξεργασίας και τη χρησιµοποίηση της µνήµης, γιατί εκµεταλλεύονται τα οφέλη των πολλαπλών νηµάτων (multithreading). Με αυτόν τον τρόπο, για κάθε νέα αίτηση, δηµιουργείται ένα νέο νήµα, µια τεχνική ταχύτερη από τη δηµιουργία ενός νέου αντικειµένου για κάθε νέα αίτηση που απαιτεί η τεχνολογία CGI.

4. Μπορούν να διατηρήσουν την κατάστασή τους, δηλαδή να διατηρήσουν κάποιο είδος µνήµης, ανάµεσα στις αιτήσεις που δέχονται. Αυτό σηµαίνει ότι µπορούν να «θυµηθούν» δεδοµένα και λεπτοµέρειες προηγούµενων αιτήσεων.

5. Το αντικειµενοστρεφές µοντέλο της Java βοηθά τον κώδικά της να είναι πιο δοµηµένος σε σχέση µε έναν κώδικα γραµµένο σε άλλες γλώσσες, όπως σε Perl. Πράγµατι, εξετάζοντας προγράµµατα Perl CGI, διαπιστώνουµε συχνά ότι είναι µονοκόµµατα, τεράστια και δυσνόητα. Επίσης, η αντικειµενοστρέφεια δίνει τη δυνατότητα µεγαλύτερης επαναχρησιµοποίησης του κώδικα.

6. Τρέχουν σε κάθε σύστηµα και πλατφόρµα, και η διαδικτυακή εφαρµογή που έχει προγραµµατιστεί µε αυτά µπορεί να εκτελεστεί σε κάθε συνηθισµένο Web Container, όπως είναι οι Tomcat και Glassfish, και σε διάφορα λειτουργικά συστήµατα, όπως τα Windows, Linux, Unix και Mac.

7. Ο container αναλαµβάνει τον κύκλο ζωής τους, και έτσι δεν τίθεται θέµα διαρροών µνήµης, ασφάλειας και διαχείρισης απορριµµάτων.

Στην Εικόνα 7.1 φαίνεται η θέση των Servlets σε µια διαδικτυακή εφαρµογή.

Εικόνα 7.1 Τα Servlets σε µια διαδικτυακή εφαρµογή.

Page 5: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

7.3.1. Περιβάλλον ανάπτυξης για Servlet Μέσω του περιβάλλοντος ανάπτυξης (development environment), δηµιουργούµε, δοκιµάζουµε και εκτελούµε τα Servlets. Για τη εκτέλεσή τους, είναι απαραίτητο να υπάρχει εγκατεστηµένο στο µηχάνηµα το Java Development Kit. Επίσης, απαιτείται και ένας Servlet Container. Προτείνονται η λήψη και η εγκατάσταση του Apache Tomcat.2[6],[7]

7.4. Τα Servlets αναλυτικά Μπορούµε να πούµε ότι ένα servlet διαθέτει τρία ονόµατα-αναγνωριστικά, µε τα

οποία το γνωρίζουν οι διάφορες οντότητες. Το πραγµατικό όνοµα του εξυπηρετητή και το τελευταίο επίπεδο στην ιεραρχία των κλάσεων για την εκτέλεσή του συνιστούν το απόλυτο µονοπάτι του αρχείου “ServletName”.class, που εµπεριέχει τον κώδικα του Servlet. Το δεύτερο όνοµα του Servlet προκύπτει από το διαχειριστή που το εγκαθιστά στο container. Ο διαχειριστής δίνει ένα µοναδικό αναγνωριστικό, το οποίο είναι γνωστό µόνο στο container. Το τρίτο όνοµα είναι αυτό µε το οποίο το γνωρίζει ο πελάτης, δηλαδή το URL που οδηγεί τελικά στο Servlet.

7.4.1 Ο κύκλος ζωής ενός Servlet Σε αυτή την υποενότητα αναλύεται ο κύκλος ζωής ενός Servlet, από τη στιγµή που δηµιουργείται µέχρι να διαγραφεί η οντότητά του. Κατά τη δηµιουργία ενός Servlet, ακολουθείται η ιεραρχία κλάσεων που φαίνεται στην Εικόνα 7.2. Στη συνέχεια, αναλύονται οι µέθοδοι του Servlet σε κάθε φάση του κύκλου ζωής του.

Εικόνα 7.2 Η ιεραρχία κλάσεων Servlet.

Στην πρώτη φάση του κύκλου ζωής του Servlet, ο container δηµιουργεί µια οντότητα (στιγµιότυπο) από το Servlet και ξεκινά τη χρήση της. Σε αυτό το στάδιο χρησιµοποιείται η εξής µέθοδος:[8][9]

init(): Καλείται µία φορά, όταν ο container αρχικοποιεί µια οντότητα του Servlet, ή χρησιµοποιείται για τη δηµιουργία αντικειµένων που χρειάζονται στην εξυπηρέτηση των

2 http://tomcat.apache.org/.

Page 6: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

αιτήσεων, όπως στη σύνδεση µε µια βάση δεδοµένων. Στον Κώδικα 7.2 φαίνεται η γενική σύνταξη της µεθόδου init():

public void init() throws ServletException { // κώδικας }

Κώδικας 7.2. Η µέθοδος init().

Στη φάση της αρχικοποίησης, δηλαδή όταν δίνονται στο Servlet οι απαραίτητες παράµετροι για τη λειτουργία του, χρησιµοποιούνται οι εξής µέθοδοι (βλ. και Εικόνα 7.3):

• service(): Ελέγχει τη µέθοδο της αίτησης HTTP (GET, POST κτλ.) και, αναλόγως, καλεί την αντίστοιχη µέθοδο του Servlet [doGet(), doPost() κτλ.]. Δεν πρέπει να γίνεται υπερφόρτωση της κλάσης HttpServlet.

Εικόνα 7.3 Οι µέθοδοι service() και doGet().

• doGet()/doPost(): Οι µέθοδοι αυτές εξάγουν τις πληροφορίες (παραµέτρους) που στέλνει ο πελάτης µέσω των αιτήσεων HTTP και στη συνέχεια επεξεργάζονται τις πληροφορίες, ενώ έχουν και πρόσβαση σε βάσεις δεδοµένων. Επίσης, χρησιµοποιούνται για την κατασκευή της απόκρισης HTTP, την οποία στέλνουν πίσω στον πελάτη.

public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { // κώδικας }

Κώδικας 7.3. Η µέθοδος doGet().

Στο τέλος, καλείται, για µόνο µία φορά, η µέθοδος destroy(), κατά τη διαγραφή της οντότητας του Servlet, η οποία χρησιµοποιείται για την απελευθέρωση πόρων, όπως για το κλείσιµο µιας σύνδεσης µε µια βάση δεδοµένων. Στην Εικόνα 7.4 φαίνεται ο κύκλος ζωής ενός Servlet, όπως αυτός αναλύθηκε παραπάνω. Παρουσιάζονται η αρχικοποίησή του, η καταστροφή του, καθώς και η κλήση των διαφόρων µεθόδων.

Page 7: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

Εικόνα 7.4 Ο κύκλος ζωής ενός Servlet.

7.4.2 Δηµιουργία της απόκρισης HTTP Αφού ένα Servlet επεξεργαστεί την αίτηση του πελάτη, πρέπει να δηµιουργήσει την απόκρισης HTTP (και να τη στείλει στον πελάτη). Για να το κάνει αυτό, χρησιµοποιεί τις µεθόδους του αντικειµένου της κλάσης HttpServletResponse, που είναι παράµετρος της doGet()/doPost(). Οι πιο συνηθισµένες µέθοδοι είναι οι εξής:[10]

• setContentType(): Θέτει τον τύπο των δεδοµένων που περιέχει η απόκριση (π.χ. text/html).

• getWriter(): Δηµιουργεί ένα ρεύµα εξόδου, για να γραφτεί το κείµενο ή ο κώδικας HTML της απόκρισης. Ουσιαστικά, επιστρέφει ένα αντικείµενο PrinterWriter, το οποίο γράφει το κείµενο µε τις µεθόδους print() και println().

PrinterWriter out = response.getWriter(); out.println(“<title> welcome!! </title>”);

Κώδικας 7.4. Η µέθοδος get.Writer().

• getOutputStream(): Δηµιουργεί ένα ρεύµα εξόδου, για την εγγραφή µιας

σειράς από byte στην απόκριση. Δηλαδή, επιστρέφει ένα αντικείµενο ServletOutputStream, το οποίο γράφει τα byte µε τη µέθοδο write().

ServletOutputStream out = response.getOutputStream(); out.write(aByteArray);

Κώδικας 7.5. Η µέθοδος get.OutputStream.

7.5. Παραδείγµατα Java Servlets 7.5.1. Ένα απλό Servlet Ακολουθεί ένα παράδειγµα απλού Servlet, στο οποίο χρησιµοποιούνται οι µέθοδοι που αναλύθηκαν. Το συγκεκριµένο Servlet λαµβάνει µια αίτηση HTTP από τον πελάτη και απαντά µε µια απλή απόκριση, που περιλαµβάνει κώδικα HTML.[11]

Στις τρεις πρώτες γραµµές του Servlet, φαίνεται ποιες κλάσεις πρέπει να εισαχθούν απαραίτητα και στη συνέχεια ο ορισµός της κλάσης του Servlet που κληρονοµεί την κλάση

Page 8: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

HTTPServlet. Να σηµειωθεί ότι, λόγω της κλάσης HTTPServlet, δεν χρειάζεται να υπερφορτωθεί η µέθοδος service(), µια και υλοποιείται στην κλάση γονέας.

Στη συνέχεια, στον Κώδικα 7.6, παρουσιάζεται ο ορισµός της doGet() (γραµµή 6), η οποία δέχεται δύο ορίσµατα, ένα HttpServletRequest και ένα HttpServletResponse, και δεν επιστρέφει τίποτα, µια και ο τύπος επιστροφής είναι void.

Κώδικας 7.6. Ένα απλό Servlet.

Επίσης, η doGet() διαχειρίζεται τις εξαιρέσεις (exception handling) ServletException και IOException (γραµµή 6). Στη συνέχεια, χρησιµοποιεί τη µέθοδο setContentType() (γραµµή 9) του HttpServletResponse, για να δηλώσει ότι ο τύπος των δεδοµένων της απάντησης θα είναι κώδικας HTML. Έπειτα, δηλώνει ένα αντικείµενο της κλάσης PrintWriter (γραµµή 10) και χρησιµοποιεί τη µέθοδο println (γραµµές 11 και 12), για να γράψει στο φυλλοµετρητή του πελάτη τον συγκεκριµένο κώδικα HTML, ο οποίος, µε τη σειρά του, θα εµφανίσει ως τίτλο σελίδας το «A Simple Servlet» και ως κείµενο, µε έντονα γράµµατα, το «Hello from Simple Servlet!».

7.5.2. Παράδειγµα Servlet για την εµφάνιση στοιχείων από φόρµα Στην συνέχεια δίνεται το παράδειγµα δηµιουργίας ενός Servlet, το οποίο θα κάνει χρήση της µεθόδου GET, για να περαστούν τα στοιχεία µιας φόρµας από τον πελάτη στον εξυπηρετητή.[11] Η µέθοδος GET στέλνει την κωδικοποιηµένη πληροφορία από το χρήστη, µαζί µε την αίτηση για τη σελίδα. Η σελίδα και η κωδικοποιηµένη πληροφορία χωρίζονται µε το χαρακτήρα ?, όπως φαίνεται στον Κώδικα 7.7. Για την υλοποίηση του παραδείγµατος, χρησιµοποιήθηκαν τα JDK 8, ο Tomcat 8.0 και το περιβάλλον NetBeans IDE 8.0.2.3

http://www.testing.gr/page?key1=value1&key2=value2

3 https://netbeans.org/downloads/index.html.

1. import javax.servlet.*;

2. import javax.servlet.http.*;

3. import java.io.*;

4. public class SimpleServlet extends HttpServlet

5. {

6. public void doGet (HttpServletRequest request, HttpServletResponse response)

7. throws ServletException, IOException {

8. // Στέλνεται πίσω µια απόκριση HTTP (HTTP response)

9. response.setContentType("text/html");

10. PrintWriter out = response.getWriter();

11. out.println("<title>A Simple Servlet</title>");

12. out.println("<big>Hello from Simple Servlet! </big>");

13. }

14. }

Page 9: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

Κώδικας 7.7. Η µέθοδος GET.

Η µέθοδος GET δεν πρέπει να χρησιµοποιείται για να µεταφερθούν στον εξυπηρετητή ευαίσθητα δεδοµένα, όπως κωδικοί πρόσβασης, γιατί αυτά φαίνονται στις παραµέτρους του υπερσυνδέσµου. Επίσης, η µέθοδος GET έχει περιορισµό στο πλήθος των χαρακτήρων. Επιτρέπει µέχρι 1.024 χαρακτήρες σε µια συµβολοσειρά αίτησης.

Για να διαβαστούν δεδοµένα από φόρµες µέσω Servlet, χρησιµοποιούνται οι εξής µέθοδοι:

• getParameter(): Χρησιµοποιείται για τη λήψη της τιµής µιας παραµέτρου που υπάρχει σε µια φόρµα.

• getParameterValues(): Χρησιµοποιείται εάν η παράµετρος καλείται πολλές φορές και επιστρέφει πολλαπλές τιµές, όπως σε ένα checkbox.

• getParameterNames(): Χρησιµοποιείται όταν χρειάζεται µια πλήρης λίστα των παραµέτρων που υπάρχουν στην τρέχουσα αίτηση.

Στο περιβάλλον του Netbeans, όπως φαίνεται στην Εικόνα 7.5, επιλέγουµε αρχικά «File→ New Project→ Java Web → WebApplication» και µετά «Next». Στο όνοµα της εφαρµογής επιλέγουµε «ServletForm».

Εικόνα 7.6 Δηµιουργία Servlet στο NetBeans IDE

Στη συνέχεια, επιλέγουµε «Next» και «Finish». Έπειτα, στο χώρο όπου βρίσκονται τα τρέχοντα project, επιλέγουµε το ServletForm, πατάµε δεξί κλικ και µετά «New→ Servlet».

Εικόνα 7.6 Το project ServletForm

Δίνουµε για όνοµα το «ServletForm», όπως φαίνεται στην Εικόνα 7.7.

Page 10: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

Εικόνα 7.7 Δηµιουργία του Servlet.

Επιλέγοντας «Νext» στην επόµενη οθόνη που θα εµφανιστεί, µαρκάρουµε το «Add Information to Deployment descriptor» (web.xml), όπως φαίνεται στην Εικόνα 7.8, και κατόπιν επιλέγουµε «Finish».

Εικόνα 7.8 Δηµιουργία του Servlet.

Στη συνέχεια, διαγράφουµε το περιεχόµενο του αρχείου ServletForm.java που δηµιουργήθηκε και γράφουµε τον Κώδικα 7.8.

1. // Φόρτωση των απαραίτητων βιβλιοθηκών της Java 2. import java.io.*; 3. import javax.servlet.*; 4. import javax.servlet.http.*; 5. public class ServletForm extends HttpServlet { 6. public void doGet(HttpServletRequest request, HttpServletResponse response) 7. throws ServletException, IOException 8. { 9. response.setContentType("text/html"); 10. PrintWriter out = response.getWriter(); 11. String title = "Reading Data from a Servlet";

Page 11: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

12. String docType = "<!DOCTYPE html>\n"; 13. out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n"

+ 14. "<body bgcolor=\"#FFFFFF\">\n" + 15. "<h1 align=\"center\">" + title + "</h1>\n" + "<ul>\n" + 16. " <li><b>Name</b>: " + request.getParameter("name") + "\n" + 17. " <li><b>Surname</b>: " + request.getParameter("surname") + "\n" + 18. "</ul>\n" + 19. "</body></html>"); 20. }}

Κώδικας 7.8. Το αρχείο ServletForm.java.

Τέλος, στο αρχείο index.html που δηµιουργήθηκε διαγράφουµε το περιεχόµενό του και γράφουµε τον Κώδικα 7.9.

1. <!DOCTYPE html> 2. <body> 3. <form action="ServletForm" method="GET"> 4. Name: <input type="text" name="name"> 5. Surname: <input type="text" name="surname" /> 6. <input type="submit" value="Submit" /> 7. </form> 8. </body> 9. </html>

Κώδικας 7.9. Το αρχείο index.html.

Για την εκτέλεση του προγράµµατος, επιλέγουµε «Run Project» ή F6. Τότε, θα εµφανιστεί στο φυλλοµετρητή η σελίδα που φαίνεται στην Εικόνα 7.9.

Εικόνα 7.9 Η σελίδα που εµφανίζεται τρέχοντας το Project

Δίνοντας τις τιµές «Test1» και «Test2», για Name και Surname, αντίστοιχα, στην οθόνη εµφανίζεται η σελίδα της Εικόνας 7.10.

Εικόνα 7.10 Η σελίδα που εµφανίζεται αφού υποβληθεί η φόρµα.

Παρατηρούµε ότι στην µπάρα διευθύνσεων εµφανίστηκε το URL του Κώδικα 7.10, στον οποίο φαίνονται οι παράµετροι εκτέλεσης της µεθόδου HTTP GET.

Page 12: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

http://localhost:8080/ServletForm/ServletForm?name=Test1&surname=Test2

Κώδικας 7.10. Η διεύθυνση (URL) που φαίνεται στο φυλλοµετρητή.

7.5.3. Παράδειγµα Servlet για ανάλυση του ονόµατος εξυπηρετητή σε διεύθυνση IP Σε αυτή την ενότητα παρουσιάζεται ένα πρόγραµµα στο οποίο ο χρήστης γράφει ένα όνοµα εξυπηρετητή (Uniform Resource Locator/URL) και το Servlet τού επιστρέφει τη διεύθυνση IP που αντιστοιχεί σε αυτό το όνοµα. Αρχικά, δηµιουργούµε την ιστοσελίδα από την οποία περνά ο πελάτης την παράµετρο (URL) στο Servlet. Ο κώδικας HTML της συγκεκριµένης ιστοσελίδας είναι αυτός που εµφανίζεται στον Κώδικα 7.11.

1. <!DOCTYPE html> 2. <head> 3. <title>IP Example</title> 4. <meta charset="UTF-8"> 5. <meta name="viewport" content="width=device-width,

initial-scale=1.0"> 6. </head> 7. <body> 8. <form action="GetServletIP" method="GET"> 9. Host: <input type="text" name="host"> 10. <input type="submit" value="Submit" /></form> 11. </body> 12. </html> Κώδικας 7.11. Η διεύθυνση (URL) που καταχωρείται στο φυλλοµετρητή.

Το χαρακτηριστικό action της ετικέτας form καθορίζει ότι, όταν υποβάλλονται τα δεδοµένα από την ιστοσελίδα, θα καλείται το GetServletIP µε τη µέθοδο HTTP POST. Η φόρµα της ιστοσελίδας αποτελείται από ένα πεδίο κειµένου, όπου ο χρήστης θα γράφει το URL για το οποίο ενδιαφέρεται να µάθει τη διεύθυνση IP και πατώντας ένα κουµπί θα υποβάλλει τα δεδοµένα. Ελέγχουµε αυτή την ιστοσελίδα πληκτρολογώντας τη διεύθυνση http:/localhost:8080/GetServletIP/index.html. Έτσι, εµφανίζεται η ιστοσελίδα της Εικόνας 7.11.

Εικόνα 7.11 Η φόρµα υποβολής του ονόµατος του εξυπηρετητή υποδοχής (hostname URL).

Το Servlet που θα επιστρέφει τη διεύθυνση IP του URL το οποίο καταχωρεί ο χρήστης, δηλαδή το GetServletIP, παρουσιάζεται στον Κώδικα 7.12.

1. import java.io.*; 2. import javax.servlet.*; 3. import javax.servlet.http.*; 4. import java.net.*;

Page 13: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

5. public class GetServletIP extends HttpServlet 6. { 7. public void doGet(HttpServletRequest request,

HttpServletResponse response) 8. throws IOException, ServletException 9. { 10. String name = request.getParameter("host");

11. try{ 12. InetAddress address =

InetAddress.getByName(name); 13. response.setContentType("text/html"); 14. PrintWriter out = response.getWriter(); 15. out.println("<html>"); 16. out.println("<head>"); 17. out.println("<title>Host Search</title>"); 18. out.println("</head>"); 19. out.println("<body>"); 20. out.println("<h1>"); 21. out.println("The IP address is:"

+address.getHostAddress()); 22. out.println("<br>"); 23. out.println("The Host is:" +

address.getHostName()); 24. out.println("</h1>"); 25. out.println("</body>"); 26. out.println("</html>"); 27. } 28. catch (UnknownHostException e)

29. { 30. response.setContentType("text/html"); 31. PrintWriter out = response.getWriter(); 32. out.println("<html>"); 33. out.println("<head>"); 34. out.println("<title>Host Search</title>"); 35. out.println("</head>"); 36. out.println("<body>"); 37. out.println("<h1>"); 38. out.println("This is not a valid host

name"); 39. out.println("</h1>"); 40. out.println("</body>"); 41. out.println("</html>"); 42. } 43. } 44. public void doPost(HttpServletRequest request,

HttpServletResponse response) 45. throws IOException, ServletException 46. { 47. doGet(request, response); 48. } 49. } Κώδικας 7.12. Το GetServletIP Servlet.

Page 14: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

Στη συνέχεια, παρέχονται επεξηγήσεις στα κυριότερα σηµεία του Κώδικα 7.12:

• Γραµµή 10: Για να πάρουµε τα δεδοµένα τα οποία έχει υποβάλει ο χρήστης από µια φόρµα, καλούµε τη µέθοδο getParameter του αντικειµένου request και αποθηκεύουµε την τιµή που επιστρέφει στη µεταβλητή name.

• Γραµµή 12: Δηµιουργούµε τη µεταβλητή address, τύπου InetAddress. Σε αυτήν εκχωρούµε την τιµή που επιστρέφεται από την κλήση της µεθόδου getByName της κλάσης InetAddress, µε παράµετρο το όνοµα του υποδοχής (hostname) που εισήγαγε ο χρήστης. Η συγκεκριµένη µέθοδος κάνει µια έρευνα Domain Name Resolution (DNS) γι’ αυτό το όνοµα και το επιστρέφει µαζί µε τη διεύθυνση IP που του αντιστοιχεί.

• Γραµµή 21: Η µέθοδος getHostAddress επιστρέφει µόνο τη διεύθυνση ΙΡ που εµπεριέχεται στη µεταβλητή address. Αυτή η διεύθυνση εµφανίζεται στην ιστοσελίδα που παράγεται και µετά επιστρέφεται στο φυλλοµετρητή του χρήστη.

• Γραµµή 23: Η µέθοδος getHostName επιστρέφει µόνο το όνοµα του εξυπηρετητή που εµπεριέχεται στη µεταβλητή address.

• Γραµµή 28: Η µέθοδος getByNamegeByName επιστρέφει µια εξαίρεση UnknownHostException, αν δεν βρεθεί η διεύθυνση IP του ονόµατος του εξυπηρετητή που καταχώρησε ο χρήστης.

• Γραµµή 44: Η εκτέλεση του προγράµµατος αρχίζει από τη µέθοδο doPost και όχι από τη µέθοδο doGet, αφού χρησιµοποιείται η µέθοδος doPost για την κλήση του Servlet. Η doPost καλεί απλώς την doGet, στην οποία περιέχεται όλος ο κώδικας που υλοποιεί τη λειτουργικότητα του Servlet. Με αυτόν τον τρόπο, αν το ίδιο Servlet κληθεί από µια άλλη ιστοσελίδα µε τη µέθοδο doGet, θα λειτουργεί µε τον ίδιο ακριβώς τρόπο.

Ανοίγουµε την ιστοσελίδα http://localhost:8080/GetServletIP, εισάγουµε το όνοµα

του εξυπηρετητή, όπως. www.unipi.gr, και πατάµε το κουµπί «Submit». Με το «Submit» καλείται αµέσως το Servlet GetServletIP και επιστρέφεται η ιστοσελίδα της Εικόνας 7.12.

Εικόνα 7.12 Το αποτέλεσµα εκτέλεσης του Servlet GetServletIP.

Στην περίπτωση που ο χρήστης εισάγει ένα άκυρο όνοµα εξυπηρετητή, τότε εµφανίζεται η ιστοσελίδα της Εικόνας 7.13.

Page 15: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

Εικόνα 7.13 Η σελίδα σε περίπτωση µη υπαρκτού URL.

7.5.4. Παράδειγµα Servlet για αυθεντικοποίηση µέσω σύνδεσης σε βάση δεδοµένων

Στη συνέχεια δίνεται ένα παράδειγµα αυθεντικοποίησης (authentication) µέσω µιας φόρµας σύνδεσης (Login) και της χρήσης Servlet. Πρώτα παρουσιάζεται ο Κώδικας 7.13 σε γλώσσα HTML, που δηµιουργεί την ιστοσελίδα στην οποία ο χρήστης τοποθετεί τα στοιχεία του (username και password), για να συνδεθεί.[12]

1. <html> 2. <head> 3. <title>Login Page</title> 4. <meta http-equiv="Content-Type" content="text/html;

charset=iso-8859-7"> 5. </head> 6. <body> 7. <p>Enter Username and Password</p> 8. <form name="form1" method="post" action="DBAccess"> 9. <table width="25%" border="1"> 10. <tr> 11. <td width="30%">Username:</td> 12.

<td width="70%"><input type="text" name="username"></td> 13. </tr> 14. <tr> 15. <td width="30%">Password:</td> 16.

<td width="70%"><input type="password" name="password"></td>

17. </tr> 18. </table> 19. <div align="center"></div> 20. <p align="left"> 21.

<input type="submit" name="Submit" value="Login"> 22. </p> 23. </form> 24. <p>&nbsp; </p> 25. </body> 26. </ html > Κώδικας 7.13. Παράδειγµα σελίδας σύνδεσης.

Ο Κώδικας 7.12 είναι ένα παράδειγµα κλασικής υλοποίησης ιστοσελίδας για αυθεντικοποίηση ενός χρήστη µε τη χρήση HTML. Βλέπουµε ότι στον ορισµό της φόρµας καλούµε «action» το DBAccess, το οποίο είναι ένα Servlet που θα πραγµατοποιήσει την

Page 16: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

πιστοποίηση των στοιχείων τα οποία εισάγει ο χρήστης. Η υλοποίησή του παρουσιάζεται στον Κώδικα 7.14. Στη γραµµή 8, στην ιστοσελίδα του Κώδικα 7.13, φαίνεται ο ορισµός της Java κλάσης DBAccess, ως «action» της συγκεκριµένης σελίδας HTML.

1. import javax.servlet.*; 2. import javax.servlet.http.*; 3. import java.io.*; 4. import java.util.*; 5. import java.sql.*; 6. public class DBAccess extends HttpServlet { 7. public void init(ServletConfig

config) throws ServletException { 8. super.init(config); 9. } 10. public void doPost(HttpServletRequest request,

HttpServletResponse response) 11. throws ServletException, IOException { 12.

response.setContentType("text/html;charset=iso-8859-7"); 13. PrintWriter out = response.getWriter(); 14. String username=null; 15. String password=null; 16. String dbusername="root"; 17. String dbpassword="password"; 18. HttpSession session = null; 19. Connection con=null; 20. Statement stmt = null; 21. username = request.getParameter("username"); 22. password = request.getParameter("password"); 23. ServletContext servletContext =

getServletContext(); 24. try { 25. Class.forName("org.postgresql.Driver"); 26.

con=DriverManager.getConnection("jdbc:postgresql://192.168.0.3:5432/etak_final", "etak_user", "");

27. stmt = con.createStatement(); 28. if (username == null || username.length()

== 0) { 29.

response.sendRedirect(request.getContextPath()+"/index.html");

30. return; 31. } 32. if (password==null || password.length() ==

0){ 33.

response.sendRedirect(request.getContextPath()+"/index.html");

Page 17: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

34. return; 35. } 36. String SQL1 ="select * from credentials

where (username= '"+username+"' and password ='" + password+"')";

37. ResultSet rs = stmt.executeQuery(SQL1); 38. if (rs.next()) { 39. session = request.getSession(true); 40.

session.setAttribute("userID",username); 41.

response.sendRedirect(request.getContextPath() +"/dataentry.html ");

42. } 43. else { 44.

response.sendRedirect(request.getContextPath() +"/loginerror.html ");

45. } 46. } 47. catch(Exception e){ 48. System.out.println("Exception Messsage

"+e.getMessage()); 49. e.printStackTrace(); 50. } 51. finally { 52. try { 53. if (stmt!=null) stmt.close(); 54. } 55. catch (SQLException e) { 56. e.printStackTrace(); 57. } 58. finally{ 59. try{ 60. if (con !=null) con.close(); 61. } 62. catch (SQLException ignored) {} 63. } 64. } 65. } 66. } Κώδικας 7.14. Παράδειγµα Servlet µε αυθεντικοποίηση µέσω βάσης δεδοµένων.

Στη συγκεκριµένη κλάση, ορίζονται δύο µέθοδοι, η init() και η service(). Η init() καλεί την προκαθορισµένη συνάρτηση init() της κλάσης HttpServlet, την οποία κληρονοµεί η κλάση DBAccess. Η service() συγκρίνει τα στοιχεία username και password που δίνει ο πελάτης, τα οποία ανακτά από µια βάση δεδοµένων. Με αυτά τα στοιχεία θα επιλέξει πώς θα δράσει αντίστοιχα. Αν ο πελάτης αυθεντικοποιηθεί επιτυχώς, θα τον οδηγήσει στην επόµενη σελίδα της εφαρµογής, ενώ στην αντίθετη περίπτωση, θα του επιστρέψει µια σελίδα λάθους.

Παρακάτω αναλύονται µερικά σηµεία του παραπάνω κώδικα: • Γραµµή 26: Γίνεται η σύνδεση µε τη βάση δεδοµένων (postgresql). • Γραµµές 28 και 32: Ελέγχεται εάν έχουν δοθεί όνοµα χρήστη και κωδικός.

Εάν δεν έχουν δοθεί, τότε ο χρήστης µεταφέρεται στην σελίδα index.html.

Page 18: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

• Γραµµή 41: Γίνεται η µεταφορά του χρήστη στην επιθυµητή σελίδα, µετά την επιτυχηµένη αυθεντικοποίηση.

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

Έστω ότι οι κώδικες των σελίδων αποτελεσµάτων (index.html, dataentry.html και

loginerror.html) είναι οι Κώδικες 7.14, 7.1 5 και 7.16.

1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

2. <html> 3. <head> 4. <meta http-equiv="Content-Type" content="text/html;

charset=UTF-8"> 5. <title>Insert title here</title> 6. </head> 7. <body> 8. <p>Successful login</p> 9. </body> 10. </html> Κώδικας 7.15. Η σελίδα dataentry.html.

1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

2. <html> 3. <head> 4. <meta http-equiv="Content-Type" content="text/html;

charset=UTF-8"> 5. <title>Insert title here</title> 6. </head> 7. <body> 8. <p>Index page</p> 9. </body> 10. </html>

Κώδικας 7.16. Η σελίδα index.html.

1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

2. <html> 3. <head> 4. <meta http-equiv="Content-Type" content="text/html;

charset=UTF-8"> 5. <title>Insert title here</title> 6. </head> 7. <body> 8. <p>Error</p> 9. </body> 10. </html> Κώδικας 7.17. Η σελίδα loginerror.html.

Τρέχοντας αυτή την ενδεικτική εφαρµογή ιστού, λαµβάνουµε τα αποτελέσµατα που εµφανίζονται στις Εικόνες 7.14, 7.15, 7.16 και 7.17.

Page 19: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

Εικόνα 7.14 Η σελίδα εισόδου δεδοµένων αυθεντικοποίησης.

Εικόνα 7.15 Η σελίδα σε περίπτωση που δεν δοθεί όνοµα χρήστη ή κωδικός.

Εικόνα 7.16 Η σελίδα σε περίπτωση που δοθεί υπαρκτό όνοµα χρήστη, µε σωστό κωδικό.

Εικόνα 7.17 Η σελίδα λάθους.

7.5.5. Διαχείριση συνεδριών Ένας πελάτης µιας εφαρµογής που βασίζεται σε τεχνολογίες ιστού περνά συνήθως µέσα από µια ακολουθία ιστοσελίδων, όπου υποβάλλει δεδοµένα και λαµβάνει διαφόρων τύπων αποκρίσεις από τον εξυπηρετητή. Η διαδικασία που ακολουθείται µεταξύ πελάτη και εξυπηρετητή για την ανταλλαγή πληροφοριών ονοµάζεται συνεδρία (session). Το θέµα που

Page 20: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

εγείρεται σε τέτοιου είδους ανταλλαγή πληροφοριών αφορά τον τρόπο µε τον οποίο ο εξυπηρετητής θα αναγνωρίσει ότι όλη αυτή η ακολουθία ιστοσελίδων και αιτήσεων προέρχεται από τον συγκεκριµένο πελάτη. Συνήθως, στην αρχή της σύνδεσής του µε τον εξυπηρετητή, ο πελάτης παίρνει ένα µοναδικό αναγνωριστικό (ID). Αυτό επιτρέπει στον εξυπηρετητή να αναγνωρίζει από ποιον πελάτη έρχεται κάθε φορά η αίτηση, ώστε να επιτρέψει ή να αποτρέψει συγκεκριµένες ενέργειες. Για το σκοπό αυτό, ο πελάτης αποστέλλει σε κάθε αίτησή του και το αναγνωριστικό του. Το πρόγραµµα του Κώδικα 7.18 αρχίζει µια νέα συνεδρία την πρώτη φορά που συνδέεται ο πελάτης µε τον εξυπηρετητή και εκτυπώνει στο φυλλοµετρητή του το αναγνωριστικό που του έχει αποδώσει o εξυπηρετητής για τη συγκεκριµένη συνεδρία.

1. import javax.servlet.*; 2. import javax.servlet.http.*; 3. import java.io.*; 4. public class SessionServlet extends HttpServlet { 5. public void service(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

6. response.setContentType("text/html;charset=iso-8859-7");

7. PrintWriter out = response.getWriter();

8. HttpSession session = null; 9. String user = null; 10. int nof_visits=0; 11. try{ 12. session = request.getSession(false);

13. if (session == null) { // O χρήστης δεν έχει συνδεθεί ή η συνεδρία έληξε

14. out.println("Είναι η πρώτη σας επίσκεψη στη σελίδα.<p> ");

15. session = request.getSession(true);

16. session.setAttribute("nof_visits","1");

17. session.setAttribute(“user”, “unipi”);

18. out.println("Το ID της τρέχουσας συνεδρίας είναι: "+session.getId()+"<p>");

19. out.println("Είστε ο χρήστης: "+(String)session.getAttribute("user")+"<p>");

20. return;

21. } 22. else{ 23. out.println("Δεν είναι η πρώτη σας

επίσκεψη στη σελίδα. <p>");

24. out.println("Το ID της τρέχουσας συνεδρίας είναι : "+session.getId()+ "<p>");

Page 21: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

25. user = (String) session.getAttribute("user");

26. if (user == null || !user .equals(“unipi”) ) {

27. response.sendRedirect(request.getContextPath()+"/error.html");

28. return; 29. }

30.

nof_visits=Integer.parseInt((String)session.getAttribute("nof_visits"));

31. nof_visits++; 32.

session.setAttribute("nof_visits",""+nof_visits); 33. out.println("Έχετε επισκεφθεί τη

σελίδα"+nof_visits+"φορές");

34. out.println("Είστε ο χρήστης: "+(String)session.getAttribute("user")+"<p>");

35. return;

36. } 37. } 38. catch(Exception e) {

39. System.out.println(e.getMessage()); 40. e.printStackTrace();

41. } 42. }

43. }

Κώδικας 7.18. Παράδειγµα Servlet µε διαχείριση συνεδριών.

Παρακάτω αναλύονται µερικά σηµεία του Κώδικα 7.18: • Γραµµή 6: Βλέπουµε την αρχικοποίηση της απόκρισης HTTP και τον ορισµό της,

ως απάντηση τύπου κειµένου της κωδικοποίησης iso-8859-7 (ελληνικά). • Γραµµή 12: Με την κλήση request.getSession(false), παίρνουµε αναφορά στο

αντικείµενο session, προκειµένου να εξετάσουµε στην παρακάτω γραµµή εάν υπάρχει συνεδρία ή όχι. Εάν δεν υπάρχει, τότε είναι η πρώτη µας επίσκεψη στην ιστοσελίδα. Θέτοντας την τιµή της παραµέτρου false, εάν η συνεδρία δεν υπάρχει, τότε συνεχίζει να µην υπάρχει, αφού δεν δηµιουργείται.

• Γραµµή 15: Με την κλήση request.getSession(true), εάν η συνεδρία δεν υπάρχει, τότε δηµιουργείται.

• Γραµµη 16: Πλέον έχει γίνει επίσκεψη, οπότε θέτουµε το χαρακτηριστικό (attribute) της συνεδρίας visited σε 1.

• Γραµµή 17: Στη συνεδρία αποθηκεύεται η τιµή «unipi», για το χαρακτηριστικό user.

• Γραµµή 18: Επιστρέφεται µε την απόκριση στο φυλλοµετρητή του πελάτη και το αναγνωριστικό της συνεδρίας.

• Γραµµή 26: Η τιµή του χαρακτηριστικού user της συνεδρίας που αναµένεται είναι unipi. Στην περίπτωση που δεν βρεθεί τέτοια τιµή, γίνεται επιστροφή από το servlet, εµφανίζοντας την σελίδα error.htlm.

Page 22: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

Σε περίπτωση «τρεξίµατος» του Servlet για πρώτη φορά, εµφανίζεται η σελίδα της Εικόνας 7.18.

Εικόνα 7.18 Η σελίδα σε περίπτωση εισόδου για πρώτη φορά.

Σε περίπτωση εκ νέου εισόδου, εµφανίζεται η σελίδα της Εικόνας 7.19.

Εικόνα 7.19 Η σελίδα σε περίπτωση εκ νέου εισόδου.

Στην ιστοσελίδα του Κεφαλαίου 7 του παρόντος συγγράµµατος, στον Ελληνικό Συσσωρευτή Ακαδηµαϊκών Ηλεκτρονικών Βιβλίων (http://repository.kallipos.gr), υπάρχει διαθέσιµο το βίντεο µε τίτλο video7.1_Servlets, στο οποίο εξηγείται η τεχνολογία των Servlet και δίνονται σχετικά παραδείγµατα.

7.6. Βασικά µειονεκτήµατα των Servlet Τα Java Servlets, παρότι είναι πολύ χρήσιµα σε αρκετές περιπτώσεις διαδικτυακού προγραµµατισµού, παρουσιάζουν µερικά πρακτικά προβλήµατα, που τα καθιστούν, ενδεχοµένως, µη βολικά για τον προγραµµατιστή. Συγκεκριµένα:

• Οι ιστοσελίδες έχουν εκατοντάδες γραµµές HTML και κώδικα JavaScript. Αυτό καθιστά εξαιρετικά άβολο τον προγραµµατισµό ενός Servlet, γιατί θα πρέπει να χρησιµοποιούνται συνεχώς µέθοδοι out.println().

• Είναι πολύ δύσκολη η σχεδίαση της ιστοσελίδας, διότι πρέπει να εµπλακούν αρκετά και διαφορετικά άτοµα. Ο κώδικας HTML γράφεται από το σχεδιαστή ιστοσελίδων (web designer), ενώ ο κώδικας Java από τον προγραµµατιστή.

• Κάθε φορά που γίνεται αλλαγή στο κοµµάτι της HTML, πρέπει ο κώδικας του Servlet να υφίσταται επαναµεταγλώττιση και ανασύνταξη.

• Χρειάζεται διαχωρισµός της σχεδίασης της ιστοσελίδας από την υλοποίηση της λογικής.

Τα Java Server Pages (JSP), τα οποία µελετώνται στο επόµενο κεφάλαιο, απαντούν στα παραπάνω µειονεκτήµατα των Servlets.[12] Αντί για κώδικα Java µε ενσωµατωµένη HTML, τα JSP ενσωµατώνουν κώδικα Java µέσα σε κώδικα HTML. Αυτό βοηθά στο διαχωρισµό της σχεδίασης από την υλοποίηση της λογικής. Τα Servlet κάνουν την επεξεργασία της αίτησης και τα JSP παίρνουν τα αποτελέσµατα και τα εµφανίζουν. Αυτό

Page 23: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

αποτρέπει τη συγγραφή δυσανάγνωστου και µακροσκελούς κώδικα, για την εµφάνιση της απόκρισης µέσα από τα Servlet, µε τη χρήση συνεχόµενων out.println().

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

[1] «Oracle Technology Network for Java Developers», διαθέσιµο στο http://www.oracle.com/technetwork/java/index.html (πρόσβαση: 25-6-2015).

[2] Ι.Χ. Παναγιωτόπουλος (2003), Διαδικτυακός προγραµµατισµός Java, Σταµούλης, Αθήνα.

[3] «Java Servlet Tutorial with Examples for Beginners», διαθέσιµο στο www.journaldev.com/1877/java-servlet-tutorial-with-examples-for-beginners (πρόσβαση: 25-6-2015).

[4] «Java Servlet Tutorial The ULTIMATE Guide», διαθέσιµο στο http://www.javacodegeeks.com/2014/12/java-servlet-tutorial.html (πρόσβαση: 25-6-2015).

[5] «What is a Servlet Container?», διαθέσιµο στο http://java.dzone.com/articles/what-servlet-container (πρόσβαση: 25-6-2015).

[6] «Java Application Servers», διαθέσιµο στο http://zetcode.com/tutorials/jeetutorials/javaservers/ (πρόσβαση: 25-6-2015).

[7] «Tomcat Servlet Container», διαθέσιµο στο http://tomcat.apache.org/ (πρόσβαση: 25-6-2015).

[8] «Java Servlet API Documentation», διαθέσιµο στο http://tomcat.apache.org/tomcat-5.5-doc/servletapi/ (πρόσβαση: 25-6-2015).

[9] J. Hunter και W. Crawford (2001), Java Servlet Programming (Java Series), O’Reilly.

[10] M. Hall και L. Brown (2007), Servlets και σελίδες διακοµιστή Java, Κλειδάριθµος.

[11] «Servlets Tutorial», διαθέσιµο στο http://www.tutorialspoint.com/servlets/index.htm (πρόσβαση: 25-6-2015).

[12] Η. Bergsten (2002), Java Server Pages, O’Reilly.

Κριτήρια αξιολόγησης Ερώτηση 1 Ποιο από τα παρακάτω δεν εµπεριέχεται σε µια αίτηση HTTP; Α) Δεδοµένα. Β) Πληροφορίες για τον εξυπηρετητή. Γ) Μέθοδος HTTP. Δ) Πληροφορίες για τον πελάτη. Ερώτηση 2 Ποιο από τα παρακάτω δεν εµπεριέχεται σε µια απόκριση HTTP; Α) Πληροφορίες για τον πελάτη. Β) Κωδικός κατάστασης. Γ) Δεδοµένα. Δ) Τύπος δεδοµένων. Ερώτηση 3

Page 24: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

Με τη µέθοδο POST οι παράµετροι µπαίνουν στο URL και υπάρχει περιορισµός στο µήκος. Α) Σωστό. Β) Λάθος. Ερώτηση 4 Ποιο από τα παρακάτω δεν ισχύει σχετικά µε τις δυναµικές ιστοσελίδες; Α) Ο πελάτης µπορεί να αλληλεπιδράσει µε το περιεχόµενο. Β) Διαθέτουν µη προκαθορισµένο περιεχόµενο. Γ) Το περιεχόµενο προσαρµόζεται ανάλογα µε τις αιτήσεις του πελάτη. Δ) Μόνο ο διαχειριστής µπορεί να αλλάξει το περιεχόµενο. Ερώτηση 5 Ποια από τα παρακάτω ισχύουν για ένα Servlet; Α) Στέλνει µόνο στατικές ιστοσελίδες στον πελάτη. Β) Έχει δυνατότητα καθαρισµού των δυναµικών δεδοµένων. Γ) Χρειάζεται µια βοηθητική εφαρµογή Java, για την επεξεργασία των αιτήσεων. Δ) Είναι ανεξάρτητο από κάποια βοηθητική εφαρµογή. Ερώτηση 6 Ποιο από τα παρακάτω δεν ισχύει για τους Servlet containers; Α) Προωθούν τις αιτήσεις από τον εξυπηρετητή στο Servlet. Β) Ελέγχουν την εκτέλεση του Servlet. Γ) Παρέχουν υπηρεσίες ασφαλείας. Δ) Διαθέτουν ολόκληρη την πλατφόρµα της Java. Ερώτηση 7 Ποια από τα παρακάτω ονόµατα διαθέτει ένα Servlet; Α) Container Name. Β) Relative Name. Γ) Path Name. Δ) URL. Ερώτηση 8 Ποια από τις παρακάτω δεν είναι µια συνήθης µέθοδος ενός HttpServlet; Α) getWriter(). Β) getOutputStream(). Γ) setContentType(). Δ) getLastModified(). Ερώτηση 9 Η µέθοδος getOutputStream() επιστρέφει ένα αντικείµενο PrinterWriter. Α) Σωστό. Β) Λάθος. Ερώτηση 10 Για το κλείσιµο της σύνδεσης µε µια βάση δεδοµένων, ποια µέθοδο των Servlet µπορούµε να χρησιµοποιήσουµε; Α) service(). Β) init(). Γ) destroy(). Δ) doPost(). Ερώτηση 11 Τα σενάρια CGI υπερτερούν των Servlet. Α) Σωστό.

Page 25: Κεφάλαιο 7 ΔΙΑΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ SERVLETS€¦ · SERVLETS Σύνοψη Σε αυτό το κεφάλαιο παρουσιάζεται η

Β) Λάθος. Ερώτηση 12 Ποιο είναι το µειονέκτηµα των Servlets; A) Δεν διαχωρίζουν τη σχεδίαση της ιστοσελίδας από την υλοποίηση της λογικής της εφαρµογής. Β) Χρησιµοποιούνται µαζί µε τα νήµατα. Γ) Χρησιµοποιούνται για αυθεντικοποίηση. Δ) Τρέχουν σε κάθε πλατφόρµα. Ερώτηση 13 Για να διαβάσουν την επικεφαλίδα του HTTP, ποια από τα παρακάτω χρησιµοποιούν τα Servlets; Α) HTTP.header. Β) HttpServletResponse. Γ) import javax.servlet.http.*;. Δ) HttpServletRequest.getHeaderName();. Ερώτηση 14 Για να εξεταστεί αν υπάρχει ενεργή συνεδρία και να δηµιουργηθεί, εάν δεν υπάρχει, ποια από τις παρακάτω µεθόδους καλείται; Α) request.getSession(). Β) active.getSession(). Γ) request.getSession(true). Δ) active.getSession(true).

Ερώτηση 15 Ποια από τις παρακάτω προτάσεις είναι σωστές; Α) Όταν γίνεται αλλαγή στον κώδικα τηςHTML, το Servlet δεν χρειάζεται επαναµεταγλώττιση. Β) Tα JSP ενσωµατώνουν κώδικα Java µέσα σε κώδικα HTML. Γ) Για τα Servlets, δεν χρειάζεται διαχωρισµός της σχεδίασης της ιστοσελίδας από την υλοποίηση της λογικής. Δ) Τα JSP δεν υπερτερούν των Servlets στη σχεδίαση µιας ιστοσελίδας. Κεφάλαιο 7

1. Β 2. Α 3. Β 4. Δ 5. Α και Γ 6. Δ 7. Α, Γ και Δ 8. Δ 9. Β 10. Γ 11. Β 12. A 13. Γ και Δ 14. Γ

15. B