se Einführung Java 2 Enterprise Edition (J2EE) Rainer Schmidberger [email protected] Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering PE Teil J2EE WS 03/04 se J2EE Inhalt 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 Quelle: Sun Microsystems 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 2 1 PE Teil J2EE WS 03/04 se J2EE application model Standardisiertes Architekturmodell für serverbasierte Java-Anwendungen Quelle: Sun Microsystems 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 3 PE Teil J2EE WS 03/04 se Java Anwendungsarten Java-Application SwingOberfläche SwingOberfläche als Applet AnwendungsLogik Java VM Laden der Anwendung von Lokales Laufwerk 09.02.2004 Java-Applet 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 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 4 2 PE Teil J2EE WS 03/04 se Statisches Web Statisch abgelegte Dokumente wie z.B. HTMLSeiten werden von Web Server an den User übermittelt HTTP request HTTP response Statische Dokumente (HTML) 09.02.2004 Web Server Browser User Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 5 PE Teil J2EE WS 03/04 se 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 Beispiel für einen Servlet-Container: Servlet oder JSP Datenbank http://jakarta.apache.org/tomcat/index.html Application Server, ServletContainer 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 6 3 PE Teil J2EE WS 03/04 se Request-Response Prinzip Der Web-Browser sendet Parameter im Request über den Servlet-Container zum Servlet Servlet-Container Request Servlet Geschäftslogik: Implementierung in „Standard“ Java Response Das Servlet erstellt die Folgeseite und liefert diese im Response an den Browser zurück 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 7 PE Teil J2EE WS 03/04 se 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), ... 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 8 4 PE Teil J2EE WS 03/04 se Aufgaben des Servlet 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 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 9 PE Teil J2EE WS 03/04 se doGet und doPost Parameterübergabe per „get“ Ö Parameter sind in der URL des Aufrufs enthalten Ö Aufruf kann mit den Parametern „gebookmarked“ werden Request doGet Parameterübergabe per „post“ Ö Parameter sind nicht in der URL des Aufrufs sondern als Tabelle eingebettet im Request enthalten Ö Nur für Formulare verwendbar 09.02.2004 Request doPost Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 10 5 PE Teil J2EE WS 03/04 se Implementierung des Servlet Request Servlet void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // … request-Objekt auswerten: String parameter1 = request.getParameter("parameter1") // response-Objekt befüllen response.getWriter().println("Hello World"); } Response 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 11 PE Teil J2EE WS 03/04 se Interface Servlet <<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 09.02.2004 Besonders wichtige Methoden: doPost doGet Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 12 6 PE Teil J2EE WS 03/04 se Interface ServletRequest <<Interface>> ServletRequest (from servlet) <<Interface>> HttpServletRequest (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 Ö Bitte beachten: Spezifiziert sind hier nur Interface. Die Implementierung ist Sache des Application-Server Herstellers. 09.02.2004 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 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 13 PE Teil J2EE WS 03/04 se Interface ServletResponse <<Interface>> ServletResponse (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 <<Interface>> HttpServletResponse (from http) 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. 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 14 7 PE Teil J2EE WS 03/04 se import import import import "Hello World" Servlet 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"); } } Zusammenhang zwischen HTTPAdresse und Servlet-Klassenname wird über eine Konfigurationsdatei (web.xml) hergestellt 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 15 PE Teil J2EE WS 03/04 se 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 09.02.2004 Aufruf des Servlets und Parameterübergabe Die Folge-Seite wird vom aufgerufenen Servlet wieder produziert Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 16 8 PE Teil J2EE WS 03/04 se 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(); } 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 17 PE Teil J2EE WS 03/04 se 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) Ö Methode void destroy () 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 18 9 PE Teil J2EE WS 03/04 se Request Objekt (1) Paket: javax.servlet.http Enthält Informationen über die übergebenen Parameter und den aufrufenden Client Parameter Informationen Ö 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. 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 19 PE Teil J2EE WS 03/04 se Request Objekt (2) 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. 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 20 10 PE Teil J2EE WS 03/04 se 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 Ö Setzen von Cookies Ö Weiterleiten von Anfragen Ö Senden von Fehlerseiten 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 21 PE Teil J2EE WS 03/04 se 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 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 22 11 PE Teil J2EE WS 03/04 se Cookies (2) Cookies werden über seinen Namen identifiziert (Methode getName()) Der Inhalt eines Cookie ist vom Typ String (Methode getValue()) 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); } 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 23 PE Teil J2EE WS 03/04 se Sitzungen 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 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."); } // ... 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 24 12 PE Teil J2EE WS 03/04 se 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 <?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>helloworld</servlet-name> <servlet-class>HelloWorld</servlet-class> </servlet> ... </web-app> 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 25 PE Teil J2EE WS 03/04 se Java Server Page Problematik bei Servlets Ö Vermischung von Präsentation und Verarbeitungslogik Ö Designer-Werkzeuge für HTML nicht verwendbar Abhilfe: Java Server Pages (JSP) Ö 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 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 26 13 PE Teil J2EE WS 03/04 se Einfache JSP <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"); 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> 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 27 PE Teil J2EE WS 03/04 se JSP und JavaBeans 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 <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> 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 28 14 PE Teil J2EE WS 03/04 se JavaBean // die Bean-Klasse: public class JSPTestBean { String eingabe = ""; public String getEingabe() { return eingabe; } public void setEingabe(String s) { eingabe = s; } public String getReverseEingabe() { return ServletTest.reverse(eingabe); } } 09.02.2004 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 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 29 PE Teil J2EE WS 03/04 se 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> 09.02.2004 Die Properties eines JavaBeans können fest mit den Parametern des RequestObjektes verbunden werden Feste PropertyBenennung oder "*" für alle Properties Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 30 15 PE Teil J2EE WS 03/04 se 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 Ö Syntax: <%@ taglib uri=“TagBibliothekURI“ prefix=“tagPräfix“ %> Ö Definiert Bibliothek für eigene Tags und des dabei verwendeten Präfix 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 31 PE Teil J2EE WS 03/04 se JSP – Scripting Elements 1. Deklarationen Ö Ö Ö Ö Syntax: <%! ... %> Dient zur Deklaration von Variablen und Methoden Jede Deklaration wird durch ein Semikolon abgeschlossen Beispiel: <%! int i = 0; %> 2. Ausdrücke (engl. Expressions) Ö Ö Ö Ö Ö Ö 09.02.2004 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 %> Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 32 16 PE Teil J2EE WS 03/04 se JSP – Scripting Elements (Forts.) Scriptlets Ö 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: <% eingabe = request.getParameter("eingabe"); if(eingabe != null) { ausgabe = ServletTest.reverse(eingabe); out.println(ausgabe); } %> 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 33 PE Teil J2EE WS 03/04 se Implizite Variablen Variablen, die ohne Deklaration in Scripting-Elementen verwendbar sind Ö request (Unterklasse von javax.servlet.ServletRequest) • Anfrage des Client (enthält Parameterliste) Ö response (Unterklasse von javax.servlet.ServletResponse) • 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) • 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) • • 09.02.2004 Exception, die von der JSP-Seite nicht gefangen wurde. Wird nur in der Fehlerseite des JSPs sichtbar Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 34 17 PE Teil J2EE WS 03/04 se 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) Ö 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 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 35 PE Teil J2EE WS 03/04 se Servlet/JSP–Request/Response (1) 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 09.02.2004 Servlet-Container Request Servlet JSP Geschäftslogik Bean Response Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 36 18 PE Teil J2EE WS 03/04 se Servlet/JSP–Request/Response (2) Kombination beider Technologien Ö Servlets: Bearbeitung der Anfragen (Geschäftslogik) Ö JSPs: Präsentation der Antworten Ablauf Ö 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 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 37 PE Teil J2EE WS 03/04 se 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() Ö Ö Ö Ö 09.02.2004 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); Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 38 19 PE Teil J2EE WS 03/04 se 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) 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 39 20