Τα βασικά για 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
Βασικά Θέματα Τα Servlet στη μεγάλη εικόνα J2EE Οι μηχανισμοί αίτησης και απάντησης Κύκλος ζωής Servlet Εμβέλεια αντικειμένων Servlet Αιτήσεις Servlet Απαντήσεις: Κατάσταση, επικεφαλίδα, σώμα Χειρισμός λαθών 3
Τα Servlet στη μεγάλη εικόνα J2EE 4
J2EE 1.2 Architecture An extensible Web technology that uses template data, custom elements, scripting languages, and server-side Java objects to return dynamic content to a client. Typically the template data is HTML or XML elements. The client is often a Web browser. Java Servlet A Java program that extends the functionality of a Web server, generating dynamic content and interacting with Web clients using a request-response paradigm. 5
Που ζουντα Servlet και JSP? Web Tier EJB Tier 6
Τι είναι Servlet; Αντικείμενα Java που είναι βασισμένα στο πλαίσιο και APIs των servlet τα οποία επεκτείνουν τη λειτουργία ενός εξυπηρετητή HTTP. Αντιστοιχίζονται με URLs και διαχειρίζεται από ένα container με απλή αρχιτεκτονική Είναι διαθέσιμη σε όλους τους εξυπηρετητές δικτύου και εφαρμογών Είναι ανεξάρτητα πλατφόρμας και εξυπηρετητή 7
Πρώτο παράδειγμα Servlet Public class HelloServlet extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response){ response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); out.println("<title>hello World!</title>"); }... } 8
Servlet CGI Γραμμένα σε C, C++, Visual Basic ή Perl Δύσκολα σε διαχείριση & επέκταση Πιθανά προβλήματα ασφαλείας την γλώσσας υλοποίησης Απαιτούν πολλούς πόρους Τρέχουν σε συγκεκριμένη πλατφόρμα και εφαρμογή Servlet Γραμμένασε Java Αποδοτικά και αξιόπιστα Εύκολασε διαχείριση, επαναχρησιμοποίηση & επέκταση (βασίζονται σε αρθρώματα) Βασίζονται στην εγγενή ασφάλειατης Java Ανεξάρτητα πλατφόρμας 9
Servlet vs. CGI Request Request CGI1 CGI1 Request Request CGI2 CGI2 Request Request CGI1 CGI1 CGI CGI Based Based Webserver Webserver Child Child for for CGI1 CGI1 Child Child for for CGI2 CGI2 Child Child for for CGI1 CGI1 Request Request Servlet1 Servlet1 Servlet Servlet Based Based Webserver Webserver Request Request Servlet2 Servlet2 Request Servlet1 JVM JVM Servlet1 Servlet1 Servlet2 Servlet2 10
Πλεονεκτήματα των Servlet Δεν έχουν τους περιορισμούς των CGI Όλοι οι εξυπηρετητές διαδικτύου τα υποστηρίζουν Προσφέρουν πρόσβαση σε όλα τα Java APIs Αξιόπιστα, αποδοτικά και επεκτάσιμα Ανεξάρτητα πλατφόρμα και εξυπηρετητή Ασφαλή Οι περισσότεροι εξυπηρετητές επιτρέπουν την αυτόματη επαναφόρτωση τους με εντολή του διαχειριστή όταν ενημερωθούν 11
Τι είναι ητεχνολογία JSP; Επιτρέπει τον διαχωρισμό της επιχειρησιακής λογικής από το επίπεδο παρουσίασης Το επίπεδο παρουσίασης είναι σε μορφή HTML ή XML/XSLT Ηεπιχειρησιακή λογική υλοποιείται σαν Java Beans ή custom tags Καλύτερη διαχείριση και επαναχρησιμοποίηση Επεκτάσιμη με custom tags Βασίζεται στην τεχνολογία Servlet 12
Τι είναι σελίδα JSP; Ένα αρχείο κειμένου το οποίο παράγει δυναμικό περιεχόμενο και το στέλνει στους χρήστες Περιέχει στατικά και δυναμικά στοιχεία Στατικά: HTML, XML Δυναμικά: scriptlets, JavaBeans, custom tags 13
Παράδειγμα JSP <html> Hello World! <br> <jsp:usebean id="clock" class= calendar.jspcalendar /> Today is <ul> <li>day of month: <%= clock.getdayofmonth() %> <li>year: <%= clock.getyear() %> </ul> </html> 14
JSP Servlets JSP Η Java παράγει HTML Κάθε είδος δεδομένων Δεν είναι εύκολο να φτιάξεις σελίδα διαδικτύου Κώδικας παρόμοιος με Java στην HTML Δομημένο κείμενο Πολύ εύκολο να φτιάξεις σελίδα διαδικτύου Οκώδικας μεταγλωττίζεται σε servlet 15
Πλεονεκτήματα JSP Το περιεχόμενο και ηλογική παρουσίασης χωρίζονται Εύκολη υλοποίηση με JSP, JavaBeans και custom tags Υποστηρίζει επαναχρησιμοποίηση λογισμικού με χρήση components Μεταγλωττίζονται αυτόματα όταν γίνουν αλλαγές στον πηγαίο κώδικα Ευκολότερο να φτιάξουμε σελίδες διαδικτύου Ανεξάρτητο πλατφόρμας 16
Πότε χρησιμοποιούμε Servlet αντί JSP Θέλουμε να επεκτείνουμε τον εξυπηρετητή διαδικτύου ώστε να υποστηρίζει ένα νέο είδος αρχείων Να παράγουμε αντικείμενα τα οποία δεν περιέχουν HTML (διαγράμματα, γραφικές παραστάσεις κλπ) Αποφεύγετε να επιστρέφετε HTML απευθείας από τα servlets 17
Πρέπει να χρησιμοποιώ Servlet ή JSP; Συνήθως τα servlet και JSP χρησιμοποιούνται μαζί Αρχιτεκτονική MVC (Model, View, Controller) Τα Servlet παίζουν το ρόλο Controller Τα JSP παίζουν το ρόλο View 18
Οι μηχανισμοί αίτησης και απάντησης των servlet 19
To μοντέλοαίτησηςκαι απάντησης Servlet Container Request Browser HTTP Request Servlet Response Web Server Response 20
Πωςεκκινείτε και τι κάνει ένα Servlet; Το πλαίσιο εκτέλεσης, βάση του web.xml, διασύνδεει την αίτηση με ένα URL που αντιστοιχεί σε κάποιο servlet To servlet δέχεται τα αιτήματα των πελατών (κατά βάση σε μορφή αίτησης HTTP) HTTPServletRequest Διαβάζει τα δεδομένα από την αίτηση Παράγει το περιεχόμενο ήυλοποιεί την επιχειρησιακή λογική με πιθανή Σύνδεση με βάση δεδομένων Εκτέλεση EJBs κλπ Δημιουργία της απάντησης (κατά βάση σε μορφή HTTP) ή προώθηση σε ένα άλλο servlet ή σέλίδα JSP 21
Αίτηση και απάντηση Τι περιέχει ηαίτηση; Πληροφορίες από τον πελάτη στον εξυπηρετητή Ποιος έκανε την αίτηση Τα δεδομένα του χρήστη Επικεφαλίδες HTTP Τι περιέχει ηαπάντηση; Πληροφορίες από τον εξυπηρετητή στον πελάτη Κείμενο(html, απλό) ή binary(εικόνες) Επικεφαλίδες HTTP, cookies, κλπ 22
HTTP Η αίτηση HTTP περιέχει Επικεφαλίδα Μια μέθοδο Get: Τα δεδομένα του χρήστη περιέχονται μέσα στο URL Post: Τα δεδομένα του χρήστη περιέχονται στο σώμα του μηνύματος Put Header Τα αιτούμενα δεδομένα 23
HTTP GET και POST Αίτηση GET: Τα δεδομένα του χρήστη προστίθενται στο URL Μπορεί να στείλει περιορισμένη ποσότητα πληροφοριών.../servlet/viewcourse?firstname=τάκης&lastname= Αλεφραγκής Αίτηση POST: Τα δεδομένα του χρήστη στέλνονται σαν δεδομένα Μπορείς να στείλεις οποιαδήποτε ποσότητα πληροφοριών 24
Ξανά Πρώτο Servlet import javax.servlet.*; import javax.servlet.http.*; import java.io.*; Public class HelloServlet extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); out.println("<title>first Servlet</title>"); out.println("<big>hello Code Camp!</big>"); } } 25
Διεπαφές & Κλάσης Servlet 26
Διεπαφέςκαι κλάσεις Servlet Κλάσεις Servlet Διεπαφές GenericServlet HttpSession HttpServlet ServletRequest ServletResponse HttpServletRequest HttpServletResponse 27
Κύκλος ζωής των Servlet 28
Κύκλοςζωής Servlet Is Servlet Loaded? init() Http request No Load Invoke Http response Yes Servlet Container Run Servlet Client Server 29
Οι μέθοδοι στο κύκλο ζωήςτων Servlet service( ) init( ) Init parameters Ready destroy( ) doget( ) dopost( ) Request parameters 30
Οιμέθοδοι στοκύκλοζωής των Servlet Καλούνται από τον container Ο Container ελέγχει τον κύκλο ζωής τους Ορίζονται στην κλάση javax.servlet.genericservlet init() destroy() service() - abstract javax.servlet.http.httpservlet doget(), dopost(), doxxx() service() - υλοποίηση 31
Οι μέθοδοι στο κύκλο ζωήςτων Servlet init() Καλείται μία φορά κατά την πρώτη δημιουργία αντικειμένου Κάνουμε αρχικές ρυθμίσεις Π.χ. κάνουμε σύνδεση με την βάση δεδομένων destroy() Καλείται όταν καταστρέφεται ένα αντικείμενο Κάνει απελευθέρωση πόρων Π.χ. κλείνει την σύνδεση με την βάση δεδομένων 32
Παράδειγμα: init() από CatalogServlet.java public class CatalogServlet extends HttpServlet { private BookDB bookdb; // Perform any one-time operation for the servlet, // like getting database connection object. } // Note: In this example, database connection object is assumed // to be created via other means (via life cycle event mechanism) // and saved in ServletContext object. This is to share a same // database connection object among multiple servlets. public void init() throws ServletException { bookdb = (BookDB)getServletContext(). getattribute("bookdb"); if (bookdb == null) throw new UnavailableException("Couldn't get database."); }... 33
Παράδειγμα: init() που διαβάζει παραμέτρους ρυθμίσεων από το web.xml public void init(servletconfig config) throws ServletException { super.init(config); String driver = getinitparameter("driver"); String furl = getinitparameter("url"); try { opendbconnection(driver, furl); } catch (SQLException e) { e.printstacktrace(); } catch (ClassNotFoundException e){ e.printstacktrace(); } } 34
Παράμετροι αρχικοποίησηςστο web.xml <web-app> <servlet> <servlet-name>chart</servlet-name> <servlet-class>chartservlet</servlet-class> <init-param> <param-name>driver</param-name> <param-value> COM.cloudscape.core.RmiJdbcDriver </param-value> </init-param> <init-param> <param-name>url</param-name> <param-value> jdbc:cloudscape:rmi:cloudscapedb </param-value> </init-param> </servlet> </web-app> 35
Παράδειγμα: destroy() public class CatalogServlet extends HttpServlet { private BookDB bookdb; } public void init() throws ServletException { bookdb = (BookDB)getServletContext(). getattribute("bookdb"); if (bookdb == null) throw new UnavailableException("Couldn't get database."); } public void destroy() { bookdb = null; }... 36
Οιμέθοδοι στοκύκλοζωής των Servlet service() στην κλάση javax.servlet.genericservlet Abstract service() στην κλάση javax.servlet.http.httpservlet πλήρης (υλοποιήσιμη) Καλεί τις doget(), dopost() κλπ ΜΗΝ επανορίσετε αυτή την μέθοδο! doget(), dopost(), doxxx() στην κλάση javax.servlet.http.httpservlet Διαχειρίζονται αιτήσεις HTTP GET, POST, κλπ Επανορίσετε αυτές τις μεθόδους στα δικά σας servlet για να ορίσετε την αντίστοιχη συμπεριφορά 37
service() & doget()/dopost() service() παίρνει σαν παραμέτρους γενικές αιτήσεις και απαντήσεις: service(servletrequest request, ServletResponse response) doget() ή dopost() παίρνει σαν παραμέτρους HTTP αιτήσεις και απαντήσεις: doget(httpservletrequest request, HttpServletResponse response) dopost(httpservletrequest request, HttpServletResponse response) 38
Μέθοδος service() Server GenericServlet subclass Request Subclass of GenericServlet class Service( ) Response Key: Implemented by subclass 39
doget() & dopost() Server HttpServlet subclass Request doget( ) Service( ) Response dopost( ) Key: Implemented by subclass 40
Τι κάνουν οι doget() & dopost(); Διάβασμα δεδομένων χρήστη (HTTP parameter) από το αίτημα HTTP Set (Save) και get (read) χαρακτηριστικά από/στα αντικείμενα scope Να υλοποιηθεί επιχειρησιακή λογική ή πρόσβαση σε μια βάση δεδομένων Προώθηση του αιτήματος σε άλλα αρθρώματα (Servlet ή JSP) Συμπλήρωση απάντησης HTTP και αποστολή στον πελάτη 41
Παράδειγμα: Απλό doget() import javax.servlet.*; import javax.servlet.http.*; import java.io.*; Public class HelloServlet extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { // Just send back a simple HTTP response response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); out.println("<title>first Servlet</title>"); out.println("<big>hello J2EE Programmers! </big>"); } } 42
Παράδειγμα: Προχωρημένο doget() public void doget (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Read session-scope attribute message 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 (Populate the header part of 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); 43
Παράδειγμα: Προχωρημένο doget() // Get the identifier of the book to display (Get HTTP parameter) String bookid = request.getparameter("bookid"); if (bookid!= null) { // and the information about the book (Perform business logic) try { BookDetails bd = bookdb.getbookdetails(bookid); Currency c = (Currency)session.getAttribute("currency"); if (c == null) { c = new Currency(); c.setlocale(request.getlocale()); session.setattribute("currency", c); } c.setamount(bd.getprice()); // Print out the information obtained out.println("..."); } catch (BookNotFoundException ex) { response.resetbuffer(); throw new ServletException(ex); } } } out.println("</body></html>"); out.close(); 44
Πως φτιάχνουμε τηναπάντηση HTTP Φτιάχνουμε την επικεφαλίδες Ορίζουμε κάποιες παραμέτρους Μέγεθος Buffer Παίρνουμε μια αναφορά σε αντικείμενο output stream από την απάντηση Γράφουμε το body στο output stream 45
Παράδειγμα: Απλή Απάντηση Public class HelloServlet extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { // Fill response headers response.setcontenttype("text/html"); // Set buffer size response.setbuffersize(8192); // Get an output stream object from the response PrintWriter out = response.getwriter(); // Write body content to output stream out.println("<title>first Servlet</title>"); out.println("<big>hello J2EE Programmers! </big>"); } } 46
Αντικείμενα εμβέλειας (Scope Objects) 47
Αντικείμενα εμβέλειας Επιτρέπει το μοίρασμα πληροφοριών ανάμεσα σε συνεργαζόμενα αρθρώματα μέσω χαρακτηριστικών που διατηρούνται σε αντικείμενα εμβέλειας Τα χαρακτηριστικά είναι ζεύγη ονόματος/αντικειμένου Ηπροσπέλαση των χαρακτηριστικών γίνεται με κλήσεις των μεθόδων getattribute() & setattribute() Ορίζονται 4 αντικείμενα εμβέλειας Web context, session, request, page 48
Αντικείμεναεμβέλειας: Προσβασιμότητα Web context (ServletConext) Προσβάσιμο από τα αρθρώματα μια εφαρμογής Session Προσβάσιμο από τα αρθρώματα τα οποία διαχειρίζονται μία αίτηση μιας συγκεκριμένης σύνδεσης Request Προσβάσιμο από τα αρθρώματα τα οποία διαχειρίζονται μία αίτηση Page Προσβάσιμοαπότηνσελίδα JSP ηοποίαδημιουργεί τα αντικείμενα 49
Αντικείμενα εμβέλειας: Κλάσεις Web context javax.servlet.servletcontext Session javax.servlet.http.httpsession Request Υποκλάσης της javax.servlet.servletrequest: javax.servlet.http.httpservletrequest Page javax.servlet.jsp.pagecontext 50