Java: Kapitel 10 Einführung in die Java Platform, Enterpri Edition (Java EE): Servlets und Java Server Pages Programmentwicklung WS 2008/2009 Holger Röder holger.roeder@informatik.uni-stuttgart.de
Überblick über Kapitel 10 Überblick über die Java EE Statische und dynamische Web-Seiten, HTTP GET und POST Servlets Parameterzugriff Deployment von Web-Anwendungen Request- und Respon-Objekte Cookies Sitzungen Java Server Pages (JSP) Bestandteile von JSPs Integration von Servlets und JSPs 2
Überblick über die Java EE Die Java Platform, Enterpri Edition (Java EE; früher J2EE) ist eine Entwicklungsplattform für rverbasierte Java-Anwendungen. Java EE sieht ein verteiltes, mehrschichtiges und komponentenbasiertes Architekturmodell vor. Java EE ist insbesondere gut geeignet als Entwicklungsplattform für Web-Anwendungen. 3
Java EE Application Model Quelle: Sun Microsystems 4 Holger Röder
Java EE Server Infrastruktur Ein Java EE Application Server wird als Laufzeitumgebung für Java EE- Komponenten benötigt. Der Application Server stellt (häufig benötigte) Infrastruktur-Dienste für die eigentliche Anwendung bereit, z. B. Lebenszyklus-Verwaltung Sicherheit, Persistenz, Transaktionsverwaltung, Namens-/Verzeichnisdienste Kommunikation zwischen Komponenten Application Server umfasn meist zwei (logisch getrennte) Container: Web Container: Laufzeitumgebung für Java Server Pages und Servlets EJB Container: Laufzeitumgebung für Enterpri Java Beans Am Markt sind viele verschiedene Java EE Application Server verfügbar Vollständige Application Server: Sun Java System Application Server, IBM Websphere, Oracle, BEA WebLogic, JBoss etc. Nur Web Container: Apache Tomcat, Jetty etc. 5
Web-Container: Beispiel Apache Tomcat Apache Tomcat ist ein frei verfügbarer Web Container: Unterstützung für Servlets und JSPs Integrierter HTTP-Server Komplett in Java geschrieben, Open Source http://tomcat.apache.org/ 6
Statische vs. dynamische Web-Seiten Klassische statische Web-Seiten: <html> <title>... Alle Dokumente (z. B. HTML-Seiten, Grafiken) sind statisch und werden vom Web-Server an den Client (Web-Browr) übermittelt. Web-Server HTTP Request HTTP Respon Web-Browr Benutzer 7
Statische vs. dynamische Web-Seiten (2) Dynamische Web-Seiten: <html> <title>... Statisch vorliegende Dokumente (z. B. Grafiken) werden vom Web-Server direkt zurückgeliefert. Dynamische Web-Seiten werden im Web Container (des Application Servers) bei jeder Anfrage dynamisch erzeugt HTTP Request: Parameter Application Server, Web Container Web-Server Servlet oder JSP HTTP Request HTTP Respon HTTP Respon: Dynamischer Inhalt Datenzugriff Web-Browr Datenbank Benutzer 8
Java Servlets Überblick Mit Hilfe der Java Servlet API können dynamische Web-Seiten implementiert werden. Servlets sind Java-Objekte, deren Klas das Interface javax.rvlet.servlet implementiert. Servlets werden innerhalb eines Web Containers ausgeführt. Der Web Container übernimmt das Lebenszyklus-Management des Servlets (Instanziierung, Aufruf, Zerstörung). Servlets können prinzipiell beliebige Arten von Anfragen beantworten, die an den Server gestellt werden (Request-Respon-Prinzip). In der Praxis wird in den meisten Fällen die abstrakte Basisklas HttpServlet verwendet. Ein HttpServlet beantwortet HTTP- Anfragen, die z. B. durch einen Web-Browr gestellt werden. Servlets bekommen vom Client Parameter im Request-Objekt übergeben. Servlets erzeugen meistens HTML-Code, der als Antwort im Respon-Objekt an den Client zurückgeliefert wird. 9
Request-Respon-Prinzip Der Web-Browr ndet einen Request (mit Parametern) an den Web Container. Der Web Container ruft das Servlet auf und übergibt den Request. Request Respon Web Container Servlet Geschäftslogik (in Standard-Java implementiert) Das Servlet erstellt dynamisch die Folgeite und liefert die an den Web-Browr zurück. 10
Aufgaben des Servlets Request Aufgabe 1 Durchführung der im Request angeforderten Tätigkeiten Geschäftslogik anwenden, Daten speichern etc. Dynamische Erzeugung des Antwortdokuments Meistens HTML, Rückgabe über Respon-Objekt Aufgabe 2 Respon 11
Servlet-Hierarchie Wichtig: Java EE ist nur eine Spezifikation. Die eigentliche Implementierung der Klasn ist Teil des Application Servers. 12
Servlet-Lebenszyklus Als Laufzeitumgebung ist der Web Container ist für das Lebenszyklus- Management der Servlets verantwortlich. Bei der ersten Anfrage wird das Servlet zunächst geladen und initialisiert Aufruf der Methode init() des Servlets Alle Anfragen werden an die Servlet-Instanz weitergegeben Generisch (in der Schnittstelle Servlet definiert): rvice(servletrequest req, ServletRespon res) Vereinfachung für HTTP-Anfragen (in HttpServlet definiert): doget(httpservletrequest req, HttpServletRespon resp) dopost(httpservletrequest req, HttpServletRespon resp) Wird der Server oder das Servlet gestoppt, entfernt der Web Container die Servlet-Instanz. Aufruf der Methode destroy() des Servlets 13
GET- und POST-Anfragen HTTP unterstützt verschiedene Request-Methoden: die Methoden GET und POST kommen am häufigsten zum Einsatz. GET-Anfragen: Parameter werden als Teil der URL übergeben: http://localhost/helloworld?name=carl&uni=stuttgart Bearbeitung in der Methode doget() des Servlets POST-Anfragen: Parameter werden als parater Teil der Requests übergeben, sind nicht Teil der URL Einsatz bei Formularen, allgemein bei größeren Datenmengen und Binärdaten Bearbeitung in der Methode dopost() des Servlets 14
Beispiel: Hello World als Java Servlet public class HelloWorldServlet extends HttpServlet { @Override public void init() throws ServletException { super.init(); // Eigene Initialisierung... } } Eigenes Servlet auf Basis von HttpServlet protected void doget(httpservletrequest request, HttpServletRespon respon) Zugriff auf Respon-Objekt throws ServletException, IOException { PrintWriter out = respon.getwriter(); HTML-Code, der als Antwort an out.println("<html><body>"); den Browr geschickt wird out.println("hallo Welt!<br />"); out.format ("Heute ist der %1$te. %1$tB!", new Date()); out.println("</body></html>"); out.clo(); } Geschäftslogik : Aufruf beliebiger Java-Objekte 15
Beispiel: Hello World als Java Servlet (2) Aufruf des Servlets im Web-Browr: http://localhost:8080/helloworld/helloworldservlet Zuvor muss der Web Container entsprechend konfiguriert und das Servlet im Web Container installiert werden. 16
Deployment von Web-Anwendungen Das Installieren einer Java EE Web-Anwendung in einem Web Container wird als Deployment bezeichnet. Eine Web-Anwendung kann Servlets, Java Server Pages, statische HTML-Seiten, Grafiken etc. umfasn. Zusätzlich wird eine Konfigurationsdatei benötigt (web.xml). Die XML-Konfigurationsdatei wird als Deployment Descriptor bezeichnet. Sie enthält Informationen über die Web-Anwendung, die der Application Server für die Einbindung benötigt. Web-Anwendungen werden häufig als einzelnes Archiv (WAR, Web Application archive) ausgeliefert. 17
Deployment Descriptor Beispiel: Auschnitt aus einer Konfigurationsdatei web.xml web.xml <web-app id="helloworldservlet"...> <display-name> HelloWorld</display-name> <rvlet> <rvlet-name>helloworldservlet</rvlet-name> <rvlet-class>pe.helloworldservlet</rvlet-class> </rvlet> <rvlet-mapping> <rvlet-name>helloworldservlet</rvlet-name> <url-pattern>/helloworldservlet</url-pattern> </rvlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> 18
Deployment aus Eclip Das Eclip Web Tools Platform Project erleichtert die Entwicklung von JEE-Anwendungen in Eclip. Das Deployment von Web-Anwendungen und die Kontrolle des Application Servers ist auf die Wei bequem aus Eclip heraus möglich. http://www.eclip.org/webtools/ 19
Auswertung von HTML-Formularen HTML-Formulare werden zur Dateneingabe auf Web-Seiten verwendet. <html> Request-Methode POST <body> <form action="helloworldservlet" method ="post"> Eingabe: <input type="text" name="eingabe" /> <br /><br /> Ausgabe: <!-- Hier steht die Ausgabe --> <br /><br /> <input type="submit" value="text spiegeln" /> </form> </body> </html> Der Inhalt der Eingabefelder wird häufig per POST-Request an den Server übertragen. 20
Auswertung von HTML-Formularen (2) Die Bearbeitung im Servlet erfolgt in der Methode dopost(). Auf die mitgeschickten Parameter (Formularinhalte) kann über das Request-Objekt zugegriffen werden.... protected void dopost(httpservletrequest request, HttpServletRespon respon) Auslen des HTMLthrows ServletException, IOException { Parameters eingabe PrintWriter out = respon.getwriter(); String eingabe = request.getparameter("eingabe"); String html = erzeugehtml(eingabe); /* Hilfsmethode */ out.println(html); out.clo(); }... 21
Anfrage-Objekte: ServletRequest 22 Holger Röder
HttpServletRequest Die Schnittstelle HttpServletRequest repräntiert eine HTTP- Anfrage. Verschiedene Methoden bieten Zugriff auf die Bestandteile der Anfrage, z. B. String getquerystring(): liefert den Query String, der nach dem Aufrufpfad folgt (bei GET-Anfragen: Parameterliste). Enumeration getparameternames(): liefert die Namen aller Parameter String getparameter(string): liefert den Wert des angegebenen Parameters String[] getparametervalues(string): liefert alle Werte des angegebenen Parameters Auch Informationen über den aufrufenden Client können ermittelt werden, z. B. String getremoteaddr(): liefert die IP-Adres des Clients String getremotehost(): liefert den Hostnamen des Clients 23
HttpServletRequest (2) Beispiel: Aufruf der folgenden URL im Web-Browr http://localhost/servlettest/meinservlet?p1=ab&p2=2007 String s1 = req.getremoteaddr(); // 127.0.0.1 String s2 = req.getquerystring(); // p1=ab&p2=2007 String s3 = req.getparameter("p2"); // 2007 Enumeration params = req.getparameternames(); // p1, p2... 24
Antwort-Objekte: ServletRespon 25 Holger Röder
HttpServletRespon Die Schnittstelle HttpServletRespon repräntiert eine Antwort des Servlets auf eine HTTP-Anfrage. Die Methode getwriter() liefert ein PrintWriter-Objekt zurück, über das Text (z. B. HTML-Code) als Antwort zurückgeliefert werden kann. PrintWriter out = respon.getwriter(); out.println("<html><body> Hallo Welt! </body></html>");... Sollen Binärdaten zurückgeliefert werden (z. B. dynamisch erzeugte Grafiken), kann ServletOutputStream getoutputstream() verwendet werden. Weitere Methoden: ndredirect(string): leitet die Anfrage um theader(string, String): tzt einen HTTP-Header 26
HTTP-Cookies Einfache Daten können vom Server als sogenanntes Cookie auf dem Client gespeichert werden. Bei jeder Anfrage ndet der Web-Browr die für dien Server (bzw. Pfad) gespeicherten Cookies mit. Die Nutzlast eines Cookies besteht im Wentlichen aus einem Name-Wert-Paar. Beispiele: urid=carlcoder, lastvisit=20070105-102334 Zusätzlich werden für jedes Cookie weitere Informationen gespeichert, etwa der zugehörige Server, der zugehörige Pfad und das maximale Alter des Cookies. Cookies werden häufig zur (Wieder-)Erkennung des Clients oder für das Sitzungsmanagement eingetzt. 27
Die Klas Cookie Cookies auslen Die Klas Cookie im Paket javax.rvlet.http bietet Unterstützung bei der Verwendung von Cookies. Alle vom Client mitgeschickten Cookies können über die Methode Cookie[] getcookies() des Request-Objekts ermittelt werden. Die in den einzelnen Cookies gespeicherten Daten können über dann über entsprechende Methoden (getname(), getvalue() etc.) ausgelen werden. PrintWriter out = respon.getwriter(); if (request.getcookies()!= null) { /* Cookies mitgeschickt */ for (Cookie c : request.getcookies()) { String cookiename = c.getname(); String cookievalue = c.getvalue(); out.println(cookiename + " = " + cookievalue); } 28
Die Klas Cookie Cookies schreiben Der Konstruktor Cookie(String, String) erzeugt ein neues Cookie mit dem angegebenen Name-Wert-Paar als Inhalt. Die Eigenschaften des Cookies können über entsprechende Methoden getzt werden (tmaxage(), tdomain() etc.). Über die Methode addcookie(cookie) des Respon-Objekts kann ein Cookie zum Client gendet werden. Cookie c = new Cookie("lastVisit", "20070105-102334"); c.tmaxage(24*60*60); /* Max. 1 Tag speichern */ respon.addcookie(c); 29
Sitzungen HTTP ist zustandslos, jede HTTP-Anfrage erfolgt unabhängig von anderen Anfragen. In vielen Fällen sollen aufeinanderfolgende Anfragen eines Clients dennoch miteinander verknüpft und ein gemeinsamer Zustand über die Anfragen hinweg bewahrt werden. Eine solche Folge von zusammenhängenden Anfragen wird als Sitzung (Session) bezeichnet. Die Servlet API bietet Unterstützung für die Sitzungsverwaltung (Session Management). Wichtig: Die technische Realisierung der Sitzungsverwaltung bleibt dem Web Container überlasn (z. B. durch Cookies, durch URL- Encoding etc.) 30
HttpSession Die Klas HttpSession repräntiert eine Client-Sitzung. Über die Methode getsession() des Request-Objekts kann das HttpSession-Objekt für den anfragenden Client ermittelt werden. In der Session können beliebige Objekte (Object) unter einem eindeutigen Namen (String) gespeichert und ausgelen werden. // Objekt in Session speichern HttpSession ssion = request.getsession(); Double summe = 14.99; ssion.tattribute("gesamtsumme", summe);... // Objekt aus Session auslen HttpSession ssion = request.getsession(); Double summe = (Double) ssion.getattribute("gesamtsumme"); Die Sitzung wird nach einer festgelegten Zeitspanne, innerhalb der keine Anfragen vom Client kommen, ungültig. ssion.tmaxinactiveinterval(5*60); // max. 5min Inaktivität... ssion.invalidate(); // alternativ: Session sofort ungültig machen 31
Java Server Pages Die alleinige Verwendung von Java Servlets kann problematisch in: Präntations- und Verarbeitungslogik werden vermischt. HTML-Entwicklungswerkzeuge sind nicht verwendbar. Java Server Pages (JSPs) können hier Abhilfe schaffen. JSPs sind für den Einsatz als Web-Seiten konzipiert, die sowohl statische als auch dynamische generierte Teile beinhalten. Präntations- und Verarbeitungslogik werden im Vergleich zu normalen Servlets strikter getrennt. Dynamische Inhalte werden über spezielle JSP Tags eingebunden. Die fachliche Verarbeitung erfolgt in Komponenten (z. B. Java Beans). Technisch betrachtet sind auch JSPs Servlets: beim ersten Aufruf einer JSP wird die in ein Servlet übertzt und kompiliert. 32
JSP-Beispiel Normaler HTML- Code JSP-page-Direktive <%@ page... %> Java-Code, eingeschlosn in <%... %> Tags out und request stehen als Objekte direkt zur Verfügung index.jsp <%@ page language="java" contenttype="text/html; chart=iso-8859-1" pageencoding="iso-8859-1"%> <html> <head> <title>text spiegeln</title> </head> <body> <form method ="post"> Eingabe: <input type="text" name="eingabe" value="" /> <br /><br /> Ausgabe: <strong> <% String eingabe = request.getparameter("eingabe"); if (eingabe!= null) { String ausgabe = new StringBuilder(eingabe).rever().toString(); out.print(ausgabe); } %> </strong> <br /><br /> <input type="submit" value="text spiegeln" /> </form><br /> </body> </html> 33
JSPs und JavaBeans JavaBeans werden in JSPs häufig für die fachliche Verarbeitungslogik eingetzt. Die Einbindung von JavaBeans erfolgt über den Tag <jsp:ubean... />... Java-Klasnname <body> <form method ="post"> <jsp:ubean id="reverstringbean" class="reverstringbean" scope="ssion" /> <jsp:tproperty name="reverstringbean" property="string" value="<%= request.getparameter("eingabe") %>" /> Eingabe: <input type="text" name="eingabe" value="<jsp:getproperty name="reverstringbean" property="string"/>" /> <br /><br /> Ausgabe: <strong> <jsp:getproperty name="reverstringbean" property="reverstring"/> </strong> <br /><br /> <input type="submit" value="eingabe spiegeln" /> </form><br /> </body>... Lebensdauer (page, request, ssion application) Zugriff auf die JavaBean 34
JavaBeans ReverTextBean.java public class ReverStringBean { String string = ""; public void tstring(string s) { if (s!= null) string = s; } public String getstring() { return string; } public String getreverstring() { return new StringBuilder(string).rever().toString(); } } JavaBeans sind normale Java- Klasn Auf bestimmte Eigenschaften (Properties) der JavaBean kann aus der JSP heraus zugegriffen werden. In der JavaBean-Klas existieren tx(...) und/oder getx()-methoden für die Property X Der Zugriff in der JSP erfolgt über die JSP-Tags <jsp:tproperty> und <jsp:getproperty> 35
JSPs und JavaBeans (2) Die Properties einer JavaBean können fest mit den im Request-Objekt gespeicherten Parametern verknüpft werden.... <jsp:tproperty name="reverstringbean" property="*" />... Mit * werden alle Properties mit gleichnamigen Parametern verknüpft; alternativ können auch einzelne Parameter angegeben werden. 36
Wichtige JSP-Direktiven und -Tags Include-Direktive Syntax: <%@ include file="..." %> Fügt (einmalig) vor dem Kompilieren der JSP den Inhalt einer Datei ein Include-Tag Syntax: <jsp:include page="..." /> Fügt beim Aufruf der JSP den Inhalt der angegebenen statischen oder dynamischen Ressource (z. B. JSP) ein Forward-Tag Syntax: <jsp:forward page="..." /> Leitet die Client-Anfrage an die angegebene HTML-Datei, JSP oder das Servlet zur Verarbeitung weiter 37
JSP-Scripting: Deklarationen und Ausdrücke JSPs können normalen Java-Quellcode enthalten, der beim Aufruf der JSP ausgeführt wird (Scripting). Deklarationen: Syntax: <%!... %> Deklaration von Variablen und Methoden (durch Semikolon abgeschlosn) <%! int a = 17; %> Ausdrücke: Syntax: <%=... %> Beliebige gültige Ausdrücke sind zulässig (ohne abschließendes Semikolon). Der jeweilige Ausdruck wird zur Laufzeit ausgewertet und der resultierende Wert in einen String konvertiert. a + b = <%= a + b %> 38
Scriptlets Vollständige Java-Code-Blöcke in JSPs werden als Scriptlets bezeichnet. Syntax: <%... %> <% %> String eingabe = request.getparameter("eingabe"); if (eingabe!= null) { String ausgabe = new StringBuilder(eingabe).rever().toString(); out.print(ausgabe); } 39
Scriptlets: Implizite Variablen Innerhalb von Scriptlets stehen verschiedene implizite Variablen zur Verfügung, die ohne Deklaration verwendet werden können, z. B. ServletRequest request ServletRespon respon JspWriter out HttpSession ssion... <% %> out.println("hallo Welt!"); 40
Kommentare Versteckte Kommentare (Hidden Comments) Syntax: <%-- Kommentar --%> Versteckte Kommentare können zur Dokumentation des JSP- Codes verwendet werden. Sie werden von der JSP-Engine nicht verarbeitet und deshalb auch nicht zum Client gendet. Ausgabe-Kommentare (Output Comments) Syntax: <!-- Kommentar --> Ausgabe-Kommentare sind normale HTML-Kommentare, die auch im an den Client gendeten HTML-Code enthalten sind. 41
Zusammenspiel von Servlets und JSPs Das Servlet führt alle Tätigkeiten aus, die durch den Request angefordert sind ( Aufgabe 1 ). Die Darstellung wird an die JSP delegiert. Die JSP implementiert die Darstellung der Folgeite ( Aufgabe 2 ). Die für die Darstellung benötigten Daten werden aus dem Request-Objekt oder über JavaBeans geholt, die ihrerits auf die Geschäftslogik zugreifen. Request Respon Web Container Servlet JSP Geschäftslogik JavaBeans 42
Datenübergabe Servlet JSP Beide Technologien Servlets und JSPs können kombiniert werden: Servlets: Bearbeitung der Anfragen (Geschäftslogik) JSPs: Präntation der Antworten Übergabe von Daten vom Servlet an die JSP: 1. Der Web Container ruft bei einem ankommenden Request das Servlet auf. 2. Das Servlet bearbeitet die Anfrage. 3. Ermittelte Ergebnis werden als Attribute im Request-Objekt gespeichert: request.tattribute("gesamtsumme", summegesamt); 4. Mittels eines Dispatching-Mechanismus wird die JSP aufgerufen und das Request-Objekt übergeben. 5. JSP liest das Attribut aus dem Request-Objekt aus: Double summe = request.getattribute("gesamtsumme"); 6. JSP erzeugt dynamisch die HTML-Darstellung. 7. HTML-Seite wird an den Client zurückgeschickt. 43
Dispatching-Mechanismen Um innerhalb eines Servlets eine JSP aufzurufen, muss zunächst ein RequestDispatcher-Objekt erzeugt werden. RequestDispatcher dispatcher = getservletcontext().getrequestdispatcher("/meinejsp.jsp"); Anschließend existieren zwei verschiedene Aufruf-Möglichkeiten: include() bindet die JSP ein, anschließend fährt das Servlet mit der Verarbeitung fort. include() kann mehrfach aufgerufen werden. dispatcher.include(request, respon);... // weitere Anweisungen forward() übergibt die Kontrolle vollständig an die JSP. Das Servlet ist anschließend in die Bearbeitung der Anfrage nicht mehr eingebunden. forward() kann deshalb auch nur einmal aufgerufen werden. dispatcher.forward(request, respon); 44