Περιεχόμενα ΕΥΧΑΡΙΣΤΙΕΣ... 23 ΕΙΣΑΓΩΓΗ... 25. Σχετικά με τους συγγραφείς...24



Σχετικά έγγραφα
ΜΕΤΑΒΟΛΕΣ ΔΙΑΤΡΟΦΙΚΩΝ ΣΥΝΗΘΕΙΩΝ ΛΟΓΩ ΟΙΚΟΝΟΜΙΚΗΣ ΚΡΙΣΗΣ ΣΕ ΑΓΡΟΤΙΚΟ ΠΛΗΘΥΣΜΟ ΤΩΝ ΤΡΙΚΑΛΩΝ

ΚΕΦ. 1 Η ΛΟΓΙΣΤΙΚΗ ΚΑΙ Η ΣΗΜΑΣΙΑ ΤΗΣ ΣΤΙΣ ΕΠΙΧΕΙΡΗΣΕΙΣ

Αρωματικά φυτά της Ελλάδας

Χημεία Β Γυμνασίου Τμήμα Β3. Γρηγόρης Μαγουλάς Φανή Μανούσου Κύρος Μαλλαμίδης Ελίνα Μάλλιαρη Μάγδα Μαντά

Πρακτικό εργαλείο. για την ταυτοποίηση πρώτου επιπέδου των θυμάτων παράνομης διακίνησης και εμπορίας. τη σεξουαλική εκμετάλλευση

Κατερίνα Παναγοπούλου: Δημιουργώντας κοινωνικό κεφάλαιο την εποχή της κρίσης

Καλές Πρακτικές Πρόληψης και Αντιμετώπισης Ενδοσχολικής Βίας- Σχολική Διαμεσολάβηση

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

ΜΟΥΣΕΙΟ ΚΑΠΝΟΥ ΚΑΒΑΛΑΣ ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ

8 Μάρτη. Η βία κατά των γυναικών

Τοποθέτηση Δημάρχου Γ. Πατούλη. για τεχνικό πρόγραμμα 2010

Δρ.ΠΟΛΥΚΑΡΠΟΣ ΕΥΡΙΠΙΔΟΥ

Σοφία Γιουρούκου, Ψυχολόγος Συνθετική Ψυχοθεραπεύτρια

Συνοπτική Παρουσίαση. Ελλάδα

Ασυντήρητες και επικίνδυνες οικοδομές

Μαρία-Στεφανία-Γιάννης 1 ο Πρότυπο Πειραματικό Δημοτικό Σχολείο Θεσσαλονίκης Ε2 Π.Τ.Δ.Ε.-Α.Π.Θ

Στις 22 Σεπτεμβρίου 1937, περί την δεκάτην πρωινήν, ο διευθυντής του ξενοδοχείου «Κεντρικόν» στην Κόρινθο χτύπησε την πόρτα του δωματίου όπου την

Καθηγητές στο μικροσκόπιο, ιδιώτες στην έρευνα. Ο νέος νόμος-πλαίσιο για τα πανεπιστήμια. Εφημερίδα: ΤΟ ΒΗΜΑ Ρεπορτάζ: ΜΑΡΝΥ ΠΑΠΑΜΑΤΘΑΙΟΥ

Οι ιοί και οι ιογενείς λοιμώξεις του αναπνευστικού συστήματος στα παιδιά

Λίγα λόγια από το συγγραφέα Microsoft Excel Η δομή ενός φύλλου εργασίας... 21

ΚΕΦΑΛΑΙΟ 3 ο ΤΟ ΜΕΛΛΟΝ ΤΗΣ ΕΥΡΩΠΑΪΚΗΣ ΕΝΩΣΗΣ. 3.1 Εισαγωγή

Το ολοκαύτωμα της Κάσου

ΔΗΜΗΤΡΑ ΠΑΠΑΖΩΤΟΥ ΧΡΥΣΑΝΘΗ-ΣΟΦΙΑ ΠΛΑΚΑ ΑΝΤΙΓΟΝΗ ΤΣΑΡΑ

ΔΙΑΔΟΣΗ ΘΕΡΜΟΤΗΤΑΣ Φυσική Β' Γυμνασίου. Επιμέλεια: Ιωάννης Γιαμνιαδάκης

KATATAΞH APΘPΩN. 6. Αρχές της προσφοράς και προμήθειας, ανθρώπινων ιστών και/ ή κυττάρων

Οι υψηλότερες βαθμολογίες πρόσβασης των μαθητών μας ανά μάθημα

ΑΝΑΚΥΚΛΩΣΗ ΤΗΓΑΝΕΛΑΙΟΥ ΓΙΑΤΙ - ΠΩΣ - ΠΟΤΕ

Ατομικό ιστορικό νηπίου

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

ΠΡΟΒΛΗΜΑΤΑ ΤΗΣ ΔΗΜΟΣΙΑΣ ΖΩΗΣ, ΜΙΑ ΨΥΧΑΝΑΛΥΤΙΚΗ ΠΡΟΣΕΓΓΙΣΗ

Kεντρικός συντονισμός πολιτικών, μόνιμοι υφυπουργοί, μείωση ειδικών συμβούλων, κατάργηση αναπληρωτών.

Εργαστηριακή εξάσκηση στις διαταραχές της κίνησης και της οπτικής αντίληψης. Διδάσκων :Α.Β.Καραπέτσας

θεωρητική και εθνογραφική τεκμηρίωση ορίων και σχέσεων των μουσικών δικτύων του σύγχρονου πανηγυριού

ΑΝΑΔΟΧΟΣ: Τ.Ε.Ι. ΚΑΒΑΛΑΣ. 1º ΠΑΡΑΔΟΤΕΟ (τροποποιημένο)

Ιστορία του Αραβοϊσλαμικού Πολιτισμού

Από το ξεκίνημά του ο ΤΙΤΑΝ εκφράζει

Υποψήφιοι Σχολικοί Σύμβουλοι

ΕΘΙΜΑ ΤΟΥ ΚΟΣΜΟΥ. Αγγελική Περιστέρη Α 2

ΚΥΚΛΟΦΟΡΙΚΟΣΥΣΤΗΜΑ. Καρβουντζή Ηλιάνα Βιολόγος

Ποσοστό εκπτώσεων τη χειμερινή εκπτωτική περίοδο του 2015

ΠΕΡΙΕΧΟΜΕΝΑ ΕΙΣΑΓΩΓΙΚΟ ΣΗΜΕΙΩΜΑ 13 Α' ΜΕΡΟΣ ΑΠΟ ΤΟΝ ΠΟΛΕΜΟ ΤΟΥ 1897 ΣΤΟ ΓΟΥΔΙ

...ακολουθώντας τη ροή... ένα ημερολόγιο εμψύχωσης

1. Κώστα Κυριλή 2. Εμμανουέλα Μπουγά 3. Πόπη Δόγα. Η Επιτροπή, αφού έλαβε υπόψη:

Το Ευρωπαϊκό Κοινοβούλιο αποτελεί την άμεσα εκλεγμένη δημοκρατική έκφραση της πολιτικής βούλησης των λαών της Ευρώπης.

Προδημοσιεύτηκαν τα τέσσερις πρώτα προγράμματα του νέου ΕΣΠΑ που αφορούν

Οι Πνευματικές Δυνάμεις στο Σύμπαν

Σε ποιες κατηγορίες μειώνεται η σύνταξη από 1/1/2009 (σε εφαρμογή του Ν.3655/2008)

Βουλευτικές Εκλογές 2011

ΚΩ ΙΚΑΣ ΕΟΝΤΟΛΟΓΙΑΣ ΤΗΣ ΕΤΑΙΡΕΙΑΣ ΜΕ ΤΗΝ ΕΠΩΝΥΜΙΑ «ΠΑΠΟΥΤΣΑΝΗΣ ΑΝΩΝΥΜΗ ΒΙΟΜΗΧΑΝΙΚΗ ΚΑΙ ΕΜΠΟΡΙΚΗ ΕΤΑΙΡΕΙΑ ΚΑΤΑΝΑΛΩΤΙΚΩΝ ΑΓΑΘΩΝ»

Θεµατικές ενότητες: παρεµβάσεις και ενδεικτικές υποθέσεις. 1. Οικονοµική πολιτική. Παρεµβάσεις οικονοµικού χαρακτήρα

Ένας περίπατος στη Μονή Καισαριανής

ΜΗΝΙΑΙΟ ΕΛΤΙΟ ΙΟΥΝΙΟΥ 2007

Συνωμοσία Πυρήνων της Φωτιάς - Πυρήνας Αντάρτικου Πόλης

Α. ΟΡΓΑΝΑ ΣΧΕΔΙΑΣΜΟΥ ΚΑΙ ΕΦΑΡΜΟΓΗΣ

Υπάρχουν κάποιες στιγμές στην Ιστορία όπου φαίνεται πως οι άνθρωποι σε όλο

Οι 21 όροι του Λένιν

ΦΥΣΙΚΗ ΚΑΤΑΣΤΑΣΗ. Βασίλης Γιωργαλλάς Καθηγητής Φυσικής Αγωγής

ΚΕΦΑΛΑΙΟ Α.2 ΑΝΑΠΤΥΞΙΑΚΗ ΦΥΣΙΟΓΝΩΜΙΑ ΤΟΥ ΔΗΜΟΥ ΑΜΑΛΙΑΔΑΣ

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

ΘΡΗΣΚΕΥΤΙΚΑ ΓΥΜΝΑΣΙΟΥ

ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙ ΕΥΤΙΚΟ Ι ΡΥΜΑ ΚΡΗΤΗΣ ΣΧΟΛΗ ΙΟΙΚΗΣΗΣ ΟΙΚΟΝΟΜΙΑΣ ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ

Ομιλία του Υφυπουργού Ανάπτυξης κου Θανάση Σκορδά στο CapitalVision 2012

Μέθοδοι διαχωρισμού των συστατικών ενός ετερογενούς μείγματος

*Απόσπασμα από το βιβλίο των Σέργιου Δημητριάδη και Αλεξίας Μ. Τζωρτζάκη, ΜΑΡΚΕΤΙΝΓΚ, Αρχές, Στρατηγικές, Εφαρμογές, εκδόσεις Rosili, Αθήνα, 2010.

ΣΥΝΕΝΤΕΥΞΗ ΣΤΗΝ ΕΦΗΜΕΡΙΔΑ «ΚΡΗΤΙΚΗ ΕΝΗΜΕΡΩΣΗ» ΝΟΕΜΒΡΙΟΣ 2005

Ο αρτινός συγγραφέας Γιάννης Καλπούζος, μιλάει στην «Γ», με την ευκαιρία της έκδοσης του νέου του βιβλίου

Ευρετήριο πινάκων. Ασκήσεις και υπομνήματα

ΕΝΤΟΛΕΑΣ: ΕΞΕΤΑΖΟΜΕΝΟΣ ΠΛΗΘΥΣΜΟΣ:

Δαλιάνη Δήμητρα Λίζας Δημήτρης Μπακομήτρου Ελευθερία Ντουφεξιάδης Βαγγέλης

Όταν το μάθημα της πληροφορικής γίνεται ανθρωποκεντρικό μπορεί να αφορά και την εφηβεία.

«ΝΕΟΙ ΚΑΙ ΑΝΑΖΗΤΗΣΗ ΕΡΓΑΣΙΑΣ ΣΤΗΝ ΕΛΛΑΔΑ ΚΑΙ ΣΤΟ ΕΞΩΤΕΡΙΚΟ»

Η Ψυχοπαθολογία του Πολιτικού Του Φ.Μωρόγιαννη *

ΔΕΛΤΙΟ ΤΥΠΟΥ. Ελλείψεις στο φορολογικό νομοσχέδιο. Σοβαρές ελλείψεις στη νέα μορφή του φορολογικού νομοσχεδίου

Έλλειψη εσωτερικής ελευθερίας

109(Ι)/2014 ΝΟΜΟΣ ΠΟΥ ΠΡΟΝΟΕΙ ΓΙΑ ΤΟ ΕΛΑΧΙΣΤΟ ΕΓΓΥΗΜΕΝΟ ΕΙΣΟΔΗΜΑ ΚΑΙ ΓΕΝΙΚΟΤΕΡΑ ΠΕΡΙ ΚΟΙΝΩΝΙΚΩΝ ΠΑΡΟΧΩΝ ΤΟΥ 2014 ΚΑΤΑΤΑΞΗ ΑΡΘΡΩΝ

ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ 4. Δημιουργήθηκε από τη Μαρία Καλαματιανού Ιανουάριος 2012.

ΕΝΗΜΕΡΩΤΙΚΟ ΈΓΓΡΑΦΟ Σ.Ε.Ε.Δ.Δ.Ε. ΟΙ ΕΠΙΒΑΡΥΝΣΕΙΣ ΤΟΥ ΝΕΟΥ ΦΟΡΟΛΟΓΙΚΟΥ

ΗΛΙΟΠΡΟΣΤΑΣΙΑ ΑΥΤΟΣΚΙΑΣΜΟΣ ΤΟΥ ΚΤΗΡΙΑΚΟΥ ΚΕΛΥΦΟΥΣ

ΜΕ ΤΗ ΔΙΚΗ ΜΟΥ ΒΟΗΘΕΙΑ, ΤΟΥ ΑΥΤΟΚΡΑΤΟΡΙΚΟΥ ΚΗΠΟΥΡΟΥ ΔΗΛΑΔΗ, ΘΑ ΤΑ ΚΑΛΛΙΕΡΓΗΣΕΤΕ...

ΠΡΟΣΩ ΟΛΟΤΑΧΩΣ! ΑΝΑΓΕΝΝΗΣΗ ΤΗΣ ΕΛΛΑΔΑΣ

Τα αποτελέσματα εκτέλεσης του προϋπολογισμού, τα ταμειακά διαθέσιμα, η άγνοια και η σκοπιμότητα.

ΠΕΡΙΦΕΡΕΙΑΚΗ ΕΝΟΤΗΤΑ ΚΟΖΑΝΗΣ

ΤΕΙ ΚΑΛΑΜΑΤΑΣ. ΑΡΓΥΡΗ ΔΗΜΗΤΡΑ Σχολής Διοίκησης και Οικονομίας Τμήμα Χρηματοοικονομικής και Ελεγκτικής Επιστήμης Εισηγητής :Λυγγίτσος Αλέξανδρος

289 ον Σύστημα Αεροπροσκόπων Αγίας Φύλας ΟΜΑΔΑ ΠΡΟΣΚΟΠΩΝ ΕΓΧΕΙΡΙΔΙΟ ΧΑΛΚΙΝΟΥ ΤΡΙΦΥΛΛΟΥ

Συνέντευξη με την συγγραφέα Μαριλίτα Χατζημποντόζη!

ΕΡΓΑΣΙΑ ΤΕΧΝΟΛΟΓΙΑΣ «ΚΑΤΟΙΚΙΔΙΑ ΖΩΑ»

6 η Ενότητα Στρατηγική σε επιχειρηματικό επίπεδο

ΘΕΣΕΙΣ ΠΡΟΤΑΣΕΙΣ ΠΡΟΤΕΡΑΙΟΤΗΤΕΣ

237 Χημικών Μηχανικών Θεσσαλονίκης

ΧΡΙΣΤΟΣ ΑΠ. ΛΑΔΙΑΣ

ΣΥΖΗΤΗΣΗ ΝΟΜΟΣΧΕΔΙΟΥ ΥΠ.ΓΕΩΡΓΙΑΣ

Τζων Λοκ ( ) (Άγγλος φιλόσοφος) Ο κύριος εκπρόσωπος της Εμπειριοκρατίας ηγέτης του Αγγλικού Διαφωτισμού.

ΒΥΖΑΝΤΙΝΗ ΕΙΚΟΝΑ: ΠΗΓΕΣ ΚΑΙ ΕΙΔΗ. Βλαχοπούλου Εβίτα Κωστελένου Ιωάννα Λαμπίρη Νικολέττα Μπόλλα Βασιλική

ΝΕΑ ΧΡΗΜΑΤΟΟΙΚΟΝΟΜΙΚΑ ΠΡΟΪΟΝΤΑ- ΕΦΑΡΜΟΓΗ ΣΕ ΑΣΦΑΛΙΣΤΙΚΗ ΕΠΙΧΕΙΡΗΣΗ

ΧΙΙΙ Επιτροπή Εκπαιδευτικής Υπηρεσίας

323 Φυτικής Παραγωγής Γεωπονικού Παν. Αθήνας

Ο αθλητισμός εμπνέεται από την ειρήνη. Η ειρήνη εμπνέεται από τον αθλητισμό.

Τίτλος Ειδικού Θεματικού Προγράμματος: «Διοίκηση, Οργάνωση και Πληροφορική για Μικρο-μεσαίες Επιχειρήσεις»

Σεμινάριο με θέμα : Εθελοντισμός & Δικαιώματα Παιδιού

ΑΒΒΑΣ ΚΑΣΣΙΑΝΟΣ, ΜΙΑ ΑΓΝΩΣΤΗ ΠΑΤΕΡΙΚΗ ΜΟΡΦΗ ΤΗΣ ΦΙΛΟΚΑΛΙΑΣ ΚΑΙ Η ΔΙΔΑΣΚΑΛΙΑ ΤΟΥ ΓΙΑ ΤΗΝ ΚΑΤΑΠΟΛΕΜΗΣΗ ΤΩΝ ΘΑΝΑΣΙΜΩΝ ΠΑΘΩΝ

Transcript:

Περιεχόμενα ΕΥΧΑΡΙΣΤΙΕΣ... 23 Σχετικά με τους συγγραφείς...24 ΕΙΣΑΓΩΓΗ... 25 Ποιοι πρέπει να διαβάσουν το βιβλίο...27 More Servlets and JavaServer Pages...27 Στοιχεία που κάνουν το βιβλίο αυτό να ξεχωρίζει...28 Ολοκληρωμένη κάλυψη των μικροϋπηρεσιών και των σελίδων JSP...28 Πραγματικός κώδικας...29 Βήμα προς βήμα οδηγίες...29 Λεπτομέρειες διευθέτησης και χρήσης διακομιστών...29 Στρατηγικές σχεδιασμού...30 Πώς είναι οργανωμένο το βιβλίο...30 Μέρος Ι: Τεχνολογία εφαρμογών διακομιστή...30 Μέρος II: Τεχνολογία JSP...31 Μέρος III: Τεχνολογίες υποστήριξης...32 Συμβάσεις...32 Σχετικά με την τοποθεσία Ιστού...33 Σχετικά με τις εκπαιδευτικές σειρές μαθημάτων...34

6 6 Περιεχόμενα ΚΕΦΑΛΑΙΟ 1 ΕΠΙΣΚΟΠΗΣΗ ΤΗΣ ΤΕΧΝΟΛΟΓΙΑΣ ΜΙΚΡΟΫΠΗΡΕΣΙΩΝ ΚΑΙ JSP... 36 1.1 Η δουλειά μιας μικροϋπηρεσίας...37 1.2 Γιατί να δομούνται δυναμικά οι ιστοσελίδες;...39 1.3 Μια σύντομη ματιά στον κώδικα των μικροϋπηρεσιών...40 1.4 Πλεονεκτήματα των μικροϋπηρεσιών σε σχέση με τις παραδοσιακές σελίδες CGI...42 Αποτελεσματικότητα...42 Ευκολία...42 Ισχύς...43 Φορητότητα...43 Μικρό κόστος...43 Ασφάλεια...44 Κύρια τάση...45 1.5 Ο ρόλος των σελίδων JSP...45 ΜΕΡΟΣ I ΤΕΧΝΟΛΟΓΙΑ SERVLET... 48 ΚΕΦΑΛΑΙΟ 2 ΕΓΚΑΤΑΣΤΑΣΗ ΚΑΙ ΔΙΕΥΘΕΤΗΣΗ ΔΙΑΚΟΜΙΣΤΗ... 50 2.1 Κατέβασμα και εγκατάσταση του πακέτου ανάπτυξης λογισμικού (SDK) Java...52 2.2 Κατέβασμα ενός διακομιστή για τον υπολογιστή σας...54 2.3 Διευθέτηση του διακομιστή...57 2.4 Διευθέτηση του Apache Tomcat...58 Ορισμός της μεταβλητής JAVA_HOME...59 Καθορισμός της θύρας διακομιστή...60 Ενεργοποίηση της επαναφόρτωσης μικροϋπηρεσιών...61 Ενεργοποίηση του πλαισίου αναφοράς ROOT...62 Ενεργοποίηση της κλήσης μικροϋπηρεσιών...62 Αύξηση των ορίων μνήμης του DOS...63

Περιεχόμενα 7 7 Ορισμός της μεταβλητής CATALINA_HOME...63 Έλεγχος της βασικής εγκατάστασης του διακομιστή...63 2.5 Διευθέτηση του Macromedia JRun...64 Ο σειριακός αριθμός του JRun...65 Περιορισμοί χρήστη του JRun...65 Η θέση εγκατάστασης της Java...66 Η θέση εγκατάστασης του διακομιστή...66 Το όνομα χρήστη και ο κωδικός πρόσβασης του διαχειριστή...66 Η δυνατότητα αυτόματης εκκίνησης...67 Η θύρα διακομιστή...68 Έλεγχος της βασικής εγκατάστασης του διακομιστή...69 2.6 Διευθέτηση του Caucho Resin...70 Ορισμός της μεταβλητής JAVA_HOME...70 Ορισμός της θύρας του Resin...70 Έλεγχος της βασικής εγκατάστασης του διακομιστή...70 2.7 Διαμόρφωση του δικού σας περιβάλλοντος ανάπτυξης...71 Δημιουργία καταλόγου ανάπτυξης...72 Ορισμός της CLASSPATH...72 Δημιουργία συντομεύσεων για την εκκίνηση και τον τερματισμό του διακομιστή...74 Δημιουργία σελιδοδείκτη ή εγκατάσταση της τεκμηρίωσης της API για μικροϋπηρεσίες και σελίδες JSP...75 2.8 Έλεγχος της εγκατάστασής σας...76 Επαλήθευση της εγκατάστασης του SDK...77 Έλεγχος της βασικής διευθέτησης του διακομιστή...77 Μεταγλώττιση και εκδίπλωση μερικών απλών μικροϋπηρεσιών...79 2.9 Δημιουργία μιας απλοποιημένης μεθόδου εκδίπλωσης...86 Αντιγραφή σε συντόμευση ή συμβολικό σύνδεσμο...87 Χρήση της επιλογής -d του javac...88 Ανάληψη της φροντίδας εκδίπλωσης από το IDE...88 Χρήση του ant ή κάποιου παρόμοιου εργαλείου...89 2.10 Κατάλογοι εκδίπλωσης για την προεπιλεγμένη εφαρμογή Ιστού: Περίληψη...89 Tomcat...90 JRun...91 Resin...92

8 8 Περιεχόμενα 2.11 Εφαρμογές Ιστού: Μια προεπισκόπηση...92 Δημιουργία ενός καταλόγου εφαρμογής Ιστού...94 Ενημέρωση της μεταβλητής CLASSPATH...95 Καταχώριση της εφαρμογής Ιστού στο διακομιστή...95 Χρήση του προθέματος URL...96 Εκχώρηση προσαρμοσμένων URL στις μικροϋπηρεσίες σας...99 ΚΕΦΑΛΑΙΟ 3 ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΜΙΚΡΟΫΠΗΡΕΣΙΩΝ... 104 3.1 Βασική δομή μικροϋπηρεσιών...107 3.2 Μικροϋπηρεσία που παράγει μόνο κείμενο...108 3.3 Μικροϋπηρεσία που παράγει κώδικα HTML...110 3.4 Πακετάρισμα μικροϋπηρεσιών...112 3.5 Απλές βοηθητικές κλάσεις δόμησης κώδικα HTML...114 3.6 Ο κύκλος ζωής μιας μικροϋπηρεσίας...117 Η μέθοδος service...117 Οι μέθοδοι doget, dopost, και doxxx...118 Η μέθοδος init...119 Η μέθοδος destroy...125 3.7 Η διασύνδεση SingleThreadModel...126 3.8 Αποσφαλμάτωση μικροϋπηρεσιών...130 ΚΕΦΑΛΑΙΟ 4 ΧΕΙΡΙΣΜΟΣ ΑΙΤΗΣΕΩΝ ΠΕΛΑΤΗ: ΔΕΔΟΜΕΝΑ ΦΟΡΜΑΣ... 134 4.1 Ο ρόλος των δεδομένων φόρμας...135 4.2 Ανάγνωση δεδομένων φορμών από μικροϋπηρεσίες...137 Ανάγνωση μιας τιμής: getparameter...137 Ανάγνωση πολλών τιμών: getparametervalues...138 Αναζήτηση ονομάτων παραμέτρων: getparameternames και getparametermap...138

Περιεχόμενα 9 9 Ανάγνωση ανεπεξέργαστων δεδομένων φορμών και συντακτική ανάλυση αρχείων που φορτώνονται στο διακομιστή: getreader και getinputstream...139 Ανάγνωση εισόδου για περισσότερα από ένα σύνολα χαρακτήρων: setcharacterencoding...140 4.3 Παράδειγμα: Ανάγνωση τριών παραμέτρων...141 4.4 Παράδειγμα: Ανάγνωση όλων των παραμέτρων...144 4.5 Χρήση προεπιλεγμένων τιμών για ελλιπείς ή εσφαλμένες παραμέτρους...148 4.6 Φιλτράρισμα αλφαριθμητικών για ειδικούς χαρακτήρες HTML...159 Κώδικας φιλτραρίσματος...160 Παράδειγμα: Μικροϋπηρεσία που εμφανίζει αποσπάσματα κώδικα...162 4.7 Αυτόματη συμπλήρωση αντικειμένων Java: Κόκκοι φόρμας...166 Χρήση της κλάσης BeanUtilities...169 Λήψη και εγκατάσταση των πακέτων Jakarta Commons...173 4.8 Επανεμφάνιση της φόρμας εισόδου για διόρθωση παραμέτρων...174 Επιλογές επανεμφάνισης...174 Μικροϋπηρεσία που επεξεργάζεται προσφορές δημοπρασίας...176 ΚΕΦΑΛΑΙΟ 5 ΧΕΙΡΙΣΜΟΣ ΤΗΣ ΑΙΤΗΣΗΣ ΠΕΛΑΤΗ: ΚΕΦΑΛΙΔΕΣ ΑΙΤΗΣΗΣ HTTP... 184 5.1 Ανάγνωση κεφαλίδων αίτησης...186 5.2 Δημιουργία πίνακα με όλες τις κεφαλίδες αίτησης...188 5.3 Κατανόηση των κεφαλίδων αίτησης HTTP 1.1...190 5.4 Αποστολή συμπιεσμένων ιστοσελίδων...195 5.5 Διάκριση μεταξύ διαφόρων τύπων φυλλομετρητών...199 5.6 Αλλαγή της σελίδας ανάλογα με τον τρόπο μετάβασης του χρήστη σε αυτή...202 5.7 Προσπέλαση των τυπικών μεταβλητών CGI...205 Ισοδύναμες μικροϋπηρεσίες για μεταβλητές CGI...206 Μικροϋπηρεσία που παρουσιάζει τις μεταβλητές CGI...209

10 10 10 Περιεχόμενα ΚΕΦΑΛΑΙΟ 6 ΔΗΜΙΟΥΡΓΙΑ ΑΠΑΝΤΗΣΗΣ ΔΙΑΚΟΜΙΣΤΗ: ΚΩΔΙΚΟΙ ΚΑΤΑΣΤΑΣΗΣ HTTP... 212 6.1 Καθορισμός των κωδικών κατάστασης...214 Καθορισμός κωδικού κατάστασης: setstatus...214 Καθορισμός των κωδικών κατάστασης 302 και 404: sendredirect και senderror...215 6.2 Κωδικοί κατάστασης HTTP 1.1...216 6.3 Ανακατεύθυνση χρηστών σε διαφορετικές σελίδες για κάθε διακομιστή...223 6.4 Εμπροσθοφυλακή για διάφορες μηχανές αναζήτησης...224 ΚΕΦΑΛΑΙΟ 7 ΔΗΜΙΟΥΡΓΙΑ ΑΠΑΝΤΗΣΗΣ ΔΙΑΚΟΜΙΣΤΗ: ΚΕΦΑΛΙΔΕΣ ΑΠΑΝΤΗΣΗΣ HTTP... 232 7.1 Καθορισμός των κεφαλίδων απάντησης από μικροϋπηρεσίες...234 7.2 Κατανόηση των κεφαλίδων απάντησης του πρωτοκόλλου HTTP 1.1...235 7.3 Δόμηση φύλλων εργασιών Excel...242 7.4 Διατηρούμενη κατάσταση και αυτόματη επαναφόρτωση σελίδων...244 Εύρεση πρώτων αριθμών για χρήση στην κρυπτογράφηση με δημόσιο κλειδί...245 7.5 Χρήση μικροϋπηρεσιών για την παραγωγή εικόνων JPEG...256 ΚΕΦΑΛΑΙΟ 8 ΧΕΙΡΙΣΜΟΣ ΜΠΙΣΚΟΤΩΝ... 266 8.1 Οφέλη των μπισκότων...267 Αναγνώριση του χρήστη κατά τη διάρκεια μιας εμπορικής συναλλαγής...268 Απομνημόνευση ονομάτων χρηστών και κωδικών πρόσβασης...268 Προσαρμογή τοποθεσιών...269 Εστιασμένη διαφήμιση...269 8.2 Μερικά προβλήματα με τα μπισκότα...270 8.3 Διαγραφή μπισκότων...273

Περιεχόμενα 11 8.4 Αποστολή και λήψη μπισκότων...274 Αποστολή μπισκότων στον πελάτη...275 Ανάγνωση μπισκότων από τον πελάτη...277 8.5 Χρήση μπισκότων για την ανίχνευση νέων επισκεπτών...278 8.6 Χρήση ιδιοτήτων μπισκότου...280 8.7 Μπισκότα συνεδρίας και διατηρούμενα μπισκότα...283 8.8 Βασικά βοηθήματα μπισκότων...287 Εύρεση μπισκότων με συγκεκριμένα ονόματα...287 Δημιουργία μπισκότων με μεγάλη διάρκεια ζωής...288 8.9 Χρήση των βοηθημάτων για μπισκότα...289 8.10 Τροποποίηση μπισκότων: Παρακολούθηση του αριθμού επισκέψεων...291 8.11 Χρήση μπισκότων για απομνημόνευση των προτιμήσεων των χρηστών...293 ΚΕΦΑΛΑΙΟ 9 ΠΑΡΑΚΟΛΟΥΘΗΣΗ ΣΥΝΕΔΡΙΑΣ... 300 9.1 Η ανάγκη της παρακολούθησης συνεδριών...301 Μπισκότα...302 Επανεγγραφή των URL...302 Κρυφά πεδία φόρμας...303 Παρακολούθηση συνεδριών στις μικροϋπηρεσίες...303 9.2 Βασικά στοιχεία της παρακολούθησης συνεδριών...304 Προσπέλαση του αντικειμένου συνεδρίας που σχετίζεται με την τρέχουσα αίτηση...304 Αναζήτηση πληροφοριών που σχετίζονται με μια συνεδρία...305 Συσχετισμός πληροφοριών με μια συνεδρία...306 Απόρριψη δεδομένων συνεδρίας...307 9.3 Η API παρακολούθησης συνεδριών...307 9.4 Σύγκριση συνεδριών φυλλομετρητή και συνεδριών διακομιστή...310 9.5 Κωδικοποίηση URL που στάλθηκαν στο χρήστη...311 9.6 Μια μικροϋπηρεσία που παρουσιάζει τις επισκέψεις ανά πελάτη...312 9.7 Συγκέντρωση ενός καταλόγου με δεδομένα χρηστών...315

12 12 12 Περιεχόμενα 9.8 Ηλεκτρονικό κατάστημα με καλάθι αγορών και παρακολούθηση συνεδρίας...319 Δημιουργία της εμπροσθοφυλακής...320 Χειρισμός παραγγελιών...324 Στα παρασκήνια: Υλοποίηση του καλαθιού αγορών και του καταλόγου ειδών...330 ΜΕΡΟΣ II ΤΕΧΝΟΛΟΓΙΑ JSP... 338 ΚΕΦΑΛΑΙΟ 10 ΕΠΙΣΚΟΠΗΣΗ ΤΗΣ ΤΕΧΝΟΛΟΓΙΑΣ JSP... 340 10.1 Η ανάγκη για την τεχνολογία JSP...342 10.2 Οφέλη της τεχνολογίας JSP...343 10.3 Πλεονεκτήματα της JSP σε σχέση με ανταγωνιστικές τεχνολογίες...344 Σύγκριση με τις τεχνολογίες.net και ASP (Active Server Pages)...345 Σύγκριση με την PHP...345 Σύγκριση με τις αμιγείς μικροϋπηρεσίες...346 Σύγκριση με την JavaScript...346 Σύγκριση με τη WebMacro ή τη Velocity...347 10.4 Παρανοήσεις σχετικά με την τεχνολογία JSP...347 Πολλοί ξεχνούν ότι η JSP είναι τεχνολογία για το διακομιστή...348 Σύγχυση μεταξύ του χρόνου μετάφρασης και του χρόνου αίτησης...349 Θεώρηση ότι η JSP είναι από μόνη της αρκετή...350 Θεώρηση ότι μόνο οι μικροϋπηρεσίες είναι αρκετές...350 10.5 Εγκατάσταση των σελίδων JSP...351 Κατάλογοι JSP για τον Tomcat (Προεπιλεγμένη εφαρμογή Ιστού)...351 Κατάλογοι JSP για το JRun (Προεπιλεγμένη εφαρμογή Ιστού)...351 Κατάλογοι JSP για το Resin (Προεπιλεγμένη εφαρμογή Ιστού)...352 10.6 Βασική σύνταξη...352 Κείμενο HTML...352 Σχόλια HTML...352 Κείμενο Προτύπου...353

Περιεχόμενα 13 Σχόλια JSP...353 Παράσταση JSP...353 Μικροσενάριο JSP...353 Δήλωση JSP...354 Οδηγία JSP...354 Ενέργεια JSP...354 Στοιχείο γλώσσας παραστάσεων JSP...355 Προσαρμοσμένη ετικέτα (Προσαρμοσμένη ενέργεια)...355 Κείμενο προτύπου με ακολουθία διαφυγής...355 ΚΕΦΑΛΑΙΟ 11 ΚΛΗΣΗ ΚΩΔΙΚΑ JAVA ΜΕ ΣΤΟΙΧΕΙΑ ΣΕΝΑΡΙΟΥ JSP... 356 11.1 Δημιουργία κειμένου προτύπου...357 11.2 Κλήση κώδικα Java από σελίδες JSP...358 Τύποι στοιχείων σεναρίου JSP...359 11.3 Περιορισμός της ποσότητας κώδικα Java σε σελίδες JSP...359 Η σημασία της χρήσης πακέτων...361 11.4 Χρήση παραστάσεων JSP...363 Προκαθορισμένες μεταβλητές...363 Αντιστοιχία σελίδων JSP και μικροϋπηρεσιών...364 Σύνταξη XML για παραστάσεις...365 11.5 Παράδειγμα: Παραστάσεις JSP...366 11.6 Σύγκριση μικροϋπηρεσιών και σελίδων JSP...368 11.7 Συγγραφή μικροσεναρίων...370 Αντιστοιχία JSP και μικροϋπηρεσιών...371 Σύνταξη XML για μικροσενάρια...372 11.8 Παράδειγμα μικροσεναρίου...372 11.9 Μετατροπή τμημάτων σελίδων JSP σε παραστάσεις υπό συνθήκη...374 11.10 Χρήση δηλώσεων...376 Αντιστοιχία JSP και μικροϋπηρεσιών...377 Σύνταξη XML για δηλώσεις...378 11.11 Παράδειγμα δήλωσης...379 11.12 Χρήση προκαθορισμένων μεταβλητών...381

14 14 14 Περιεχόμενα 11.13 Σύγκριση παραστάσεων, μικροσεναρίων, και δηλώσεων JSP...383 Παράδειγμα 1: Παραστάσεις JSP...384 Παράδειγμα 2: Μικροσενάρια JSP...385 Παράδειγμα 3: Δηλώσεις JSP...387 ΚΕΦΑΛΑΙΟ 12 ΕΛΕΓΧΟΣ ΤΗΣ ΔΟΜΗΣ ΤΩΝ ΜΙΚΡΟΫΠΗΡΕΣΙΩΝ: Η ΟΔΗΓΙΑ PAGE... 390 12.1 Η ιδιότητα import...392 12.2 Οι ιδιότητες contenttype και pageencoding...395 Παραγωγή φύλλων εργασίας Excel...396 12.3 Παραγωγή φύλλων εργασίας Excel υπό συνθήκη...397 12.4 Η ιδιότητα session...400 12.5 Η ιδιότητα iselignored...400 12.6 Οι ιδιότητες buffer και autoflush...401 12.7 Η ιδιότητα info...402 12.8 Οι ιδιότητες errorpage και iserrorpage...402 12.9 Η ιδιότητα isthreadsafe...405 12.10 Η ιδιότητα extends...406 12.11 Η ιδιότητα language...407 12.12 Σύνταξη XML για οδηγίες...407 ΚΕΦΑΛΑΙΟ 13 ΣΥΜΠΕΡΙΛΗΨΗ ΑΡΧΕΙΩΝ ΚΑΙ ΜΙΚΡΟΕΦΑΡΜΟΓΩΝ ΣΕ ΣΕΛΙΔΕΣ JSP... 408 13.1 Συμπερίληψη σελίδων κατά το χρόνο αίτησης: Η ενέργεια jsp:include...410 Η ιδιότητα page: Καθορισμός της συμπεριλαμβανόμενης σελίδας...411 Σύνταξη XML και jsp:include...412 Η ιδιότητα flush...413 Μια σελίδα με τίτλους ειδήσεων...413 Το στοιχείο jsp:param. Επαύξηση των παραμέτρων αίτησης...415

Περιεχόμενα 15 13.2 Συμπερίληψη αρχείων κατά το χρόνο μετάφρασης: Η οδηγία include...416 Προβλήματα συντήρησης με την οδηγία include...417 Επιπλέον ισχύς από την οδηγία include...418 Ενημέρωση της κύριας σελίδας...418 Σύνταξη XML για την οδηγία include...419 Παράδειγμα: Επαναχρησιμοποίηση υποσημειώσεων...419 13.3 Προώθηση αιτήσεων με jsp:forward...421 13.4 Συμπερίληψη μικροεφαρμογών για το Java Plug-in...422 Το στοιχείο jsp:plugin...425 Τα στοιχεία jsp:param και jsp:params...427 Το στοιχείο jsp:fallback...428 Ένα παράδειγμα jsp:plugin...428 ΚΕΦΑΛΑΙΟ 14 ΧΡΗΣΗ ΣΤΟΙΧΕΙΩΝ JAVABEANS ΣΕ ΕΓΓΡΑΦΑ JSP... 433 14.1 Γιατί να χρησιμοποιήσετε κόκκους;...436 14.2 Τι είναι οι κόκκοι;...436 14.3 Χρήση κόκκων: Βασικές εργασίες...438 Δόμηση κόκκων: jsp:usebean...439 Εγκατάσταση κλάσεων κόκκων...439 Χρήση των επιλογών του jsp:usebean: scope, beanname, και type...440 Προσπέλαση των ιδιοτήτων κόκκων: ιδιότητα jsp:getproperty...441 Ορισμός απλών ιδιοτήτων κόκκων: jsp:setproperty...442 14.4 Παράδειγμα: StringBean...442 14.5 Ορισμός των ιδιοτήτων κόκκων: Προχωρημένες τεχνικές...445 Συσχέτιση μεμονωμένων ιδιοτήτων με παραμέτρους εισόδου...449 Συσχέτιση όλων των ιδιοτήτων με παραμέτρους αίτησης...451 14.6 Κοινοχρησία κόκκων...452 Δημιουργία κόκκων υπό συνθήκη...453 14.7 Κοινοχρησία κόκκων με τέσσερις διαφορετικούς τρόπους: Παράδειγμα...456 Δόμηση του κόκκου και της ρουτίνας ελέγχου...457 Χρήση της επιλογής scope="page" Χωρίς κοινοχρησία...459

16 16 16 Περιεχόμενα Κοινοχρησία με βάση την αίτηση...460 Κοινοχρησία με βάση τη συνεδρία...463 Κοινοχρησία με βάση το αντικείμενο ServletContext...465 ΚΕΦΑΛΑΙΟ 15 ΟΛΟΚΛΗΡΩΣΗ ΜΙΚΡΟΫΠΗΡΕΣΙΩΝ ΚΑΙ JSP: Η ΑΡΧΙΤΕΚΤΟΝΙΚΗ MODEL VIEW CONTROLLER (MVC)... 468 15.1 Κατανόηση της ανάγκης για την αρχιτεκτονική MVC...469 Πλαίσια εργασιών MVC...471 Αρχιτεκτονική ή προσέγγιση...471 15.2 Υλοποίηση της αρχιτεκτονικής MVC με την κλάση RequestDispatcher...471 Ορισμός κόκκων για την αναπαράσταση των δεδομένων...472 Συγγραφή μικροϋπηρεσιών για το χειρισμό αιτήσεων...473 Συμπλήρωση των κόκκων...473 Αποθήκευση των αποτελεσμάτων...473 Προώθηση αιτήσεων σε σελίδες JSP...475 Εξαγωγή δεδομένων από κόκκους...477 15.3 Σύνοψη του κώδικα MVC...478 Κοινοχρησία δεδομένων με βάση την αίτηση...478 Κοινοχρησία δεδομένων με βάση τη συνεδρία...478 Κοινοχρησία δεδομένων με βάση την εφαρμογή...479 15.4 Ερμηνεία των σχετικών URL στη σελίδα προορισμού...479 15.5 Εφαρμογή της αρχιτεκτονικής MVC: Υπόλοιπο τραπεζικού λογαριασμού...480 15.6 Σύγκριση των τριών προσεγγίσεων κοινοχρησίας δεδομένων...488 Κοινοχρησία σε επίπεδο αίτησης...488 Κοινοχρησία σε επίπεδο συνεδρίας...490 Κοινοχρησία σε επίπεδο εφαρμογής...493 15.7 Προώθηση αιτήσεων από σελίδες JSP...495 15.8 Συμπερίληψη σελίδων...496

Περιεχόμενα 17 ΚΕΦΑΛΑΙΟ 16 ΑΠΛΟΠΟΙΗΣΗ ΤΗΣ ΠΡΟΣΠΕΛΑΣΗΣ ΚΩΔΙΚΑ JAVA: Η ΓΛΩΣΣΑ ΠΑΡΑΣΤΑΣΕΩΝ JSP 2.0... 498 16.1 Το κίνητρο για τη χρήση της EL...499 16.2 Κλήση της γλώσσας παραστάσεων...501 Ειδικοί χαρακτήρες διαφυγής...502 16.3 Παρεμπόδιση υπολογισμού της γλώσσας παραστάσεων...502 Απενεργοποίηση της γλώσσας παραστάσεων για μια ολόκληρη εφαρμογή Ιστού...503 Απενεργοποίηση της γλώσσας παραστάσεων σε πολλές σελίδες JSP...504 Απενεργοποίηση της γλώσσας παραστάσεων σε μεμονωμένες σελίδες JSP...504 Απενεργοποίηση μεμονωμένων εντολών της γλώσσας παραστάσεων...504 16.4 Παρεμπόδιση της χρήσης τυπικών στοιχείων σεναρίου...505 16.5 Προσπέλαση μεταβλητών προσδιορισμένης εμβέλειας...506 Επιλογή ονομάτων ιδιοτήτων...507 Ένα παράδειγμα...507 16.6 Προσπέλαση ιδιοτήτων κόκκων...509 Ισοδυναμία της σημειογραφίας τελείας και της σημειογραφίας πίνακα...510 Ένα παράδειγμα...511 16.7 Προσπέλαση συλλογών...515 Ένα παράδειγμα...516 16.8 Αναφορά σε έμμεσα αντικείμενα...518 Ένα παράδειγμα...520 16.9 Χρήση τελεστών της γλώσσας παραστάσεων...521 Αριθμητικοί τελεστές...521 Σχεσιακοί τελεστές...522 Λογικοί τελεστές...523 Ο τελεστής empty...523 Ένα παράδειγμα...523 16.10 Υπολογισμός παραστάσεων υπό συνθήκη...525 Ένα παράδειγμα...526 16.11 Άλλες δυνατότητες της γλώσσας παραστάσεων...528

18 18 18 Περιεχόμενα ΜΕΡΟΣ III ΤΕΧΝΟΛΟΓΙΑ ΥΠΟΣΤΗΡΙΞΗΣ... 530 ΚΕΦΑΛΑΙΟ 17 ΠΡΟΣΠΕΛΑΣΗ ΒΑΣΕΩΝ ΔΕΔΟΜΕΝΩΝ ΜΕ ΤΗΝ JDBC... 532 17.1 Γενική χρήση της JDBC...534 Φόρτωση του προγράμματος οδήγησης JDBC...535 Ορισμός του URL σύνδεσης...538 Δρομολόγηση της σύνδεσης...538 Δημιουργία ενός αντικειμένου Statement...539 Εκτέλεση ερωτήματος ή ενημέρωσης...540 Επεξεργασία των αποτελεσμάτων...541 Κλείσιμο της σύνδεσης...544 17.2 Βασικά παραδείγματα JDBC...544 17.3 Προσπέλαση βάσεων δεδομένων με βοηθητικές κλάσεις JDBC...551 17.4 Χρήση προκατασκευασμένων εντολών...563 17.5 Δημιουργία καλούμενων εντολών...568 Ορισμός της κλήσης για τη διαδικασία της βάσης δεδομένων...569 Προετοιμασία ενός αντικειμένου CallableStatement για τη διαδικασία...570 Δήλωση των τύπων των παραμέτρων εξόδου...570 Παροχή τιμών στις παραμέτρους εισόδου...570 Εκτέλεση της αποθηκευμένης διαδικασίας...570 Προσπέλαση των παραμέτρων εξόδου...571 Παράδειγμα...571 17.6 Χρήση συναλλαγών βάσεων δεδομένων...574 17.7 Αντιστοίχιση δεδομένων σε αντικείμενα με χρήση πλαισίων εργασίας ORM...579 ΚΕΦΑΛΑΙΟ 18 ΔΙΕΥΘΕΤΗΣΗ ΤΩΝ MS ACCESS, MYSQL, ΚΑΙ ORACLE9I... 586 18.1 Διευθέτηση της Microsoft Access για χρήση με την JDBC...588 Επιλογή ενός DSN συστήματος από τη Διαχείριση αρχείων προέλευσης δεδομένων ODBC...589

Περιεχόμενα 19 Επιλογή προγράμματος οδήγησης για το νέο DSN συστήματος...590 Επιλογή προέλευσης δεδομένων...590 Πάτημα στο OK για αποδοχή του νέου DSN...591 18.2 Εγκατάσταση και διευθέτηση της MySQL...592 Κατέβασμα και εγκατάσταση της MySQL...593 Δημιουργία βάσης δεδομένων...593 Δημιουργία χρήστη...594 Εγκατάσταση του προγράμματος οδήγησης JDBC...595 18.3 Εγκατάσταση και διευθέτηση της Oracle9i...595 Κατέβασμα και εγκατάσταση της Oracle9i...597 Δημιουργία βάσης δεδομένων...606 Δημιουργία βάσης δεδομένων με το Βοηθό Διευθέτησης...607 Δημιουργία βάσης δεδομένων "με το χέρι"...615 Δημιουργία ενός χρήστη...623 Εγκατάσταση του προγράμματος οδήγησης JDBC...624 18.4 Έλεγχος της βάσης δεδομένων σας μέσω μιας σύνδεσης JDBC...624 18.5 Διευθέτηση του πίνακα music...632 Χρήση του προγράμματος CreateMusicTable.java για τη δημιουργία του πίνακα music...633 Χρήση του σεναρίου create_music_table.sql για τη δημιουργία του πίνακα music...636 ΚΕΦΑΛΑΙΟ 19 ΔΗΜΙΟΥΡΓΙΑ ΚΑΙ ΕΠΕΞΕΡΓΑΣΙΑ ΦΟΡΜΩΝ HTML... 638 Προεπιλεγμένη εφαρμογή Ιστού: Tomcat...640 Προεπιλεγμένη εφαρμογή Ιστού: JRun...640 Προεπιλεγμένη εφαρμογή Ιστού: Resin...640 19.1 Πώς μεταδίδουν δεδομένα οι φόρμες HTML...640 19.2 Το στοιχείο FORM...645 19.3 Χειριστήρια κειμένου...652 Πεδία κειμένου...652 Πεδία κωδικού πρόσβασης...655 Περιοχές κειμένου...656

20 20 20 Περιεχόμενα 19.4 Κουμπιά...658 Κουμπιά υποβολής...658 Κουμπιά επαναφοράς...661 Κουμπιά JavaScript...662 19.5 Πλαίσια ελέγχου και ραδιοπλήκτρα...663 Πλαίσια ελέγχου...663 Ραδιοπλήκτρα...664 19.6 Σύνθετα πλαίσια και πλαίσια καταλόγου...666 19.7 Χειριστήρια ανεβάσματος αρχείων...672 19.8 Χάρτες εικόνων στο διακομιστή...674 IMAGE Τυπικοί χάρτες εικόνων στο διακομιστή...675 ISMAP Εναλλακτικοί χάρτες εικόνων στο διακομιστή...677 19.9 Κρυφά πεδία...679 19.10 Ομάδες χειριστηρίων...680 19.11 Χειριστήριο σειράς ενεργοποίησης...681 19.12 Ένας διακομιστής ιστού για αποσφαλμάτωση...682 EchoServer...683 ΠΑΡΑΡΤΗΜΑ ΕΓΚΑΤΑΣΤΑΣΗ ΚΑΙ ΔΙΕΥΘΕΤΗΣΗ ΔΙΑΚΟΜΙΣΤΗ... 690 Tomcat...691 Κατέβασμα λογισμικού...691 Δημιουργία σελιδοδεικτών για τις API των μικροϋπηρεσιών και της JSP...691 Διευθέτηση του διακομιστή...692 Διαμόρφωση του δικού σας περιβάλλοντος ανάπτυξης...692 Χρήση της προεπιλεγμένης εφαρμογής Ιστού...693 Χρήση προσαρμοσμένων εφαρμογών Ιστού...694 Προβολή αυτόματα παραγόμενου κώδικα για σελίδες JSP...695 JRUN...695 Κατέβασμα λογισμικού...695 Δημιουργία σελιδοδεικτών για τις API μικροϋπηρεσιών και JSP...696 Διευθέτηση του διακομιστή...696 Διευθέτηση του δικού σας περιβάλλοντος ανάπτυξης...697

Περιεχόμενα 21 Χρήση της προεπιλεγμένης εφαρμογής Ιστού...697 Χρήση προσαρμοσμένων εφαρμογών Ιστού...698 Προβολή του αυτόματα παραγόμενου κώδικα για σελίδες JSP...699 Resin...700 Κατέβασμα λογισμικού...700 Δημιουργία σελιδοδεικτών για τις API μικροϋπηρεσιών και JSP...700 Διευθέτηση του διακομιστή...701 Διαμόρφωση του δικού σας περιβάλλοντος ανάπτυξης...701 Χρήση της προεπιλεγμένης εφαρμογής Ιστού...701 Χρήση προσαρμοσμένων εφαρμογών Ιστού...702 Προβολή αυτόματα παραγόμενου κώδικα για σελίδες JSP...703 Ευρετήριο...705

Κεφάλαιο Ένα από τα κλειδιά για τη δημιουργία αποδοτικών μικροϋπηρεσιών είναι η κατανόηση του Πρωτόκολλου Μεταφοράς Υπερ-κειμένου (HyperText Transfer Protocol, HTTP). Η σε βάθος κατανόηση αυτού του πρωτόκολλου δεν είναι μια "εσωτερική" ή θεωρητική ανάγκη, αλλά ένα μάλλον πρακτικό θέμα που μπορεί να έχει άμεση επίπτωση στην απόδοση και την ευχρηστία των μικροϋπηρεσιών σας. Αυτή η ενότητα εξετάζει τις πληροφορίες HTTP που στέλνονται από το φυλλομετρητή στο διακομιστή με τη μορφή κεφαλίδων αίτησης (request headers). Επεξηγεί τις περισσότερες κεφαλίδες αίτησης HTTP 1.1 και συνοψίζει πώς και γιατί θα χρησιμοποιηθούν αυτές σε μια μικροϋπηρεσία. Όπως θα δούμε αργότερα, οι κεφαλίδες αίτησης διαβάζονται και εφαρμόζονται με τον ίδιο τρόπο στις σελίδες JSP όπως και στις μικροϋπηρεσίες. Θα πρέπει να σημειώσουμε ότι οι κεφαλίδες αίτησης HTTP διαφέρουν από τα δεδομένα φορμών (ερωτημάτων) που εξετάσαμε στο προηγούμενο κεφάλαιο. Τα δεδομένα φορμών προκύπτουν άμεσα από είσοδο του χρήστη και αποστέλλονται ως τμήμα της διεύθυνσης URL, στην περίπτωση των αιτήσεων GET, ή σε μια ξεχωριστή γραμμή για τις αιτήσεις POST. Από την άλλη πλευρά, οι κεφαλίδες αίτησης ακολουθούν μετά από τη γραμμή αίτησης GET ή POST. Έτσι, το παράδειγμα που ακολουθεί δείχνει μια αίτηση HTTP που μπορεί να προκύψει όταν ο χρήστης υποβάλλει μια αίτηση αναζήτησης βιβλίου σε μια μικροϋπηρεσία στη διεύθυνση http:// www.somebookstore.com/servlet/search. Η αίτηση περιέχει τις κεφαλίδες Accept, Accept- Encoding, Connection, Cookie, Host, Referer, και User-Agent. Όλες αυτές οι κεφαλίδες μπορεί να είναι σημαντικές για τη λειτουργία της μικροϋπηρεσίας, αλλά καμία δεν μπορεί να παραχθεί ή να υπολογιστεί αυτόματα: η μικροϋπηρεσία θα πρέπει να διαβάσει ρητά τις κεφαλίδες της αίτησης για να κάνει χρήση αυτών των πληροφοριών.

186 Κεφάλαιο 5 Χειρισμός της αίτησης πελάτη: κεφαλίδες αίτησης HTTP GET /servlet/search?keywords=servlets+jsp HTTP/1.1 Accept: image/gif, image/jpg, */* Accept-Encoding: gzip Connection: Keep-Alive Cookie: userid=id456578 Host: www.somebookstore.com Referer: http://www.somebookstore.com/findbooks.html User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) 5.1 Ανάγνωση κεφαλίδων αίτησης Η ανάγνωση των κεφαλίδων είναι απλή υπόθεση: καλείτε τη μέθοδο getheader της κλάσης HttpServletRequest με όρισμα το όνομα της κεφαλίδας. Αν η συγκεκριμένη κεφαλίδα υπάρχει στην τρέχουσα αίτηση η κλήση επιστρέφει ένα αντικείμενο String, διαφορετικά επιστρέφει τιμή null. Στο πρωτόκολλο HTTP 1.0 όλες οι κεφαλίδες αίτησης ήταν προαιρετικές. στο πρωτόκολλο HTTP 1.1 μόνο η κεφαλίδα Host είναι υποχρεωτική. Έτσι, θα πρέπει πάντοτε να κάνετε έλεγχο για την τιμή null πριν χρησιμοποιήσετε μια κεφαλίδα αίτησης. Η προσέγγιση του βιβλίου Να ελέγχετε πάντα ότι το αποτέλεσμα της request.getheader δεν είναι null, πριν να το χρησιμοποιήσετε. Στα ονόματα κεφαλίδων δεν γίνεται διάκριση πεζών και κεφαλαίων. Έτσι, για παράδειγμα, η εντολή request.getheader("connection") είναι ταυτόσημη με την εντολή request. getheader("connection"). Αν και η μέθοδος getheader είναι μια λύση "γενικής χρήσης" για την ανάγνωση των εισερχόμενων κεφαλίδων, μερικές κεφαλίδες χρησιμοποιούνται τόσο συχνά που έχουν ειδικές μεθόδους προσπέλασης στην κλάση HttpServletRequest. Ας δούμε μια σύνοψή τους. getcookies Η μέθοδος getcookies επιστρέφει τα περιεχόμενα της κεφαλίδας Cookies, τα οποία αναλύονται και αποθηκεύονται σε έναν πίνακα αντικειμένων Cookie. Αυτή η μέθοδος εξετάζεται λεπτομερέστερα στο Κεφάλαιο 8 (Χειρισμός μπισκότων). getauthtype και getremoteuser Οι μέθοδοι getauthtype και getremoteuser διαχωρίζουν την κεφαλίδα Authorization στα συστατικά της στοιχεία. getcontentlength Η μέθοδος getcontentlength επιστρέφει την τιμή της κεφαλίδας Content-Length (σε μορφή int).

5.1 Ανάγνωση κεφαλίδων αίτησης 187 getcontenttype Η μέθοδος getcontenttype επιστρέφει την τιμή της κεφαλίδας Content-Type (σε μορφή String). getdateheader και getintheader Οι μέθοδοι getdateheader και getintheader διαβάζουν τις συγκεκριμένες κεφαλίδες και στη συνέχεια τις μετατρέπουν σε τιμές Date και int, αντίστοιχα. getheadernames Αντί να αναζητήσετε μια συγκεκριμένη κεφαλίδα, μπορείτε να χρησιμοποιήσετε τη μέθοδο getheadernames για να πάρετε μία απαρίθμηση (Enumeration) με όλα τα ο- νόματα κεφαλίδων που έχουν ληφθεί στη συγκεκριμένη αίτηση. Αυτή η δυνατότητα παρουσιάζεται στην Ενότητα 5.2 (Δημιουργία πίνακα με όλες τις κεφαλίδες αίτησης). getheaders Στις περισσότερες περιπτώσεις το κάθε όνομα κεφαλίδας εμφανίζεται μόνο μία φορά στην αίτηση. Περιστασιακά, όμως, μια κεφαλίδα μπορεί να εμφανιστεί περισσότερες φορές, όπου σε κάθε παρουσία της υπάρχει ξεχωριστή τιμή. Ένα τέτοιο παράδειγμα είναι η κεφαλίδα Accept-Language. Μπορείτε να χρησιμοποιήσετε τη μέθοδο getheaders για να πάρετε μια απαρίθμηση (Enumeration) με τις τιμές όλων των παρουσιών της κεφαλίδας. Τέλος, εκτός από την εξέταση των κεφαλίδων αίτησης, μπορείτε να πάρετε πληροφορίες για την ίδια την κύρια γραμμή αίτησης (request line) δηλαδή την πρώτη γραμμή στο παράδειγμα που παρουσιάσαμε μέσω των μεθόδων της κλάσης HttpServletRequest. Οι τέσσερις βασικές μέθοδοι είναι οι εξής: getmethod Η μέθοδος getmethod επιστρέφει την κύρια μέθοδο αίτησης (κανονικά είναι ή GET ή POST, αλλά είναι πιθανές και μέθοδοι όπως οι HEAD, PUT, και DELETE). getrequesturi Η μέθοδος getrequesturi επιστρέφει το τμήμα του URL που είναι μετά τον υπολογιστή υπηρεσίας (host) και τη θύρα, αλλά πριν από τα δεδομένα της φόρμας. Για παράδειγμα, για το URL http://randomhost.com/servlet/search.booksearch?subject=jsp η μέθοδος getrequesturi θα επιστρέψει τιμή "/servlet/search.booksearch". getquerystring Η μέθοδος getquerystring επιστρέφει τα δεδομένα της φόρμας. Για παράδειγμα, στο URL http://randomhost.com/servlet/search.booksearch?subject=jsp η getquery- String θα επιστρέψει τιμή "subject=jsp". getprotocol Η μέθοδος getprotocol επιστρέφει το τρίτο μέρος της γραμμής αίτησης, που γενικά είναι ή HTTP/1.0 ή HTTP/1.1. Οι μικροϋπηρεσίες θα πρέπει κανονικά να ελέγχουν τη μέθοδο getprotocol πριν καθορίσουν κεφαλίδες απάντησης (response headers) (Κεφάλαιο 7) που ισχύουν μόνο για το πρωτόκολλο HTTP 1.1.

188 Κεφάλαιο 5 Χειρισμός της αίτησης πελάτη: κεφαλίδες αίτησης HTTP 5.2 Δημιουργία πίνακα με όλες τις κεφαλίδες αίτησης Η Λίστα 5.1 παρουσιάζει μια μικροϋπηρεσία που απλώς δημιουργεί έναν πίνακα με όλες τις κεφαλίδες αίτησης που λαμβάνει, μαζί με τις αντίστοιχες τιμές. Αυτό το επιτυγχάνει καλώντας τη μέθοδο request.getheadernames για να λάβει μία απαρίθμηση (Enumeration) των κεφαλίδων της τρέχουσας αίτησης. Κατόπιν διατρέχει την απαρίθμηση, τοποθετεί το όνομα της κεφαλίδας στο αριστερό κελί του πίνακα, και τοποθετεί το αποτέλεσμα της μεθόδου getheader στο δεξιό κελί. Θυμηθείτε ότι η απαρίθμηση είναι μία τυπική διασύνδεση της Java. περιλαμβάνεται στο πακέτο java.util και περιέχει μόνο δύο μεθόδους: τις μεθόδους hasmoreelements και nextelement. Η μικροϋπηρεσία τυπώνει επίσης τρία στοιχεία της κύριας γραμμής αίτησης (μέθοδο, URL, και πρωτόκολλο). Οι Εικόνες 5-1 και 5-2 δείχνουν τυπικά αποτελέσματα με τους φυλλομετρητές Netscape και Internet Explorer. Λίστα 5.1 ShowRequestHeaders.java package coreservlets; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; /** Παρουσιάζει όλες τις κεφαλίδες αίτησης για την τρέχουσα αίτηση. */ public class ShowRequestHeaders extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); String title = "Servlet Example: Showing Request Headers"; String doctype = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " + "Transitional//EN\">\n"; out.println(doctype + "<HTML>\n" + "<HEAD><TITLE>" + title + "</TITLE></HEAD>\n" + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" + "<B>Request Method: </B>" + request.getmethod() + "<BR>\n" + "<B>Request URI: </B>" + request.getrequesturi() + "<BR>\n" + "<B>Request Protocol: </B>" +

5.2 Δημιουργία πίνακα με όλες τις κεφαλίδες αίτησης 189 Λίστα 5.1 ShowRequestHeaders.java (συνέχεια) } } request.getprotocol() + "<BR><BR>\n" + "<TABLE BORDER=1 ALIGN=\"CENTER\">\n" + "<TR BGCOLOR=\"#FFAD00\">\n" + "<TH>Header Name<TH>Header Value"); Enumeration headernames = request.getheadernames(); while(headernames.hasmoreelements()) { String headername = (String)headerNames.nextElement(); out.println("<tr><td>" + headername); out.println(" <TD>" + request.getheader(headername)); } out.println("</table>\n</body></html>"); /** Επειδή αυτή η μικροϋπηρεσία φτιάχτηκε για αποσφαλμάτωση, χειρίζεται * τις GET και POST με τον ίδιο τρόπο. */ public void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { doget(request, response); } Εικόνα 5-1 Κεφαλίδες αίτησης που έχουν σταλεί από το Netscape 7 σε Windows 2000.

190 Κεφάλαιο 5 Χειρισμός της αίτησης πελάτη: κεφαλίδες αίτησης HTTP Εικόνα 5-2 Κεφαλίδες αίτησης που έχουν σταλεί από τον Internet Explorer 6 σε Windows 2000. 5.3 Κατανόηση των κεφαλίδων αίτησης HTTP 1.1 Η πρόσβαση στις κεφαλίδες αίτησης επιτρέπει στις μικροϋπηρεσίες να πραγματοποιούν μια σειρά βελτιστοποιήσεων και να παρέχουν ένα σύνολο λειτουργιών που διαφορετικά θα ήταν αδύνατο να πραγματοποιηθούν. Η ενότητα αυτή συνοψίζει τις κεφαλίδες που χρησιμοποιούνται συχνότερα από τις μικροϋπηρεσίες: για πρόσθετες πληροφορίες σχετικά με αυτές και τις υπόλοιπες κεφαλίδες, δείτε τις προδιαγραφές του πρωτοκόλλου HTTP 1.1 που υπάρχουν στο έγγραφο RFC 2616. Τα επίσημα έγγραφα RFC (request for comments, αίτηση υποβολής σχολίων) βρίσκονται αρχειοθετημένα σε διάφορες θέσεις. η καλύτερη επιλογή είναι να ξεκινήσετε από τη διεύθυνση http://www.rfc-editor.org/ για να πάρετε την τρέχουσα λίστα με τις τοποθεσίες αρχειοθέτησης. Πρέπει να σημειώσουμε ότι το πρωτόκολλο HTTP 1.1 υποστηρίζει ένα υπερσύνολο των κεφαλίδων που επιτρέπονται στο πρωτόκολλο HTTP 1.0. Accept Η κεφαλίδα αυτή καθορίζει τους τύπους MIME που μπορεί να χειριστεί ο φυλλομετρητής ή οι άλλοι πελάτες. Μια μικροϋπηρεσία που μπορεί να επιστρέψει έναν πόρο σε περισσότερες από μία μορφές μπορεί να εξετάσει την κεφαλίδα Accept για να αποφασίσει ποια μορφή θα πρέπει να χρησιμοποιήσει. Για παράδειγμα, οι εικόνες σε μορφή PNG έχουν κάποια πλεονεκτήματα όσον αφορά τη συμπίεση σε σχέση με τη μορφή GIF, αλλά δεν υποστηρίζουν όλοι οι φυλλομετρητές τις εικόνες PNG. Αν έχετε εικόνες και στις δύο μορφές, η μικροϋπηρεσία σας μπορεί να καλέσει τη μέθοδο re-

5.3 Κατανόηση των κεφαλίδων αίτησης HTTP 1.1 191 quest.getheader("accept") για να ελέγξει την παρουσία της τιμής image/png, και αν βρει ταύτιση να χρησιμοποιήσει τα ονόματα αρχείων κάτι.png για όλα τα στοιχεία IMG που παράγει. Διαφορετικά θα χρησιμοποιήσει τα αρχεία κάτι.gif. Για πληροφορίες σχετικά με τα ονόματα και τη σημασία των συνηθισμένων τύπων MIME δείτε τον Πίνακα 7.1 στην Ενότητα 7.2 (Κατανόηση των κεφαλίδων απάντησης του πρωτοκόλλου HTTP 1.1). Πρέπει να σημειώσουμε ότι ο Internet Explorer έχει ένα σφάλμα όπου η κεφαλίδα Accept δεν στέλνεται σωστά όταν επαναφορτώνετε μια σελίδα. Στέλνεται όμως σωστά στην αρχική αίτηση. Accept-Charset Αυτή η κεφαλίδα αναφέρει τα σύνολα χαρακτήρων (π.χ. ISO-8859-1) που μπορεί να χρησιμοποιήσει ο φυλλομετρητής. Accept-Encoding Αυτή η κεφαλίδα προσδιορίζει τους τύπους κωδικοποίησης (encoding) που γνωρίζει πώς να χειριστεί ο πελάτης. Αν ο διακομιστής λάβει αυτή την κεφαλίδα, είναι ελεύθερος να κωδικοποιήσει τη σελίδα χρησιμοποιώντας μια από τις μορφές κωδικοποίησης που καθορίζονται (συνήθως με στόχο να ελαττωθεί ο χρόνος μετάδοσης), στέλνοντας την κεφαλίδα απάντησης Accept-Encoding για να υποδείξει ότι το έχει κάνει. Αυτός ο τύπος κωδικοποίησης είναι τελείως διαφορετικός από τον τύπο MIME του πραγματικού εγγράφου (όπως καθορίζεται από την κεφαλίδα απάντησης Content-Type), αφού αυτή η κωδικοποίηση δεσμεύεται πριν να αποφασίσει ο φυλλομετρητής τι θα κάνει με το περιεχόμενο. Από την άλλη πλευρά, αν χρησιμοποιηθεί μια κωδικοποίηση που δεν καταλαβαίνει ο φυλλομετρητής, το αποτέλεσμα θα είναι να εμφανιστούν ακατάληπτες σελίδες. Επομένως, είναι εξαιρετικά σημαντικό να ελέγξετε ρητά την κεφαλίδα Accept-Encoding πριν χρησιμοποιήσετε οποιονδήποτε τύπο κωδικοποίησης περιεχομένου. Οι πιο συνηθισμένες πιθανές τιμές είναι gzip ή compress. Η συμπίεση σελίδων πριν από την επιστροφή τους αποτελεί μια πολύτιμη υπηρεσία, επειδή το κόστος της αποκωδικοποίησης είναι πιθανότατα μικρό σε σύγκριση με την εξοικονόμηση στο χρόνο μετάδοσης. Για περισσότερες πληροφορίες δείτε την Ενότητα 5.4, στην οποία χρησιμοποιείται συμπίεση gzip με στόχο τη μείωση του χρόνου κατεβάσματος κατά ένα συντελεστή μεγαλύτερο του 10. Accept-Language Αυτή η κεφαλίδα καθορίζει τις γλώσσες που προτιμά ο πελάτης, στην περίπτωση που η μικροϋπηρεσία μπορεί να παραγάγει αποτελέσματα σε περισσότερες από μία γλώσσες. Η τιμή της κεφαλίδας θα πρέπει να είναι ένας από τους τυποποιημένους κωδικούς γλώσσας, όπως en, en-usa, da,κ.λπ. Για λεπτομέρειες δείτε το έγγραφο RFC 1766 (ξεκινήστε από τη διεύθυνση http://www.rfc-editor.org/ για να εμφανίσετε την τρέχουσα λίστα με τις τοποθεσίες αρχειοθέτησης εγγράφων RFC).

192 Κεφάλαιο 5 Χειρισμός της αίτησης πελάτη: κεφαλίδες αίτησης HTTP Authorization Αυτή η κεφαλίδα χρησιμοποιείται από τους πελάτες για να προσδιορίσουν τον εαυτό τους όταν προσπελάζουν ιστοσελίδες που είναι προστατευμένες με κωδικό πρόσβασης. Για λεπτομέρειες δείτε τα κεφάλαια του βιβλίου More Servlets and JavaServer Pages σχετικά με την ασφάλεια μιας εφαρμογής Ιστού. Connection Αυτή η κεφαλίδα προσδιορίζει αν ο πελάτης μπορεί να χειριστεί διατηρούμενες συνδέσεις (persistent connections) HTTP. Οι διατηρούμενες συνδέσεις επιτρέπουν στον πελάτη ή σε κάποιον άλλο φυλλομετρητή να ανακτήσει πολλαπλά αρχεία (π.χ., ένα αρχείο HTML και αρκετές συσχετιζόμενες εικόνες) με μία μόνο σύνδεση υποδοχής (socket connection), εξοικονομώντας έτσι την επιβάρυνση από τη διαπραγμάτευση πολλών ανεξάρτητων συνδέσεων. Στις αιτήσεις HTTP 1.1 οι διατηρούμενες συνδέσεις είναι η προεπιλογή, και ο πελάτης θα πρέπει να καθορίσει την τιμή close σε αυτή την κεφαλίδα αν θέλει να χρησιμοποιήσει συνδέσεις παλαιού στυλ. Στο πρωτόκολλο HTTP 1.0 η τιμή Keep-Alive σημαίνει ότι θα πρέπει να χρησιμοποιηθούν διατηρούμενες συνδέσεις. Κάθε αίτηση HTTP προκαλεί μια νέα κλήση μικροϋπηρεσίας (δηλαδή, ένα νήμα που καλεί τις μεθόδους service και doxxx της μικροϋπηρεσίας), ανεξάρτητα από το αν η αίτηση αποτελεί ξεχωριστή σύνδεση. Με άλλα λόγια, ο διακομιστής καλεί τη μικροϋπηρεσία μόνο αφού έχει ήδη διαβάσει την αίτηση HTTP. Αυτό σημαίνει ότι οι μικροϋπηρεσίες θα πρέπει να συνεργάζονται με το διακομιστή για το χειρισμό των διατηρούμενων συνδέσεων. Επομένως, η δουλειά της μικροϋπηρεσίας είναι να κάνει δυνατή τη χρήση διατηρούμενων συνδέσεων από το διακομιστή. αυτό το επιτυγχάνει η μικροϋπηρεσία με τη ρύθμιση της κεφαλίδας απάντησης Content-Length. Για λεπτομέρειες δείτε το Κεφάλαιο 7 (Δημιουργία απάντησης διακομιστή: Κεφαλίδες απάντησης HTTP). Content-Length Αυτή η κεφαλίδα έχει εφαρμογή μόνο σε αιτήματα POST, και προσδιορίζει το μέγεθος των δεδομένων POST σε byte. Αντί για την κλήση request.getintheader("content-length"), μπορείτε απλώς να χρησιμοποιήσετε τη μέθοδο request.get- ContentLength(). Επειδή όμως οι μικροϋπηρεσίες αναλαμβάνουν για λογαριασμό σας την ανάγνωση των δεδομένων φόρμας (δείτε το Κεφάλαιο 4), σπανίως θα χρησιμοποιείτε ρητά αυτή την κεφαλίδα. Cookie Αυτή η κεφαλίδα επιστρέφει στους διακομιστές τα μπισκότα (cookies) τα οποία είχαν στείλει στο φυλλομετρητή. Ποτέ να μη διαβάζετε άμεσα αυτή την κεφαλίδα, επειδή αυτό απαιτεί επίπονη ανάλυση χαμηλού επιπέδου: χρησιμοποιήστε καλύτερα τη μέθοδο request.getcookies. Για λεπτομέρειες δείτε το Κεφάλαιο 8 (Χειρισμός μπισκότων). Από τεχνικής πλευράς, η κεφαλίδα Cookie δεν αποτελεί τμήμα του πρωτοκόλ-

5.3 Κατανόηση των κεφαλίδων αίτησης HTTP 1.1 193 λου HTTP 1.1. Αρχικά ήταν επέκταση του Netscape, αλλά πλέον υποστηρίζεται ευρέως και από το Netscape και από τον Internet Explorer. Host Στο πρωτόκολλο HTTP 1.1 οι φυλλομετρητές και οι άλλοι πελάτες είναι υποχρεωμένοι να καθορίσουν αυτή την κεφαλίδα, η οποία υποδεικνύει τον υπολογιστή υπηρεσίας και τη θύρα όπως έχουν δοθεί στο αρχικό URL. Λόγω της ευρείας χρήσης της εικονικής φιλοξενίας (virtual hosting) όπου ένας υπολογιστής χειρίζεται τοποθεσίες Ιστού για πολλά ονόματα περιοχών είναι αρκετά πιθανό ο διακομιστής να μην μπορεί να προσδιορίσει αυτές τις πληροφορίες με διαφορετικό τρόπο. Αυτή η κεφαλίδα δεν είναι νέα στο HTTP 1.1, αλλά στο HTTP 1.0 ήταν προαιρετική, ενώ τώρα είναι υποχρεωτική. If-Modified-Since Αυτή η κεφαλίδα προσδιορίζει ότι ο πελάτης θέλει τη σελίδα μόνο αν αυτή έχει αλλάξει μετά από τη συγκεκριμένη ημερομηνία. Ο διακομιστής στέλνει μια κεφαλίδα 304 (Not Modified Δεν έχει τροποποιηθεί) αν δεν υπάρχουν διαθέσιμα νεότερα αποτελέσματα. Αυτή η επιλογή είναι χρήσιμη επειδή επιτρέπει στους διακομιστές να αποθηκεύουν προσωρινά τα έγγραφα και να τα ξαναφορτώνουν στο δίκτυο μόνο όταν έχουν αλλάξει. Ωστόσο, οι μικροϋπηρεσίες δεν χρειάζεται να χειρίζονται άμεσα αυτή την κεφαλίδα. Αντίθετα, θα πρέπει απλώς να υλοποιούν τη μέθοδο getlastmodified έτσι ώστε το σύστημα να χειρίζεται αυτόματα τις ημερομηνίες τροποποίησης. Για ένα σχετικό παράδειγμα δείτε τη μικροϋπηρεσία με τους αριθμούς λοτταρίας στην Ενότητα 3.6 (Ο κύκλος ζωής μιας μικροϋπηρεσίας). If-Unmodified-Since Αυτή η κεφαλίδα είναι το αντίστροφο της If-Modified-Since. καθορίζει ότι η λειτουργία θα πρέπει να επιτύχει μόνο αν το έγγραφο είναι παλαιότερο από τη συγκεκριμένη ημερομηνία. Συνήθως η κεφαλίδα If-Modified-Since χρησιμοποιείται σε αιτήματα GET ("δώσε μου το έγγραφο μόνο αν είναι νεότερο από την εκδοχή που έχει αποθηκευτεί προσωρινά"), ενώ η If-Unmodified-Since χρησιμοποιείται σε αιτήματα POST ("ενημέρωσε αυτό το έγγραφο μόνο αν κανείς άλλος δεν το έχει αλλάξει μετά από την ημερομηνία που το δημιούργησα"). Η κεφαλίδα αυτή είναι καινούργια στο HTTP 1.1. Referer Αυτή η κεφαλίδα προσδιορίζει το URL της ιστοσελίδας προέλευσης. Για παράδειγμα, αν βρίσκεστε στην ιστοσελίδα 1 και πατήσετε σε ένα σύνδεσμο για την ιστοσελίδα 2, το URL της ιστοσελίδας 1 θα περιλαμβάνεται στην κεφαλίδα Referer όταν ο φυλλομετρητής ζητήσει την ιστοσελίδα 2. Οι περισσότεροι φυλλομετρητές ορίζουν αυτή την κεφαλίδα, οπότε αυτός είναι ένας χρήσιμος τρόπος παρακολούθησης της προέλευσης των αιτήσεων. Αυτή η δυνατότητα επιτρέπει την παρακολούθηση διαφημίσεων που

194 Κεφάλαιο 5 Χειρισμός της αίτησης πελάτη: κεφαλίδες αίτησης HTTP παραπέμπουν άτομα στην τοποθεσία σας, την ελαφρά τροποποίηση του περιεχομένου ανάλογα με την τοποθεσία προέλευσης, την αναγνώριση των χρηστών που εισέρχονται για πρώτη φορά στην εφαρμογή σας, ή απλώς την παρακολούθηση της προέλευσης της κυκλοφορίας σας. Για την τελευταία εργασία οι περισσότεροι βασίζονται στα αρχεία καταγραφής του διακομιστή Ιστού, αφού συνήθως η κεφαλίδα Referer καταγράφεται εκεί. Αν και η κεφαλίδα Referer είναι χρήσιμη, δεν πρέπει να στηρίζεστε πάρα πολύ σε αυτή επειδή μπορεί εύκολα να αλλοιωθεί από κάποιον πελάτη. Θα πρέπει επίσης να σημειώσουμε ότι, εξαιτίας ορθογραφικού λάθους ενός από τους αρχικούς συγγραφείς του πρωτοκόλλου HTTP, η κεφαλίδα ονομάζεται Referer και όχι Referrer όπως θα αναμενόταν. Τέλος, σημειώστε ότι ορισμένοι φυλλομετρητές (Opera), διαφημιστικά φίλτρα (Web Washer), και προσωπικά τείχη προστασίας (Norton) απομακρύνουν αυτή την κεφαλίδα. Επίσης, ακόμα και σε κανονικές περιστάσεις η κεφαλίδα ορίζεται μόνο όταν ο χρήστης ακολουθήσει κάποιο σύνδεσμο. Γι' αυτό φροντίστε να ακολουθείτε την προσέγγιση που θα πρέπει να ακολουθείτε έτσι κι αλλιώς για όλες τις κεφαλίδες: έλεγχος για την τιμή null πριν από τη χρήση της κεφαλίδας. Για λεπτομέρειες και ένα σχετικό παράδειγμα δείτε την Ενότητα 5.6 (Αλλαγή της σελίδας ανάλογα με τον τρόπο μετάβασης του χρήστη σε αυτή). User-Agent Αυτή η κεφαλίδα προσδιορίζει το φυλλομετρητή ή τον άλλον πελάτη που υποβάλλει την αίτηση, και μπορεί να επιστρέφει διαφορετικό περιεχόμενο σε διαφορετικούς τύπους φυλλομετρητών. Να είστε προσεκτικοί με αυτή τη χρήση της κεφαλίδας όταν χειρίζεστε μόνο φυλλομετρητές Ιστού. αν βασίζεστε σε μια "ενσωματωμένη στον κώδικα" λίστα των εκδόσεων των φυλλομετρητών και των αντίστοιχων λειτουργιών, αυτό πιθανόν να κάνει τη μικροϋπηρεσία σας αναξιόπιστη και δύσκολη στην τροποποίηση. Όπου είναι δυνατόν, καλύτερα να χρησιμοποιείτε κάποια πιο ειδική πληροφορία από τις κεφαλίδες HTTP. Για παράδειγμα, αντί να προσπαθείτε να θυμηθείτε πιο φυλλομετρητές υποστηρίζουν τη συμπίεση gzip και σε ποιες πλατφόρμες, ελέγξτε απλώς την κεφαλίδα Accept-Encoding. Ωστόσο, η κεφαλίδα User-Agent είναι αρκετά χρήσιμη για τη διάκριση μεταξύ διαφορετικών κατηγοριών ενός πελάτη. Για παράδειγμα, οι Ιάπωνες προγραμματιστές μπορούν να δουν αν η τιμή της κεφαλίδας User-Agent είναι κινητό τηλέφωνο Imode (οπότε θα κάνουν ανακατεύθυνση σε σελίδα chtml), κινητό τηλέφωνο Skyline (οπότε θα κάνουν ανακατεύθυνση σε σελίδα wml), ή φυλλομετρητής Ιστού (οπότε θα παραγάγουν κανονική HTML). Οι περισσότερες εκδόσεις του Internet Explorer περιέχουν στη γραμμή User-Agent πρώτα μια έκδοση "Mozilla" (Netscape) και στη συνέχεια, μέσα σε παρενθέσεις, την πραγματική έκδοση του φυλλομετρητή. Το ίδιο κάνει και ο φυλλομετρητής Opera. Αυτή η εκούσια ψευδής αναγνώριση γίνεται για λόγους συμβατότητας με την JavaScript. συχνά οι προγραμματιστές JavaScript χρησιμοποιούν την κεφαλίδα User-Agent για να προσδιορίσουν ποιες λειτουργίες της JavaScript υποστηρίζονται. Έτσι, αν θέλετε να

5.4 Αποστολή συμπιεσμένων ιστοσελίδων 195 κάνετε διάκριση μεταξύ του Netscape και του Internet Explorer, θα πρέπει να αναζητήσετε το αλφαριθμητικό "MSIE" ή κάτι πιο συγκεκριμένο, και όχι απλώς το αλφαριθμητικό "Mozilla". Θα πρέπει επίσης να σημειώσουμε ότι αυτή η κεφαλίδα μπορεί εύκολα να αλλοιωθεί, γεγονός που δημιουργεί ερωτηματικά σχετικά με την αξιοπιστία τοποθεσιών Ιστού που χρησιμοποιούν αυτή την κεφαλίδα για να "παρουσιάσουν" τη διείσδυση των διαφόρων εκδόσεων των φυλλομετρητών στην αγορά. Για λεπτομέρειες και ένα σχετικό παράδειγμα δείτε την Ενότητα 5.5 (Διάκριση μεταξύ διαφόρων τύπων φυλλομετρητών). 5.4 Αποστολή συμπιεσμένων ιστοσελίδων Το gzip είναι ένας μηχανισμός συμπίεσης που μπορεί να μειώσει δραματικά το μέγεθος των σελίδων HTML (ή των αρχείων απλού κειμένου). Οι περισσότεροι σύγχρονοι φυλλομετρητές γνωρίζουν πώς να χειριστούν το συμπιεσμένο περιεχόμενο, οπότε ο διακομιστής μπορεί να συμπιέσει το έγγραφο και να στείλει το μικρότερο έγγραφο μέσω του δικτύου, ενώ ο φυλλομετρητής θα "αναστρέψει" αυτόματα τη συμπίεση (χωρίς την παρέμβαση του χρήστη) και θα χειριστεί το αποτέλεσμα με τον κανονικό τρόπο. Η αποστολή συμπιεσμένου περιεχομένου μπορεί να εξοικονομήσει σημαντικό χρόνο, αφού ο χρόνος που απαιτείται για τη συμπίεση του εγγράφου στο διακομιστή και την αποσυμπίεσή του στον πελάτη κατά κανόνα είναι μηδαμινός σε σύγκριση με το χρόνο κατεβάσματος που εξοικονομείται, ιδιαίτερα όταν χρησιμοποιούνται τηλεφωνικές συνδέσεις. Αν και οι περισσότεροι σύγχρονοι φυλλομετρητές υποστηρίζουν αυτή τη δυνατότητα, δεν ι- σχύει αυτό για όλους. Αν στείλετε συμπιεσμένο περιεχόμενο σε φυλλομετρητές που δεν υποστηρίζουν αυτή τη δυνατότητα, οι φυλλομετρητές δεν θα μπορούν καθόλου να εμφανίσουν τη σελίδα. Ευτυχώς, οι φυλλομετρητές που υποστηρίζουν αυτή τη λειτουργία το προσδιορίζουν με τον ορισμό της κεφαλίδας αίτησης Accept-Encoding. Στους φυλλομετρητές που υποστηρίζουν κωδικοποίηση περιεχομένου περιλαμβάνονται οι τελευταίες εκδόσεις του Netscape για το Unix,