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

Σχετικά έγγραφα
Περιγραφή της εργασίας

Εισαγωγή στις Σελίδες Εξυπηρετητή Java Java Server Pages (JSP)

Κατανεµηµένα Συστήµατα ΙΙ Μάθηµα Ελεύθερης Επιλογής, Εαρινού Εξαµήνου Τοµέας Εφαρµογών και Θεµελιώσεων

Java Servlets: Principles and Programming 1/19

Java & Java EE 3o Μέρος: Διασφάλιση ασφάλειας σε εφαρμογές Java Enterprise Edition. Κακαρόντζας Γεώργιος

Αντικειµενοστρεφής Προγραµµατισµός

NetBeans και σχετικά προγράμματα. Κακαρόντζας Γεώργιος Κέντρο Αριστείας Ανοιχτού Λογισμικού ΑΠΘ 1ο Θερινό Σχολείο Κώδικα

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

Αντικειμενοστρεφής Προγραμματισμός

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

2.1 Αντικειµενοστρεφής προγραµµατισµός

Διαδίκτυο και Εφαρμογές 2η Άσκηση Μετασχηματισμοί XML και XSL. Γιαννέλος Γιάννης ΑΜ: Μαρινέλλης Γιώργος ΑΜ:

Αντικειμενοστρεφής Προγραμματισμός

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 8 η Διάλεξη: Προγραμματισμός στην πλευρά του εξυπηρετητή: Τεχνολογία Java Server Pages (JSP)

Διαδικτυακές Εφαρμογές Ενότητα 5: Servlets και JSPs

Java & Java EE 1o Μέρος: Servlets και Java Server Pages. Κακαρόντζας Γεώργιος

Τεχνολογίες Διαδικτύου. Server Side Scripting I PHP

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

Web and HTTP. Βασικά Συστατικά: Web Server Web Browser HTTP Protocol

Γενικά (για τις γραπτές εξετάσεις)

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Cloud Computing Database with Amazon SimpleDB

1. Ξεκινώντας. 1.1 Τι είναι η Java. PDF created with FinePrint pdffactory Pro trial version

Εργαλεία του JDK. Β.1 Εργαλεία του JDK. Β.2 Μεταγλωττιστής javac. Τα πιο βασικά εργαλεία του JDK είναι τα παρακάτω.

Η Βίβλος σχετικά με το JDBC. Περιέχει τρία βασικά tutorials στα οποία θα βασιστεί το μάθημα και περιγράφει όλες τις τάξεις και τις μεθόδους που

Εργαλεία ανάπτυξης εφαρμογών internet Ι

Τεχνικός Εφαρμογών Πληροφορικής

ιαδικτυακές Εφαρµογές

Α. Ερωτήσεις Ανάπτυξης

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Προγραμματισμός στην πλευρά του εξυπηρετητή: Τεχνολογία Servlet

ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΑ ΕΡΓΑΛΕΙΑ ΓΙΑ ΤΟ ΔΙΑΔΙΚΤΥΟ

Κλάσεις και Αντικείµενα

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

Βασικές Έννοιες Web Εφαρμογών

Μέρος 3 ο : Βασικές Έννοιες για δυναμικές ιστοσελίδες

Παράρτημα A: PHP, HTML φόρμες και το πρωτόκολλο HTTP.

2. ΕΙΣΑΓΩΓΗ ΣΤΗΝ HTML ΓΙΩΡΓΟΣ ΓΙΑΝΝΑΚΑΚΗΣ, ΜΑΝΩΛΗΣ ΤΣΙΚΝΑΚΗΣ

Java Servlets. Εισαγωγή. Σταύρος Πολυβίου

Τα βασικά για Servlet

ΚΕΦΑΛΑΙΟ Web Services

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

Μαλούτα Θεανώ Σελίδα 1

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού

Δημιουργία μιας εφαρμογής Java με το NetBeans

ΟΔΗΓΟΣ ΧΡΗΣΗΣ(ΜΑΝUΑL) ΔΙΑΧΕΙΡΙΣΤΗ-ΧΡΗΣΤΗ.

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

ΠΕΡΙΕΧΟΜΕΝΑ. Πρόλογος Κεφάλαιο 1 ο Αρχές Διαχείρισης πληροφορίας στον Παγκόσμιο Ιστό... 15

Πτυχιακή εργασία. Ανάπτυξη παιχνιδιού πολλών παικτών

Εργαστήριο 6. Προγραμματιστικές Εφαρμογές στο Διαδίκτυο. Στόχος. Προετοιμασία περιβάλλοντος εργασίας. a) Εκκίνηση XAMPP

ίκτυα - Internet Υπηρεσίες Internet O Παγκόσµιος Ιστός (World Wide Web) Ηλεκτρονική Αλληλογραφία ( ) Υπηρεσία FTP (File Transfer Protocol)

Η Υλοποίηση της Επικοινωνίας. Κατανεµηµένα Συστήµατα

Διαδικτυακές Εφαρμογές Ενότητα 6: Servlets και JSPs (Παραδείγματα)

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

Remote Method Invocation (RMI)

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Ειδικά Θέματα Προγραμματισμού

ΠΡΩΤΟΚΟΛΟ HTTP ΕΝΤΟΛΩΝ ΔΙΑΣΥΝΔΕΣΗΣ ΕΚΔΟΣΗ 1.2

Περιεχόμενα. Πρόλογος... xiii

Συλλογή και Επεξεργασία Δεδομένων με Φόρμες

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Εφαρµογές διαδικτύου µε PHP

ΜΑΘΗΜΑ: Διαδικτυακές Εφαρμογές

Π17: Μορφοσυντακτικός και Σηµασιολογικός Σχολιαστής (λογισµικό)

HelloApplet. Παύλος Εφραιμίδης Java Applets 1

Βιοϊατρική τεχνολογία

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

Σύντομη παρουσίαση των εργαλείων/εντολών telnet, ping, traceroute nslookup και nmap, zenmap

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #1 ο : Εισαγωγή στο Περιβάλλον Ανάπτυξης (IDE)

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος

14. Δικτύωση με Java Δικτύωση με Java Sockets Δημιουργία της σύνδεσης Διευθυνσιοδότηση της σύνδεσης

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #1 ο : Εισαγωγή στο Περιβάλλον Ανάπτυξης (IDE)

Γιάννης Σαμωνάκης. 1 ο ΣΧΟΛΕΙΟ ΚΩΔΙΚΑ «Βασικά Θέματα Προγραμματισμού στην Ανάπτυξη Δυναμικών Διαδικτυακών Εφαρμογών» (Part 4 - PHP)

ΤΕΙ ΚΑΒΑΛΑΣ. Πτυχιακή εργασία ΕΙΣΑΓΩΓΗ. Μιλτιάδης Κακλαμάνης

Δυναμικές Ιστοσελίδες στο Πανελλήνιο Σχολικό Δίκτυο

Εργαστήριο Τεχνολογίας Λογισμικού και Ανάλυσης Συστημάτων

Η γλώσσα προγραμματισμού C

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Java & Java EE 2o Μέρος: Διασφάλιση ευκολίας τροποποίησης με το πρότυπο MVC (Model View Controller) Κακαρόντζας Γεώργιος

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΕΞΑΙΡΕΣΕΙΣ ΚΑΙ Ο ΧΕΙΡΙΣΜΟΣ ΤΟΥΣ

6. Εξαιρέσεις στη γλώσσα Java

Ειδικά Θέματα Προγραμματισμού

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Προβλήµατα CGI, SSI CGI: Απόδοση Έναρξη νέας διαδικασίας για εκτέλεση (2 διαδικασιών σε περίπτωση διερµηνευόµενης γλώσσας, π.χ. perl). Κοινές διαδικασ

Εισαγωγή στην Πληροφορική

ΚΑΤΑΝΕΜΗΜΕΝΟ ΣΥΣΤΗΜΑ ΔΙΑΧΕΙΡΙΣΗΣ ΣΥΣΚΕΥΩΝ ΑΣΗΜΑΚΟΠΟΥΛΟΣ ΣΩΤΗΡΗΣ ΑΜ : 3021

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

ΚΕΦΑΛΑΙΟ 6. Περιβάλλοντα Ανάπτυξης Εφαρμογών. ΚΕΦΑΛΑΙΟ 6 Περιβάλλοντα Ανάπτυξης Εφαρμογών. Α Γενικού Λυκείου

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

/software/web_tools/webapps/speller/.

Αντικειμενοστρεφής Προγραμματισμός

6.2 Υπηρεσίες Διαδικτύου

Χειρισµός Σφαλµάτων. Γρηγόρης Τσουµάκας. Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης. Έκδοση:

Τη φυσική (MAC) διεύθυνση που δίνει ο κατασκευαστής του δικτυακού υλικού στις συσκευές του (π.χ. στις κάρτες δικτύου). Η περιοχή διευθύνσεων που

Ειδικά Θέματα Προγραμματισμού

Transcript:

Κεφάλαιο 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). Αυτός ο ενδιάµεσος κώδικας είναι κοινός για όλες τις πλατφόρµες που δέχονται

προγράµµατα σε 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.

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, ασφαλείας ή σύνδεσης βάσεων δεδοµένων.

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 σε µια διαδικτυακή εφαρµογή.

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/.

αιτήσεων, όπως στη σύνδεση µε µια βάση δεδοµένων. Στον Κώδικα 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, όπως αυτός αναλύθηκε παραπάνω. Παρουσιάζονται η αρχικοποίησή του, η καταστροφή του, καθώς και η κλήση των διαφόρων µεθόδων.

Εικόνα 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 που κληρονοµεί την κλάση

HTTPServlet. Να σηµειωθεί ότι, λόγω της κλάσης HTTPServlet, δεν χρειάζεται να υπερφορτωθεί η µέθοδος service(), µια και υλοποιείται στην κλάση γονέας. Στη συνέχεια, στον Κώδικα 7.6, παρουσιάζεται ο ορισµός της doget() (γραµµή 6), η οποία δέχεται δύο ορίσµατα, ένα HttpServletRequest και ένα HttpServletResponse, και δεν επιστρέφει τίποτα, µια και ο τύπος επιστροφής είναι void. 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. } Κώδικας 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.

Κώδικας 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.

Εικόνα 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";

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.

http://localhost:8080/servletform/servletform?name=test1&surna me=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.*;

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.

Στη συνέχεια, παρέχονται επεξηγήσεις στα κυριότερα σηµεία του Κώδικα 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.

Εικόνα 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> </p> 25. </body> 26. </ html > Κώδικας 7.13. Παράδειγµα σελίδας σύνδεσης. Ο Κώδικας 7.12 είναι ένα παράδειγµα κλασικής υλοποίησης ιστοσελίδας για αυθεντικοποίηση ενός χρήστη µε τη χρήση HTML. Βλέπουµε ότι στον ορισµό της φόρµας καλούµε «action» το DBAccess, το οποίο είναι ένα Servlet που θα πραγµατοποιήσει την

πιστοποίηση των στοιχείων τα οποία εισάγει ο χρήστης. Η υλοποίησή του παρουσιάζεται στον Κώδικα 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.16 8.0.3:5432/etak_final", "etak_user", ""); 27. stmt = con.createstatement(); 28. if (username == null username.length() == 0) { 29. response.sendredirect(request.getcontextpath()+"/index.ht ml"); 30. return; 31. } 32. if (password==null password.length() == 0){ 33. response.sendredirect(request.getcontextpath()+"/index.ht ml");

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.

Γραµµή 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.

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

εγείρεται σε τέτοιου είδους ανταλλαγή πληροφοριών αφορά τον τρόπο µε τον οποίο ο εξυπηρετητής θα αναγνωρίσει ότι όλη αυτή η ακολουθία ιστοσελίδων και αιτήσεων προέρχεται από τον συγκεκριµένο πελάτη. Συνήθως, στην αρχή της σύνδεσής του µε τον εξυπηρετητή, ο πελάτης παίρνει ένα µοναδικό αναγνωριστικό (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>");

25. user = (String) session.getattribute("user"); 26. if (user == null!user.equals( unipi ) ) { 27. response.sendredirect(request.getcontextpath()+"/error.ht ml"); 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.

Σε περίπτωση «τρεξίµατος» του 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 παίρνουν τα αποτελέσµατα και τα εµφανίζουν. Αυτό

αποτρέπει τη συγγραφή δυσανάγνωστου και µακροσκελούς κώδικα, για την εµφάνιση της απόκρισης µέσα από τα 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

Με τη µέθοδο 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. Α) Σωστό.

Β) Λάθος. Ερώτηση 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