Τα βασικά για Servlet (Μέρος β) 1
Αναφορές Ηπαρουσίαση βασίστηκε Σε διαφάνειες και παραδείγματα από το τμήμα Servlet του Java WSDP από τον Stephanie Bodoff της Sun Microsystems Σε διαφάνειες από το τμήμα Sevlet από το υλικό του Doris Chen της Sun Microsystems Μερικά παραδείγματα από το βιβλίο Core Servlets and JavaServer Pages του Marty Hall Στις διαφάνειες για Basic Servlets του Shang Shin 2
Αντικείμενα εμβέλειας (Scope Objects) 3
Αντικείμενα εμβέλειας Επιτρέπει το μοίρασμα πληροφοριών ανάμεσα σε συνεργαζόμενα αρθρώματα μέσω χαρακτηριστικών που διατηρούνται σε αντικείμενα εμβέλειας Τα χαρακτηριστικά είναι ζεύγη ονόματος/αντικειμένου Ηπροσπέλαση των χαρακτηριστικών γίνεται με κλήσεις των μεθόδων getattribute() & setattribute() Ορίζονται 4 αντικείμενα εμβέλειας Web context, session, request, page 4
Αντικείμεναεμβέλειας: Προσβασιμότητα Web context (ServletContext) Προσβάσιμο από τα αρθρώματα μια εφαρμογής Session Προσβάσιμο από τα αρθρώματα τα οποία διαχειρίζονται μία αίτηση μιας συγκεκριμένης σύνδεσης Request Προσβάσιμο από τα αρθρώματα τα οποία διαχειρίζονται μία αίτηση Page Προσβάσιμοαπότηνσελίδα JSP ηοποίαδημιουργεί τα αντικείμενα 5
Αντικείμενα εμβέλειας: Κλάσεις Web context javax.servlet.servletcontext Session javax.servlet.http.httpsession Request Υποκλάσης της javax.servlet.servletrequest: javax.servlet.http.httpservletrequest Page javax.servlet.jsp.pagecontext 6
Web Context (ServletContext) 7
Που χρησιμεύει το ServletContext; Χρησιμοποιείται από τα servlets για Να διαβάσει είναι να θέσει τιμές σε χαρακτηριστικά που επηρεάζουν ολόκληρη την εφαρμογή Να ζητήσουν αναφορά στον διεκπεραιωτή αιτήσεων Για προώθηση αιτήματος ήσυμπερίληψη απαντήσεων άλλων αρθρωμάτων Να αποκτήσουν πρόσβαση σε παραμέτρους αρχικοποίησης του αρχείου web.xml Πρόσβαση σε σχετιζόμενους πόρους διαδικτύου Καταγραφή (Log) 8
Εμβέλεια ServletContext Εμβέλεια Context Μοιράζεται από όλα τα servlets και σελίδες JSP pages μιας «κατανεμημένης εφαρμογής διαδικτύου" Για αυτό και λέγεται web application scope Μια «εφαρμογή διαδικτύου» είναι μια συλλογή από servlets και υλικού παρουσίασης εγκατεστημένο κάτω από ένα χώρο του εξυπηρετητή συνδεδεμένο με ένα URL που μπορεί να εγκατασταθεί και σε ένα αρχείο war Όλα τα servlets της εφαρμογής BookStore web μοιράζονται το ίδιο αντικείμενο ServletContext Υπάρχει ένα αντικείμενο ServletContext για κάθε «εφαρμογή διαδικτύου» για κάθε Java Virtual Machine 9
ServletContext: Web Application Scope Client 1 server ServletContext application Client 2 10
Πωςαποκτούμε πρόσβαση στο αντικείμενο ServletContext; Μέσα από κώδικα servlet, καλούμε getservletcontext() Μέσα από κώδικα servlet filter, καλούμε getservletcontext() Το ServletContext περιέχεται σε ένα αντικείμενο ServletConfig, το οποίο παρέχεται από τον εξυπηρετητή διαδικτύου στο servlet όταν αρχικοποιείται το servlet init (ServletConfig servletconfig) στο Servlet interface 11
Παράδειγμα: Προσπελαύνοντας χαρακτηριστικά του ServletContext public class CatalogServlet extends HttpServlet { private BookDB bookdb; public void init() throws ServletException { // Get context-wide attribute value from // ServletContext object bookdb = (BookDB)getServletContext(). getattribute("bookdb"); if (bookdb == null) throw new UnavailableException("Couldn't get database."); } } 12
Παράδειγμα: Προσπελαύνοντας και χρησιμοποιώντας το αντικείμενο RequestDispatcher public void doget (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getsession(true); ResourceBundle messages = (ResourceBundle)session.getAttribute("messages"); // set headers and buffer size before accessing the Writer response.setcontenttype("text/html"); response.setbuffersize(8192); PrintWriter out = response.getwriter(); // then write the response out.println("<html>" + "<head><title>" + messages.getstring("titlebookdescription") + "</title></head>"); // Get the dispatcher; it gets the banner to the user RequestDispatcher dispatcher = getservletcontext().getrequestdispatcher("/banner"); if (dispatcher!= null) dispatcher.include(request, response);... 13
Παράδειγμα: Logging public void doget (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {... getservletcontext().log( Life is good! );... getservletcontext().log( Life is bad!, someexception); 14
Session (HttpSession) 15
Γιατί HttpSession; Χρειαζόμαστε ένα μηχανισμό για να διατηρούμε την κατάσταση του πελάτη κατά την διάρκεια μιας ακολουθίας αιτημάτων από τον ίδιο χρήστη (ή από τον ίδιο browser) για ένα χρονικό διάστημα Παράδειγμα: Καλάθι αγορών Όμως,το HTTP είναι stateless To HttpSession διατηρεί την κατάσταση του πελάτη Χρησιμοποιείται από τα Servlets για να θέσουν(set) και να πάρουν(get) τα χαρακτηριστικά την σύνδεσης 16
Πωςπροσπελαύνουμετο HttpSession; Μέσω της getsession() πάνω σε ένα αντικείμενο Request (HttpServletRequest) 17
Παράδειγμα: HttpSession public class CashierServlet extends HttpServlet { public void doget (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Get the user's session and shopping cart HttpSession session = request.getsession(); ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");... // Determine the total price of the user's books double total = cart.gettotal(); 18
Servlet Request (HttpServletRequest) 19
Τι είναι Servlet Request; Περιέχει δεδομένα από τον πελάτη στον εξυπηρετητή Όλα τα αιτήματα servlet υλοποιούν το ServletRequest interface το οποίο ορίζει μεθόδους για Πέρασμα παραμέτρων από την εφαρμογή πελάτη Παραμέτρους αντικειμένων (Object-valued attributes) Locales Τον πελάτη και τον εξυπηρετητή Input stream Πληροφορίες για το πρωτόκολλο Είδος περιεχομένου (Content type) Αν η αίτηση έγινε από ασφαλές κανάλι (HTTPS) 20
Αιτήματα δεδομένα, πελάτης, εξυπηρετητής, επικεφαλίδα, σε ποιο servlet απευθύνετε Request Servlet 1 Servlet 2 Response Servlet 3 Web Server 21
Πρόσβασηστις παραμέτρουςπελάτη Ένα αίτημα μπορεί να έρθει με πολλές παραμέτρους Οι παράμετροι προέρχονται από φόρμες HTML: GET: παρόμοιο με query, προστίθενται στο τέλος ενός URL POST: σαν κωδικοποιημένα δεδομένα, δεν εμφανίζονται στο URL getparameter("paraname") Επιστρέφει την τιμή της παραμέτρου Επιστρέφει null αν δεν υπάρχει αυτή η παράμετρος Λειτουργεί με τον ίδιο τρόπο για GET και POST 22
Ένα παράδειγμα FORM με GET <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>Collecting Three Parameters</TITLE> </HEAD> <BODY BGCOLOR="#FDF5E6"> <H1 ALIGN="CENTER">Please Enter Your Information</H1> <FORM ACTION="/sample/servlet/ThreeParams"> First Name: <INPUT TYPE="TEXT" NAME="param1"><BR> Last Name: <INPUT TYPE="TEXT" NAME="param2"><BR> Class Name: <INPUT TYPE="TEXT" NAME="param3"><BR> <CENTER> <INPUT TYPE="SUBMIT"> </CENTER> </FORM> </BODY> </HTML> 23
Ένα παράδειγμα FORM με GET 24
Έναπαράδειγμα FORM με Servlet: Get import java.io.*; import javax.servlet.*; import javax.servlet.http.*; /** Simple servlet that reads three parameters from the html form */ public class ThreeParams extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); String title = "Your Information"; out.println("<html>" + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=CENTER>" + title + "</H1>\n" + "<UL>\n" + " <LI><B>First Name in Response</B>: " + request.getparameter("param1") + "\n" + " <LI><B>Last Name in Response</B>: " + request.getparameter("param2") + "\n" + " <LI><B>NickName in Response</B>: " + request.getparameter("param3") + "\n" + "</UL>\n" + "</BODY></HTML>"); } } 25
Έναπαράδειγμα FORM με Servlet: POST <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>A Sample FORM using POST</TITLE> </HEAD> <BODY BGCOLOR="#FDF5E6"> <H1 ALIGN="CENTER">A Sample FORM using POST</H1> <FORM ACTION="/sample/servlet/ShowParameters" METHOD="POST"> Item Number: <INPUT TYPE="TEXT" NAME="itemNum"><BR> Quantity: <INPUT TYPE="TEXT" NAME="quantity"><BR> Price Each: <INPUT TYPE="TEXT" NAME="price" VALUE="$"><BR> First Name: <INPUT TYPE="TEXT" NAME="firstName"><BR> <TEXTAREA NAME="address" ROWS=3 COLS=40></TEXTAREA><BR> Credit Card Number: <INPUT TYPE="PASSWORD" NAME="cardNum"><BR> <CENTER> <INPUT TYPE="SUBMIT" VALUE="Submit Order"> </CENTER> </FORM> </BODY> </HTML> 26
Έναπαράδειγμα FORM με Servlet: POST 27
Έναπαράδειγμα FORM με Servlet: POST import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ShowParameters extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException {... } public void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { } } doget(request, response); 28
Ποιοςθέτει τιμές σταχαρακτηριστικά; Τα χαρακτηριστικά μπορούν να τεθούν με δύο τρόπους Ο container που ζει το Servlet μπορεί να θέσει κάποια εξειδικευμένα χαρακτηριστικά Παράδειγμα: javax.servlet.request.x509certificate για HTTPS Το ίδιο το Servlet μπορεί να θέσει χαρακτηριστικά που σχετίζονται με την εφαρμογή void setattribute(java.lang.string name, java.lang.object o) Ορίζονται μέσα στο αίτημα πρις την κλήση του RequestDispatcher 29
Πωςπροσπελαύνουμετοπικές πληροφορίες (Locale); public void doget (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getsession(); ResourceBundle messages = (ResourceBundle)session.getAttribute("messages"); if (messages == null) { Locale locale=request.getlocale(); messages = ResourceBundle.getBundle( "messages.bookstoremessages", locale); session.setattribute("messages", messages); } 30
Πως προσπελαύνουμε τοπικές πληροφορίες γιατην εφαρμογή πελάτη; String request.getremoteaddr() Διεύθυνση IP String request.getremotehost() Το όνομα του υπολογιστή 31
Πως προσπελαύνουμε πληροφορίες για τον εξυπηρετητή String request.getservername() Π.χ. "www.sun.com" int request.getserverport() Π.χ. Θύρα πρόσβασης "8080" 32
Άλλεςπληροφορίες Input stream ServletInputStream getinputstream() java.io.bufferedreader getreader() Πρωτόκολλο java.lang.string getprotocol() Τύπος περιεχομένου java.lang.string getcontenttype() Είναι ασφαλής η σύνδεση (αν γίνεται χρήση HTTPS ή όχι) boolean issecure() 33
HTTPServletRequest 34
Τι είναι HTTP Servlet Request? Περιέχει δεδομένα από ένα πελάτη HTTP σε έναν εξυπηρετητή HTTP Δημιουργούνται από τον container και είναι παράμετροι των μεθόδων doget() ή dopost() HttpServletRequest είναι υποκλάση της ServletRequest και περιέχει μεθόδους για την πρόσβαση σε πληροφορίες για HTTP URL Context, servlet, διαδρομή, ερώτημα Πληροφορίες επικεφαλίδας αιτήματος Τύπος Επιβεβαίωση χρήστη και ασφάλεια Cookies Συνεδρία (Session) 35
HTTP URL Περιέχει τα τμήματα http://[host]:[port]/[request path]?[query string] 36
HTTP URL: [request path] http://[host]:[port]/[request path]?[query string] Η διαδρομή [request path] αποτελείτε άπό Context: /<εφαρμογή> Όνομα Servlet: /<άρθρωμα> Άλλες πληροφορίες διαδρομής Παραδείγματα http://localhost:8080/hello1/greeting http://localhost:8080/hello1/greeting.jsp http://daydreamer/catalog/lawn/index.html 37
HTTP URL: [query string] http://[host]:[port]/[request path]?[query string] [query string] αποτελείται από παραμέτρους και τιμές που έθεσε οχρήστης Υπάρχουν δύο τρόποι παραγωγής Να περιέχεται άμεσα σε μία ιστοσελίδα <a href="/bookstore1/catalog?add=101">add To Cart</a> String bookid = request.getparameter("add"); Να περιέχεται έμμεσα σε ένα URL μέσω ενός GET http://localhost/hello1/greeting?username=monica+clinton String username=request.getparameter( username ) 38
Μέθοδοι Context, Path, Query, Parameter String getcontextpath() String getquerystring() String getpathinfo() String getpathtranslated() 39
Επικεφαλίδα HTTP Request Περιέχει επιπλέον πληροφορίες για το ερώτημα Παράδειγμα μιας επικεφαλίδας HTTP 1.1 Request: GET /search? keywords= servlets+ jsp HTTP/ 1.1 Accept: image/ gif, image/ jpg, */* Accept-Encoding: gzip Connection: Keep- Alive Cookie: userid= id456578 Host: www.sun.com Referer: http:/www.sun.com/codecamp.html User-Agent: Mozilla/ 4.7 [en] (Win98; U) 40
Επικεφαλίδα HTTP Request Accept Τι τύπους MIME μπορεί να χειριστεί ο φυλλομετρητής Accept-Encoding Περιγράφει τους τρόπους κωδικοποίησης (π.χ., gzip ή compress) Authorization Όνομα χρήστη για προστατευμένες σελίδες Καλύτερα χρησιμοποιήστε HTML forms για την αποστολή username/password και αποθηκεύστε τα στο αντικείμενο session 41
Επικεφαλίδα HTTP Request Connection Στο HTTP 1.1, έχουμε μόνιμη σύνδεση Τα Servlet πρέπει να θέσουν το μήκος του περιεχομένου μέσω της μεθόδου setcontentlength (για να προσδιορίσουμε το μέγεθος μπορούμε να το πάρουμε από το ByteArrayOutputStream) Cookie Επιστρέφει τα cookies που είχε στείλει κάποια στιγμή ο εξυπηρετητής στον πελάτη Host Χρησιμοποιείστε την getcookies, όχι την getheader Περιγράφει τον εξυπηρετητή στο αρχικό URL. Απαιτείται στο HTTP 1.1. 42
Επικεφαλίδα HTTP Request If-Modified-Since Οπελάτης θέλει την σελίδα, αν αυτή έχει αλλάξει από την συγκεκριμένη ημερομηνία. Καλύτερα χρησιμοποιείστε την μέθοδο getlastmodified Referer Το URL της σελίδας αναφοράς. Χρήσιμο για ιχνηλάτησα φορτίου User-Agent Ένα String για τον προσδιορισμό του φυλλομετρητή Προσοχή στην χρήση του! 43
Μέθοδοι Επικεφαλίδας HTTP Request String getheader(java.lang.string name) Επιστρέφει την επικεφαλίδα ως String java.util.enumeration getheaders(java.lang.string name) Επιστρέφει την τιμή header request java.util.enumeration getheadernames() Επιστρέφει τα ονόματα των header request int getintheader(java.lang.string name) Επιστρέφει την τιμή σαν int 44
Τυπώνονταςτα Request Headers //Shows all the request headers sent on this particular request. 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"; out.println("<html>" +... "<B>Request Method: </B>" + request.getmethod() + "<BR>\n" + "<B>Request URI: </B>" + request.getrequesturi() + "<BR>\n" + "<B>Request Protocol: </B>" + request.getprotocol() + "<BR><BR>\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)); 45
Request Headers Sample 46
Μέθοδοι πιστοποίησης χρήστη και ασφάλειας String getremoteuser() Επιστρέφει το όνομα χρήστη αν το servlet προστατεύεται με password ή null String getauthtype() Επιστρέφει την μέθοδο πιστοποίησης χρήστη αν το servlet προστατεύεται boolean isuserinrole(java.lang.string role) Μπορεί οχρήστης να παίξει τον συγκεκριμένο ρόλο; 47
Ημέθοδοςπροσπέλασηςτων Cookie στο HTTPServletRequest Cookie[] getcookies() Επιστρέφει ένα πίνακα με όλα τα αντικείμενα Cookie τα οποία έστειλε οπελάτης με το αίτημα 48
Servlet Response (HttpServletResponse) 49
Τι είναι Servlet Response? Περιέχει τα δεδομένα που στέλνει το servlet στον πελάτη Όλα τα servlet response υλοποιούν την διεπαφή ServletResponse Παρέχει πρόσβαση σε ένα output stream Ορίζει τύπο περιεχομένου Ορίζει να πρέπει να γίνει χρήση buffer για το αποτέλεσμα Ορίζει τοπικές πληροφορίες HttpServletResponse υποκλάση της ServletResponse Κώδικας κατάστασης HTTP response Cookies 50
Responses Request Servlet 1 Response Structure: status code, headers and body. Response Servlet 2 Servlet 3 Web Server 51
Δομή Response Status Code Response Headers Response Body 52
Κώδικας κατάστασης Http Response 53
Κώδικας κατάστασης HTTP Response Που χρησιμεύει Να προωθήσει τον πελάτη σε άλλη σελίδα Να δείξει ότι λείπει ένας πόρος Να πει στον φυλλομετρητή να χρησιμοποιήσει ένα cached αντίγραφό 54
Μέθοδοι για να θέτουμε των κώδικακατάστασης HTTP Response public void setstatus(int statuscode) Οι κωδικοί κατάστασης ορίζονται στο HttpServletResponse Οι κωδικοί κατάστασης χωρίζονται σε κατηγορίες: 100-199 Πληροφοριακές 200-299 Επιτυχίας 300-399 Προώθησης 400-499 Ημιτελής απάντηση 500-599 Σφάλμα εξυπηρετητή Προορισμενός κωδικός είναι ο200 (OK) 55
Παράδειγμα κωδικού κατάστασης HTTP Response HTTP/ 1.1 200 OK Content-Type: text/ html <! DOCTYPE...> <HTML... </ HTML> 56
Common Status Codes 200 (SC_OK) Success and document follows Default for servlets 204 (SC_No_CONTENT) Success but no response body Browser should keep displaying previous document 301 (SC_MOVED_PERMANENTLY) The document moved permanently (indicated in Location header) Browsers go to new location automatically 57
Common Status Codes 302 (SC_MOVED_TEMPORARILY) Note the message is "Found" Requested document temporarily moved elsewhere (indicated in Location header) Browsers go to new location automatically Servlets should use sendredirect, not setstatus, when setting this header 401 (SC_UNAUTHORIZED) Browser tried to access password- protected page without proper Authorization header 404 (SC_NOT_FOUND) No such page 58
Μέθοδοι αποστολήςσφάλματος Οι κωδικοί (400-599) μπορούν να χρησιμοποιηθούν στην μέθοδο senderror public void senderror(int sc) Οεξυπηρετητής μπορεί να χειριστεί με ειδικό τρόπο το σφάλμα public void senderror(int code, String message) Προσθέτει και ένα μήνυμα σαν αρχείο HTML 59
setstatus() & senderror() try { returnafile(filename, out) } catch (FileNotFoundException e) { response.setstatus(response.sc_not_found); out.println("response body"); } has same effect as try { returnafile(filename, out) } catch (FileNotFoundException e) { response.senderror(response.sc_not_found); } 60
Η επικεφαλίδα του Http Response 61
Τι περιέχειμια επικεφαλίδα HTTP Response; Περιέχει διεύθυνση προώθησης Ορίζει τα cookies Παρέχει το χρόνο μεταβολής της σελίδας Ορίζει το διάστημα που πρέπει να ξαναφορτωθεί ησελίδα από τον φυλλομετρητή Παρέχει το μέγεθος του αρχείου για να υπάρχει μόνιμη σύνδεση HTTP Παρέχει τον τύπο του αρχείου Άλλα 62
Μέθοδοι ορισμού εξειδικευμένων Response Headers public void setheader( String headername, String headervalue) public void setdateheader( String name, long millisecs) Μετασχηματίζει το χρόνο από 1/1/1970 σε αλφαριθμητικό με μορφή GMT public void setintheader( String name, int headervalue) Θέτει την επικεφαλίδα με το αντίστοιχο String του ακεραίου addheader, adddateheader, addintheader Προσθέτει νέα επικεφαλίδα αντί αν αντικαθιστά 63
Μέθοδοι ορισμού συνηθισμένων Response Headers setcontenttype Ορίζει τον τύπο του περιεχομένου. Τα Servlets σχεδόν πάντα το χρησιμοποιούν. setcontentlength Ορίζει τον μήκος του περιεχομένου. Χρησιμοποιείται από μόνιμες συνδέσεις HTTP addcookie Προσθέτει ένα Cookie sendredirect Ορίζει το σημείο προώθησης και αλλάζει τον κωδικό απάντησης 64
Συνηθισμένα HTTP 1.1 Response Headers Location Ορίζει τη νέα διεύθυνση. Χρησιμοποιείστε την sendredirect αντί να το θέσετε άμεσα. Refresh Ορίζει τον χρόνο ανανέωσης της σελίδας. Set-Cookie Τα cookies που πρέπει να θυμάται ο φυλλομετρητής Χρησιμοποιείστε την addcookie αντί να το θέσετε άμεσα. 65
Συνηθισμένα HTTP 1.1 Response Headers Cache-Control (1.1) και Pragma (1.0) Μια τιμή no-cache απαγορεύει στο φυλλομετρητή να αποθηκεύσει προσωρινά (cache) την σελίδα. Στείλτε και τα δύο headers ή ελέγξτε την έκδοση του HTTP Content- Encoding Οτρόπος κωδικοποίησης του περιεχομένου. Οφυλλομετρητής αποκωδικοποιεί το περιεχόμενο πριν το χειριστεί σαν πληροφορία Content- Length Το μήκος της απάντησης. Χρησιμοποιείται για μόνιμες συνδέσεις HTTP. 66
Συνηθισμένα HTTP 1.1 Response Headers Content- Type Τι τύπος MIME επιστρέφετε. Χρησιμοποιείστε την setcontenttype. Last- Modified Τον χρόνο που άλλαξε ηαπάντηση Χρησιμοποιείστε την getlastmodified μην το θέσετε άμεσα. 67
Παράδειγμα:Refresh public class DateRefresh extends HttpServlet { public void doget(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { res.setcontenttype("text/plain"); PrintWriter out = res.getwriter(); res.setheader("refresh", "5"); out.println(new Date().toString()); } } 68
Σώμα Http Response 69
Γράφονταςτο σώμα της απάντησης Σχεδόν κάθε απάντηση ενός servlet almost πρέπει να περιέχει σώμα Το σώμα μπορεί να είναι ένας PrintWriter ήένα ServletOutputStream PrintWriter Χρησιμοποιεί response.getwriter() Είναι για απάντηση με κείμενο ServletOutputStream Χρησιμοποιεί response.getoutputstream() Είναι για απάντηση με binary (π.χ. image) 70
Χειρισμός σφαλμάτων 71
ΧειρισμόςΣφαλμάτων Ο container δημιουργεί αυτόματα μια σελίδα σφάλματος Μπορείτε να ορίσετε εξειδικευμένη σελίδα μέσα από το servlet Βήματα για τον χειρισμό σφάλματος Δημιουργείστε την/τις σελίδα/ες html για τον χειρισμό σφαλμάτων Αλλάξτε το web.xml για να αντιστοιχίσετε σφάλματα σε σελίδα 72
Παράδειγμα: Ορίζονταςσελίδες σφαλμάτων στο web.xml <error-page> <exception-type> exception.booknotfoundexception </exception-type> <location>/errorpage1.html</location> </error-page> <error-page> <exception-type> exception.booksnotfoundexception </exception-type> <location>/errorpage2.html</location> </error-page> <error-page> <exception-type>exception.orderexception</exception-type> <location>/errorpage3.html</location> </error-page> 73