© 2004-2006, Rainer Schmidberger, ISTE Einführung Java 2 Enterprise Edition (J2EE) Rainer Schmidberger [email protected] se Servlets und JSP (Java Server Page) Enterprise JavaBeans (EJB) Java Naming and Directory InterfaceTM API JDBCTM API JavaMailTM API CORBA Compliance Java Transaction API XML Deployment Descriptors Java Message Service Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE J2EE Inhalt Quelle: Sun Microsystems se Folie 134 Standardisiertes Architekturmodell für serverbasierte Java-Anwendungen Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE J2EE application model Quelle: Sun Microsystems se Folie 135 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Java Anwendungsarten se Java-Application SwingOberfläche Java-Applet SwingOberfläche als Applet AnwendungsLogik Java VM Laden der Anwendung von Lokales Laufwerk AnwendungsLogik Sandbox im Browser J2EE: Java-Servlet / JSP HTMLOberfläche Browser Servlet/JSP AnwendungsLogik Web-Server Laden der Anwendung von Laden der Anwendung von WebServer WebServer Folie 136 Statisch abgelegte Dokumente wie z.B. HTML-Seiten werden von Web Server an den User übermittelt HTTP request Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Statisches Web HTTP response Statische Dokumente (HTML) se Web Server Browser User Folie 137 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Dynamisches Web Web Seiten werden im Application-Server dynamisch, d.h. im Moment der Anfrage, erzeugt Web Server HTTP request HTTP response Statische Dokumente (HTML) HTTP request: Parameter HTTP response: Dynamischer Inhalt Browser Programmentwicklung, Vorlesungsskript Beispiel für einen Servlet-Container: se Servlet oder JSP Datenbank http://jakarta.apache.org/tomcat/index.html Application Server, ServletContainer Folie 138 Der Web-Browser sendet Parameter im Request über den Servlet-Container zum Servlet Servlet-Container Request Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Request-Response Prinzip se Servlet Geschäftslogik: Implementierung in „Standard“ Java Response Das Servlet erstellt die Folgeseite und liefert diese im Response an den Browser zurück Folie 139 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Was sind Servlets? Servlets sind Objekte, deren Klasse das Interface javax.servlet.Servlet implementiert Servlets werden innerhalb eines Servlet-Containers (oder auch Servlet Engine) instanziert und gestartet Häufigste Verwendung als HTTPServlet, das auf BrowserAnfragen (Request) antwortet Servlets bekommen vom Client (dem Browser) Parameter im Request-Objekt übergeben Servlets erzeugen HTML-Code, der als Response zum Client zurückgeliefert wird Servlet-Container sind Application-Server, die die J2EE Spezifikation erfüllen. Bekannte Hersteller hierfür sind Bea (WebLogic), IBM (WebSphere), Apache (Tomcat, JBoss, OpenSource), Enterprise Server (Borland), ... se Folie 140 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Aufgaben des Servlet se Request Servlet-Aufgabe Teil 1: Ausführen der Tätigkeiten, die durch den Request angefordert sind Z.B. Geschäftslogik starten, Daten speichern usw... Servlet-Aufgabe Teil 2: Erzeugen der folgenden HTML-Seite Dieses Erzeugen findet über das ResponseObjekt statt Response Folie 141 © 2004-2006, Rainer Schmidberger, ISTE doGet und doPost Parameterübergabe per „get“ doGet 01.02.2006 Ö Parameter sind in der URL des Aufrufs enthalten Ö Aufruf kann mit den Parametern „gebookmarked“ werden Request Programmentwicklung, Vorlesungsskript Parameterübergabe per „post“ se Ö Parameter sind nicht in der URL des Aufrufs sondern als Tabelle eingebettet im Request enthalten Ö Nur für Formulare verwendbar Request doPost Folie 142 Request Servlet void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Implementierung des Servlet se // … request-Objekt auswerten: String parameter1 = request.getParameter("parameter1") // response-Objekt befüllen response.getWriter().println("Hello World"); } Response Folie 143 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Interface Servlet se <<Interface>> Servlet (from servlet) destroy() : void getServletConfig() : ServletConfig getServletInfo() : String init(servletconfig : ServletConfig) : void service(servletrequest : ServletRequest, servletresponse : ServletResponse) : void GenericServlet (from servlet) <<Interface>> JspPage GenericServlet() destroy() : void getInitParameter(name : String) : String getInitParameterNames() : Enumeration getServletConfig() : ServletConfig getServletContext() : ServletContext getServletInfo() : String getServletName() : String init() : void init(config : ServletConfig) : void log(msg : String) : void log(message : String, t : Throwable) : void service(servletrequest : ServletRequest, servletresponse : ServletResponse) : void (from jsp) jspDestroy() : void jspInit() : void <<Interface>> Serializable (from io) HttpServlet (from http) HttpServlet() <<ServletdoDelete>> doDelete(req : HttpServletRequest, resp : HttpServletResponse) : void <<ServletdoGet>> doGet(req : HttpServletRequest, resp : HttpServletResponse) : void <<ServletdoOptions>> doOptions(req : HttpServletRequest, resp : HttpServletResponse) : void <<ServletdoPost>> doPost(req : HttpServletRequest, resp : HttpServletResponse) : void <<ServletdoPut>> doPut(req : HttpServletRequest, resp : HttpServletResponse) : void <<ServletdoTrace>> doTrace(req : HttpServletRequest, resp : HttpServletResponse) : void getLastModified(req : HttpServletRequest) : long <<ServletService>> service(req : ServletRequest, res : ServletResponse) : void <<ServletService>> service(req : HttpServletRequest, resp : HttpServletResponse) : void Besonders wichtige Methoden: doPost doGet Folie 144 © 2004-2006, Rainer Schmidberger, ISTE Interface ServletRequest <<Interface>> ServletRequest (from servlet) (from http) getAttribute(s : String) : Object getAttributeNames() : Enumeration getCharacterEncoding() : String getContentLength() : int getContentType() : String getInputStream() : ServletInputStream getLocale() : Locale getLocales() : Enumeration getParameter(s : String) : String getParameterNames() : Enumeration getParameterValues(s : String) : String[] getProtocol() : String getReader() : BufferedReader getRealPath(s : String) : String getRemoteAddr() : String getRemoteHost() : String getRequestDispatcher(s : String) : RequestDispatcher getScheme() : String getServerName() : String getServerPort() : int isSecure() : boolean removeAttribute(s : String) : void setAttribute(s : String, obj : Object) : void 01.02.2006 Programmentwicklung, Vorlesungsskript <<Interface>> HttpServletRequest Ö Bitte beachten: Spezifiziert sind hier nur Interface. Die Implementierung ist Sache des Application-Server Herstellers. se getAuthType() : String getContextPath() : String getCookies() : Cookie[] getDateHeader(s : String) : long getHeader(s : String) : String getHeaderNames() : Enumeration getHeaders(s : String) : Enumeration getIntHeader(s : String) : int getMethod() : String getPathInfo() : String getPathTranslated() : String getQueryString() : String getRemoteUser() : String getRequestURI() : String getRequestedSessionId() : String getServletPath() : String getSession() : HttpSession getSession(flag : boolean) : HttpSession getUserPrincipal() : Principal isRequestedSessionIdFromCookie() : boolean isRequestedSessionIdFromURL() : boolean isRequestedSessionIdFromUrl() : boolean isRequestedSessionIdValid() : boolean isUserInRole(s : String) : boolean Besonders wichtige Methoden: getParameter getCookies getSession Folie 145 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Interface ServletResponse se <<Interface>> ServletResponse <<Interface>> HttpServletResponse (from http) (from servlet) flushBuffer() : void getBufferSize() : int getCharacterEncoding() : String getLocale() : Locale getOutputStream() : ServletOutputStream getWriter() : PrintWriter isCommitted() : boolean reset() : void setBufferSize(i : int) : void setContentLength(i : int) : void setContentType(s : String) : void setLocale(locale : Locale) : void addCookie(cookie : Cookie) : void addDateHeader(s : String, l : long) : void addHeader(s : String, s1 : String) : void addIntHeader(s : String, i : int) : void containsHeader(s : String) : boolean encodeRedirectURL(s : String) : String encodeRedirectUrl(s : String) : String encodeURL(s : String) : String encodeUrl(s : String) : String sendError(i : int) : void sendError(i : int, s : String) : void sendRedirect(s : String) : void setDateHeader(s : String, l : long) : void setHeader(s : String, s1 : String) : void setIntHeader(s : String, i : int) : void setStatus(i : int) : void setStatus(i : int, s : String) : void Besonders wichtige Methoden: getWriter addCookie Ö Bitte beachten: Spezifiziert sind hier nur Interface. Die Implementierung ist Sache des Application-Server Herstellers. Folie 146 import import import import javax.servlet.*; javax.servlet.http.*; java.io.*; java.util.*; public class ServletTest extends HttpServlet { public void init() throws ServletException { } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("Hello World"); } 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE "Hello World" Servlet Programmentwicklung, Vorlesungsskript } Zusammenhang zwischen HTTPAdresse und Servlet-Klassenname wird über eine Konfigurationsdatei (web.xml) hergestellt se Folie 147 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Formulare <html> <head><title>ServletTest</title></head> <body> <form method=post action=servlettest> Eingabe: <input type=text name=Eingabe /> <br> Ausgabe: ... Hier berechneten Wert einsetzen <br> <br> <input type=submit name=Submit /> </form> </body></html> Typisch sind Formulare zur Dateneingabe HTML-Tag: <form ..> ... </form> HTML kann beliebig zur Gestaltung genutzt werden Inhalte der Eingabefelder werden i. Allg. per "post" an den Server übermittelt und können dort aus dem Request-Objekt ausgewertet werden Absenden mit "Submit" Button Das unter "action=" festgelegte Servlet wird gestartet se Aufruf des Servlets und Parameterübergabe Die Folge-Seite wird vom aufgerufenen Servlet wieder produziert Folie 148 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Methode "doPost" //Process the HTTP Post request public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); String ausgabe = request.getParameter("Eingabe"); // post-Parameter if(ausgabe == null) ausgabe = ""; // auswerten out.println("<html>"); out.println("<head><title>ServletTest</title></head><body>"); out.println("<form method=post>"); out.println("Eingabe:"); out.println("<input type=text name=Eingabe />"); // Parametername out.println("<br>Ausgabe:"); // definieren out.println(reverse(ausgabe)); out.println("<br><br>"); out.println("<input type=submit name=Submit />"); out.println("</form></body></html>"); out.close(); } se Folie 149 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Lebenszyklus Server lädt und kreiert Instanz von ServletTest Ö Methode void init () Interaktion mit Clients (Behandlung von Anfragen) Ö GenericServlet • void service (ServletRequest, ServletResponse) Ö HttpServlet • void doGet (HttpServletRequest, HttpServletResponse) • void doPost (HttpServletRequest, HttpServletResponse) Server entfernt Servlet-Instanz (beim Stoppen des Servers) se Ö Methode void destroy () Folie 150 Paket: javax.servlet.http Enthält Informationen über die übergebenen Parameter und den aufrufenden Client Parameter Informationen Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Request Objekt (1) se Ö String getParameter (String) Liefert den Wert eines konkreten Parameters. Ö Enumeration getParameterNames () Liefert die Namen sämtlicher Parameter, die im requestObjekt mitgeliefert wurden. Ö String[] getParameterValues (String) Diese Methode ist für Parameter geeignet, die mehr als einen Wert enthalten können. Zurückgeliefert wird ein ganzes Array von Werten des benannten Parameters. Folie 151 Client Informationen Ö String getRemoteAddr () Liefert die IP-Adresse des Client. Ö String getRemoteHost () Damit wird der voll qualifizierte Name des Client bestimmt. Ö Das Interface javax.servlet.http.HttpServletRequest enthält weitere häufig benutzte Methoden zur Behandlung von HTTP-Anfragen. Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Request Objekt (2) se Folie 152 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Das Response-Objekt Paket: javax.servlet.http Kapselt die gesamte Kommunikation zum Client Ö Response-Objekt wird vom Servlet-Container generiert Zugriff auf Ö Header Ö OutputStream- bzw. Writer-Objekte • • Writer für textbasierte Daten OutputStream für binäre Daten Möglichkeit zum se Ö Setzen von Cookies Ö Weiterleiten von Anfragen Ö Senden von Fehlerseiten Folie 153 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Cookies (1) Ein Server kann Daten in ein "Cookie" speichern und dieses zum Client senden. Bei jedem Client-Request werden die Cookies vom Browser zurück an den Server gesendet, insofern die URL die gleiche ist. Ein Cookie dient zur Identifizierung des Clients oder der Sitzung Cookies haben im wesentlichen einen Namen und einen Inhalt (z.B. Name: "UserID", Wert: "007") Die Klasse javax.servlet.http.Cookie im Servlet API bietet unterstützung bei der Verwendung von Cookies se Folie 154 Cookies werden über seinen Namen identifiziert (Methode getName()) Der Inhalt eines Cookie ist vom Typ String (Methode getValue()) Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Cookies (2) se Cookie cookies[] = request.getCookies(); for(int i = 0; i < cookies.length; i++) { Cookie cookie = cookies[i]; if(cookie.getName().equals("Erste Eingabe")) { out.println("<br>Erste Eingabe: " + cookie.getValue()); } } if(cookies.length == 0 && ausgabe != null) { Cookie cookie = new Cookie("Erste Eingabe", ausgabe); response.addCookie(cookie); } Folie 155 Jeder Benutzer erhält ein javax.servlet.http.HttpSession Objekt in dem Daten pro Sitzung gespeichert werden können. Daten (Object) werden über einen Namen (String) in die Session gespeichert und über diesen Namen wieder gelesen. Basisdatentypen wie z.B. int werden über die zugeordnete Klasse behandelt Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Sitzungen se public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // ... HttpSession session = request.getSession(); if(session.isNew()) { out.println("Willkomen, Sie sind ein neuer User"); session.setAttribute("AmountVisited", new Integer(1)); } else { Integer i = (Integer)session.getAttribute("AmountVisited"); session.setAttribute("AmountVisited", new Integer(i.intValue() + 1)); out.println("Sie sind zum " + i + ". mal auf dieser Seite."); } // ... Folie 156 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Deployment Eine Web Applikation ist ein Sammlung von Servlets, JSP Seiten, HTML Dokumenten, Bilder sowie die Konfigurationsdatei web.xml Alle Dateien einer Web Applikation können in einem WebArchive (war-Datei) zusammen gefasst werden. Die Datei web.xml wird als Deployment Descriptor bezeichnet. web.xml enthält Konfigurations Informationen für den Server über die Web Applikation. web.xml wird im folgenden Verzeichnis gespeichert: server_root/webapps/<myWebApp>/WEB-INF Die Struktur von web.xml entspricht dem XML Standard se <?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>helloworld</servlet-name> <servlet-class>HelloWorld</servlet-class> </servlet> ... </web-app> Folie 157 Problematik bei Servlets Ö Vermischung von Präsentation und Verarbeitungslogik Ö Designer-Werkzeuge für HTML nicht verwendbar Abhilfe: Java Server Pages (JSP) Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Java Server Page se Ö Konzipiert für Web-Seiten mit dynamisch generiertem Inhalt Ö Weiterentwicklung von Servlets Ö Striktere Trennung von fachlicher Logik und Präsentation Ö Änderungen im Inhalt unabhängig von Verarbeitungslogik Ö Vereinfachung der Seitenentwicklung durch Tags Ö Funktionalität für dynamische Inhalte ist in Tags gekapselt Ö Verwendung wiederverwendbarer Komponenten Ö Komponenten (z.B. JavaBeans) realisieren fachliche Verarbeitung Folie 158 <html><head><title>JSPTest</title></head> <h1>Spiegel Java Server Page</h1> <body> <form method="post"> Eingabe: <input type=text name=eingabe /> <br>Ausgabe: <%! // eine Deklaration String eingabe, ausgabe; %> <% // hier steht nun Java-Code ... eingabe = request.getParameter("eingabe"); Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Einfache JSP Was fällt soweit auf? Aussehen ähnlich einem statischen HTML-Dokument. Einbettung von Java-Code über <% ... %> Deklarationen über <%! ... %> out und request stehen ohne Deklaration zur Verfügung. if(eingabe != null) { ausgabe = ServletTest.reverse(eingabe); out.println(ausgabe); } // Ende des Java-Codes %> <input type=submit name=Submit /> </form></body></html> se Folie 159 Zu einer JSP kann es ein JavaBean geben. Die Verbindung wird mit dem Tag <jsp:useBean ... /> vorgenommen. Die Lebensdauer einer Bean-Instanz legt scope= "page|request|session|application" fest Die Instanzierung erfolgt mit dem ersten Öffnen der JSP Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE JSP und JavaBeans se <html><head><title>JSPTest</title></head> <h1>Spiegel Java Server Page</h1> <jsp:useBean id="jspTestBean" scope="session" class="JSPTestBean" /> <body> <form method="post"> Eingabe: <input type=text name=eingabe /> <br> Ausgabe: <%! String ausgabe; %> <% jspTestBean.setEingabe(request.getParameter("eingabe")); ausgabe = jspTestBean.getReverseEingabe(); out.println(ausgabe); %> <br><br> <input type=submit name=Submit /> </form></body></html> Folie 160 // die Bean-Klasse: public class JSPTestBean { String eingabe = ""; public String getEingabe() { return eingabe; } public void setEingabe(String s) { eingabe = s; } 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE JavaBean public String getReverseEingabe() { return ServletTest.reverse(eingabe); } Programmentwicklung, Vorlesungsskript } se Ist eine "normale" Java-Klasse Kann in einem beliebigen Paket liegen Kann in einer beliebigen Vererbungshierarchie sein Hat jeweils eine setAbc und eine getAbc-Methode, wobei der Name des Property "abc" ist Beispiel: setEingabe/getEingabe ergeben das Property "eingabe" (Achtung: kleiner Anfangsbuchstabe) Weitere Methoden können beliebig hinzugefügt werden Folie 161 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE JSP und JavaBeans (2) <html><head><title>JSPTest</title></head> <h1>Spiegel Java Server Page</h1> <jsp:useBean id="jspTestBean" scope="session" class="JSPTestBean" /> <jsp:setProperty name="jspTestBean" property="*"/> <body> <form method="post"> Eingabe: <input type=text name=eingabe /> <br> Ausgabe: <%! String ausgabe; %> <% ausgabe = jspTestBean.getReverseEingabe(); out.println(ausgabe); %> <br>Eingabe war: <jsp:getProperty name="jspTestBean" property="eingabe"/> <br><br> <input type=submit name=Submit /> </form></body></html> se Die Properties eines JavaBeans können fest mit den Parametern des RequestObjektes verbunden werden Feste PropertyBenennung oder "*" für alle Properties Folie 162 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Weitere Direktiven Include Direktive Ö Syntax: <%@ include file="relativeURL" %> Ö Fügt Inhalt einer statischen oder dynamischen Datei in JSPDatei ein Forward Direktive Ö Syntax: <jsp:forward page=“{ relativeURL | <%= Ausdruck %> }“ /> Ö Leitet Client-Anfrage an HTML-Datei, JSP-Datei oder Servlet zur Verarbeitung weiter Taglib Direktive se Ö Syntax: <%@ taglib uri=“TagBibliothekURI“ prefix=“tagPräfix“ %> Ö Definiert Bibliothek für eigene Tags und des dabei verwendeten Präfix Folie 163 1. Deklarationen Ö Ö Ö Ö Programmentwicklung, Vorlesungsskript Syntax: <%! ... %> Dient zur Deklaration von Variablen und Methoden Jede Deklaration wird durch ein Semikolon abgeschlossen Beispiel: <%! int i = 0; %> 2. Ausdrücke (engl. Expressions) 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE JSP – Scripting Elements se Ö Ö Ö Ö Ö Ö Syntax: <%= ... %> Kann beliebige (gültige) Ausdrücke enthalten Ausdrücke werden nicht durch ein Semikolon abgeschlossen Werden zur Laufzeit ausgewertet und durch Wert ersetzt Der ermittelte Wert wird immer in einen String konvertiert Beispiel: a + b = <%= a + b %> Folie 164 Scriptlets 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE JSP – Scripting Elements (Forts.) Ö Syntax: <% ... %> Ö Scriptlets können jeden beliebigen (gültigen) Java-Code enthalten Ö Ausdrücke werden durch ein Semikolon abgeschlossen Ö Dienen zur Implementation der fachlichen Logik von JSPs Ö Es stehen implizite Variablen zur Verfügung Ö Beispiel: <% Programmentwicklung, Vorlesungsskript eingabe = request.getParameter("eingabe"); se if(eingabe != null) { ausgabe = ServletTest.reverse(eingabe); out.println(ausgabe); } %> Folie 165 Variablen, die ohne Deklaration in Scripting-Elementen verwendbar sind 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Implizite Variablen Ö request (Unterklasse von javax.servlet.ServletRequest) • Ö response (Unterklasse von javax.servlet.ServletResponse) • Programmentwicklung, Vorlesungsskript Antwort der JSP-Seite an den Client Ö out (javax.servlet.jsp.JspWriter) • Servlet Output Writer (Ausgaben an den Client-Browser) Ö session (javax.servlet.http.HttpSession) • HTTP Session Objekt, das mit Anfrage assoziiert wird Ö application (javax.servlet.ServletContext) • se Anfrage des Client (enthält Parameterliste) Servlet Context Objekt (Kommunikation mit dem Servlet Container) Ö config (javax.servlet.ServletConfig) • Das ServletConfig Objekt für die JSP-Seite (enthält z.B. Initialisierungsparameter) Ö exception (java.lang.Throwable) • • Exception, die von der JSP-Seite nicht gefangen wurde. Wird nur in der Fehlerseite des JSPs sichtbar Folie 166 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Kommentare Versteckte Kommentare (Hidden Comment) Ö Syntax: <%-- Kommentar --%> Ö Zum Dokumentieren des Quellkodes Ö Wird von der JSP-Engine nicht verarbeitet und wird somit auch nicht zum Client gesendet Ausgabe Kommentar (Output Comment) se Ö Syntax: <!-- Kommentar [<%= Ausdruck %>] --!> Ö Wird von der JSP-Engine verarbeitet und das Ergebnis taucht in der gesendeten HTML-Quelldatei auf Ö Der im Kommentar enthaltene Ausdruck wird dynamisch zur Laufzeit bei jedem Aufruf evaluiert Folie 167 Das Servlet führt alle Tätigkeiten, die durch den Request angefordert sind, aus. Das Servlet übernimmt keine Darstellungsaufgaben sondern leitet diese an die JSP weiter Die JSP implementiert die Darstellung der Folgeseite. Die Daten zur Darstellung werden dem Bean entnommen, das selbst auf die Geschäftslogik zugreift Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Servlet/JSP–Request/Response (1) se Servlet-Container Request Servlet JSP Geschäftslogik Bean Response Folie 168 Kombination beider Technologien Ö Servlets: Bearbeitung der Anfragen (Geschäftslogik) Ö JSPs: Präsentation der Antworten Ablauf Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Servlet/JSP–Request/Response (2) se Ö Eingehende Anfrage wird von Servlet Engine auf Servlet abgebildet Ö Servlet bearbeitet Anfrage Ö Ermittelte Ergebnisse werden als Attribute in request-Objekt gespeichert Bsp.: request.setAttribute("eingabe", einString); Ö Request-Objekt wird mittels Dispatching-Mechanismus an JSP weitergereicht Ö JSP-Seite liest Attribute aus request-Objekt aus Bsp.: eingabe = (String)request.getAttribute("eingabe"); Ö JSP-Seite bereitet Ergebnisse graphisch auf Ö Erzeugte HTML-Seite wird an Client zurückgeliefert Folie 169 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Servlet/JSP - Dispatching Servlets können JSPs auf zwei Arten aufrufen 1. dispatcher.include() Ö include() ruft eine JSP-Seite auf und wartet auf diese, um mit der Verarbeitung fortzufahren Ö Kann innerhalb eines Servlets mehrmals aufgerufen werden Ö Mechanismus: RequestDispatcher = getServletContext().getRequestDispatcher(“JSP-URI“); dispatcher.include(request, response); 2. dispatcher.forward() se Ö Ö Ö Ö forward() gibt Kontrolle an aufgerufene JSP-Seite weiter Servlet ist danach an Client-Interaktionen nicht mehr involviert Kann innerhalb eines Servlets nur einmal aufgerufen werden Mechanismus: RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(“JSP-URI“); dispatcher.forward(request, response); Folie 170 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE Framework Jakarta Struts Jakarta Struts ist ein Framework, das viele Standardaufgaben von JSP/Servlet-Anwendungen bereits enthält So besteht Unterstützung für Ö Mehrsprachigkeit, Internationalisierung Ö Fehlerbehandluch Ö Einfacher Zugriff auf Request Parameter Ö Viele spezielle HTML-Tags für Formulare Umfangreiche Konfigurierungsmöglichkeiten (aber viele XML Dokumente, teilweise nicht einfach bedienbar) Jakarta Struts ist ein Open Source Produkt (http://jakarta.apache.org/struts) se Folie 171