© Holger Röder Winter 2008/2009 Programmentwicklung se Java: Kapitel 10 Einführung in die Java Platform, Enterprise Edition (Java EE): Servlets und Java Server Pages Programmentwicklung WS 2008/2009 Holger Röder [email protected] © Holger Röder Winter 2008/2009 Programmentwicklung se Ü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 Response-Objekte Cookies Sitzungen Java Server Pages (JSP) Bestandteile von JSPs Integration von Servlets und JSPs 2 © Holger Röder Die Java Platform, Enterprise Edition (Java EE; früher J2EE) ist eine Entwicklungsplattform für serverbasierte Java-Anwendungen. Java EE sieht ein verteiltes, mehrschichtiges und komponentenbasiertes Architekturmodell vor. Java EE ist insbesondere gut geeignet als Entwicklungsplattform für Web-Anwendungen. Programmentwicklung Winter 2008/2009 Überblick über die Java EE se 3 © Holger Röder Programmentwicklung Winter 2008/2009 Java EE Application Model se Quelle: Sun Microsystems 4 © Holger Röder Winter 2008/2009 Programmentwicklung se Java EE Server – Infrastruktur Ein Java EE Application Server wird als Laufzeitumgebung für Java EEKomponenten 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 umfassen meist zwei (logisch getrennte) Container: Web Container: Laufzeitumgebung für Java Server Pages und Servlets EJB Container: Laufzeitumgebung für Enterprise 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 © Holger Röder 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/ Programmentwicklung Winter 2008/2009 Web-Container: Beispiel Apache Tomcat se 6 © Holger Röder Winter 2008/2009 Statische vs. dynamische Web-Seiten Klassische statische Web-Seiten: Alle Dokumente (z. B. HTML-Seiten, Grafiken) sind statisch und werden vom Web-Server an den Client (Web-Browser) übermittelt. HTTP Request <html> <title> ... HTTP Response Web-Browser Benutzer Programmentwicklung Web-Server se 7 © Holger Röder Winter 2008/2009 Statische vs. dynamische Web-Seiten (2) Dynamische Web-Seiten: 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 <html> <title> ... HTTP Response Programmentwicklung Web-Server se HTTP Request: Parameter Application Server, Web Container Servlet oder JSP Web-Browser Benutzer HTTP Response: Dynamischer Inhalt Datenzugriff Datenbank 8 © Holger Röder Winter 2008/2009 Programmentwicklung se Java Servlets – Überblick Mit Hilfe der Java Servlet API können dynamische Web-Seiten implementiert werden. Servlets sind Java-Objekte, deren Klasse das Interface javax.servlet.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-Response-Prinzip). In der Praxis wird in den meisten Fällen die abstrakte Basisklasse HttpServlet verwendet. Ein HttpServlet beantwortet HTTPAnfragen, die z. B. durch einen Web-Browser gestellt werden. Servlets bekommen vom Client Parameter im Request-Objekt übergeben. Servlets erzeugen meistens HTML-Code, der als Antwort im Response-Objekt an den Client zurückgeliefert wird. 9 © Holger Röder Winter 2008/2009 Request-Response-Prinzip Der Web-Browser sendet einen Request (mit Parametern) an den Web Container. Der Web Container ruft das Servlet auf und übergibt den Request. Web Container Request Programmentwicklung Servlet se Geschäftslogik (in „Standard-Java“ implementiert) Response Das Servlet erstellt dynamisch die Folgeseite und liefert diese an den Web-Browser zurück. 10 © Holger Röder Winter 2008/2009 Aufgaben des Servlets Request „Aufgabe 1“ Durchführung der im Request angeforderten Tätigkeiten Geschäftslogik anwenden, Daten speichern etc. Programmentwicklung Dynamische Erzeugung des Antwortdokuments Meistens HTML, Rückgabe über Response-Objekt se „Aufgabe 2“ Response 11 © Holger Röder Wichtig: Java EE ist nur eine Spezifikation. Die eigentliche Implementierung der Klassen ist Teil des Application Servers. Programmentwicklung Winter 2008/2009 Servlet-Hierarchie se 12 © Holger Röder Winter 2008/2009 Programmentwicklung se Servlet-Lebenszyklus Als Laufzeitumgebung ist der Web Container ist für das LebenszyklusManagement 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): service(ServletRequest req, ServletResponse res) Vereinfachung für HTTP-Anfragen (in HttpServlet definiert): doGet(HttpServletRequest req, HttpServletResponse resp) doPost(HttpServletRequest req, HttpServletResponse resp) Wird der Server oder das Servlet gestoppt, entfernt der Web Container die Servlet-Instanz. Aufruf der Methode destroy() des Servlets 13 © Holger Röder Winter 2008/2009 Programmentwicklung se 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 separater 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 © Holger Röder Winter 2008/2009 Programmentwicklung se 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, HttpServletResponse response) Zugriff auf Response-Objekt throws ServletException, IOException { PrintWriter out = response.getWriter(); HTML-Code, der als Antwort an out.println("<html><body>"); den Browser geschickt wird out.println("Hallo Welt!<br />"); out.format ("Heute ist der %1$te. %1$tB!", new Date()); out.println("</body></html>"); out.close(); “Geschäftslogik”: Aufruf } beliebiger Java-Objekte 15 Aufruf des Servlets im Web-Browser: http://localhost:8080/HelloWorld/HelloWorldServlet Programmentwicklung Winter 2008/2009 © Holger Röder Beispiel: „Hello World“ als Java Servlet (2) se Zuvor muss der Web Container entsprechend konfiguriert und das Servlet im Web Container installiert werden. 16 © Holger Röder 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. umfassen. 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. Programmentwicklung Winter 2008/2009 Deployment von Web-Anwendungen se 17 © Holger Röder Deployment Descriptor Beispiel: Auschnitt aus einer Konfigurationsdatei web.xml Programmentwicklung Winter 2008/2009 web.xml se <web-app id="HelloWorldServlet" ...> <display-name> HelloWorld</display-name> <servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class>pe.HelloWorldServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorldServlet</servlet-name> <url-pattern>/HelloWorldServlet</url-pattern> </servlet-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 © Holger Röder Winter 2008/2009 Programmentwicklung se Deployment aus Eclipse Das Eclipse Web Tools Platform Project erleichtert die Entwicklung von JEE-Anwendungen in Eclipse. Das Deployment von Web-Anwendungen und die Kontrolle des Application Servers ist auf diese Weise bequem aus Eclipse heraus möglich. http://www.eclipse.org/webtools/ 19 © Holger Röder Winter 2008/2009 Programmentwicklung se 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 © Holger Röder Winter 2008/2009 Programmentwicklung se 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, HttpServletResponse response) Auslesen des HTMLthrows ServletException, IOException { Parameters eingabe PrintWriter out = response.getWriter(); String eingabe = request.getParameter("eingabe"); String html = erzeugeHtml(eingabe); /* Hilfsmethode */ out.println(html); out.close(); } ... 21 se Programmentwicklung Winter 2008/2009 © Holger Röder Anfrage-Objekte: ServletRequest 22 © Holger Röder Winter 2008/2009 Programmentwicklung se HttpServletRequest Die Schnittstelle HttpServletRequest repräsentiert eine HTTPAnfrage. 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-Adresse des Clients String getRemoteHost(): liefert den Hostnamen des Clients 23 © Holger Röder Beispiel: Aufruf der folgenden URL im Web-Browser 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 ... Programmentwicklung Winter 2008/2009 HttpServletRequest (2) se 24 se Programmentwicklung Winter 2008/2009 © Holger Röder Antwort-Objekte: ServletResponse 25 © Holger Röder Winter 2008/2009 Programmentwicklung se HttpServletResponse Die Schnittstelle HttpServletResponse repräsentiert 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 = response.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: sendRedirect(String): leitet die Anfrage um setHeader(String, String): setzt einen HTTP-Header 26 © Holger Röder Winter 2008/2009 Programmentwicklung se HTTP-Cookies Einfache Daten können vom Server als sogenanntes Cookie auf dem Client gespeichert werden. Bei jeder Anfrage sendet der Web-Browser die für diesen Server (bzw. Pfad) gespeicherten Cookies mit. Die „Nutzlast“ eines Cookies besteht im Wesentlichen aus einem Name-Wert-Paar. Beispiele: userId=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 eingesetzt. 27 © Holger Röder Winter 2008/2009 Programmentwicklung se Die Klasse Cookie – Cookies auslesen Die Klasse Cookie im Paket javax.servlet.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.) ausgelesen werden. PrintWriter out = response.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 © Holger Röder Winter 2008/2009 Die Klasse 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 gesetzt werden (setMaxAge(), setDomain() etc.). Über die Methode addCookie(Cookie) des Response-Objekts kann ein Cookie zum Client gesendet werden. Cookie c = new Cookie("lastVisit", "20070105-102334"); c.setMaxAge(24*60*60); /* Max. 1 Tag speichern */ Programmentwicklung response.addCookie(c); se 29 © Holger Röder Winter 2008/2009 Programmentwicklung se 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 überlassen (z. B. durch Cookies, durch URLEncoding etc.) 30 © Holger Röder Winter 2008/2009 Programmentwicklung se HttpSession Die Klasse HttpSession repräsentiert 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 ausgelesen werden. // Objekt in Session speichern HttpSession session = request.getSession(); Double summe = 14.99; session.setAttribute("gesamtsumme", summe); ... // Objekt aus Session auslesen HttpSession session = request.getSession(); Double summe = (Double) session.getAttribute("gesamtsumme"); Die Sitzung wird nach einer festgelegten Zeitspanne, innerhalb der keine Anfragen vom Client kommen, ungültig. session.setMaxInactiveInterval(5*60); // max. 5min Inaktivität ... session.invalidate(); // alternativ: Session sofort ungültig machen 31 © Holger Röder Winter 2008/2009 Programmentwicklung se Java Server Pages Die alleinige Verwendung von Java Servlets kann problematisch sein: Präsentations- 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äsentations- 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 diese in ein Servlet übersetzt und kompiliert. 32 © Holger Röder Winter 2008/2009 Programmentwicklung se JSP-Beispiel Normaler HTMLCode JSP-page-Direktive <%@ page ... %> Java-Code, eingeschlossen in <% ... %> Tags out und request stehen als Objekte direkt zur Verfügung index.jsp <%@ page language="java" contentType="text/html; charset=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) .reverse().toString(); out.print(ausgabe); } %> </strong> <br /><br /> <input type="submit" value="Text spiegeln" /> </form><br /> </body> </html> 33 © Holger Röder Winter 2008/2009 Programmentwicklung se JSPs und JavaBeans JavaBeans werden in JSPs häufig für die fachliche Verarbeitungslogik eingesetzt. Die Einbindung von JavaBeans erfolgt über den Tag <jsp:useBean ... /> Lebensdauer (page, request, session application) Java-Klassenname ... <body> <form method ="post"> <jsp:useBean id="reverseStringBean" class="ReverseStringBean" scope="session" /> <jsp:setProperty name="reverseStringBean" property="string" value="<%= request.getParameter("eingabe") %>" /> Eingabe: <input type="text" name="eingabe" value="<jsp:getProperty name="reverseStringBean" property="string"/>" /> <br /><br /> Ausgabe: <strong> <jsp:getProperty name="reverseStringBean" property="reverseString"/> </strong> <br /><br /> Zugriff auf die JavaBean <input type="submit" value="Eingabe spiegeln" /> </form><br /> </body> ... 34 © Holger Röder Winter 2008/2009 Programmentwicklung JavaBeans ReverseTextBean.java public class ReverseStringBean { String string = ""; public void setString(String s) { if (s != null) string = s; } public String getString() { return string; } public String getReverseString() { return new StringBuilder(string) .reverse().toString(); } } se JavaBeans sind „normale“ JavaKlassen Auf bestimmte Eigenschaften (Properties) der JavaBean kann aus der JSP heraus zugegriffen werden. In der JavaBean-Klasse existieren setX(...) und/oder getX()-Methoden für die Property X Der Zugriff in der JSP erfolgt über die JSP-Tags <jsp:setProperty> und <jsp:getProperty> 35 © Holger Röder Die Properties einer JavaBean können fest mit den im Request-Objekt gespeicherten Parametern verknüpft werden. ... <jsp:setProperty name="reverseStringBean" property="*" /> ... Mit * werden alle Properties mit gleichnamigen Parametern verknüpft; alternativ können auch einzelne Parameter angegeben werden. Programmentwicklung Winter 2008/2009 JSPs und JavaBeans (2) se 36 © Holger Röder Winter 2008/2009 Programmentwicklung se 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 © Holger Röder Winter 2008/2009 Programmentwicklung se 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 abgeschlossen) <%! 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 © Holger Röder Winter 2008/2009 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) .reverse().toString(); out.print(ausgabe); } Programmentwicklung %> se 39 © Holger Röder Winter 2008/2009 Scriptlets: Implizite Variablen Innerhalb von Scriptlets stehen verschiedene implizite Variablen zur Verfügung, die ohne Deklaration verwendet werden können, z. B. ServletRequest request ServletResponse response JspWriter out HttpSession session ... <% out.println("Hallo Welt!"); Programmentwicklung %> se 40 © Holger Röder Versteckte Kommentare (Hidden Comments) Syntax: <%-- Kommentar --%> Versteckte Kommentare können zur Dokumentation des JSPCodes verwendet werden. Sie werden von der JSP-Engine nicht verarbeitet und deshalb auch nicht zum Client gesendet. Ausgabe-Kommentare (Output Comments) Syntax: <!-- Kommentar --> Ausgabe-Kommentare sind normale HTML-Kommentare, die auch im an den Client gesendeten HTML-Code enthalten sind. Programmentwicklung Winter 2008/2009 Kommentare se 41 © Holger Röder Winter 2008/2009 Programmentwicklung se 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 Folgeseite („Aufgabe 2“). Die für die Darstellung benötigten Daten werden aus dem Request-Objekt oder über JavaBeans geholt, die ihrerseits auf die Geschäftslogik zugreifen. Web Container Request Servlet Geschäftslogik JSP JavaBeans Response 42 © Holger Röder Winter 2008/2009 Programmentwicklung se Datenübergabe Servlet Æ JSP Beide Technologien – Servlets und JSPs – können kombiniert werden: Servlets: Bearbeitung der Anfragen (Geschäftslogik) JSPs: Präsentation 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 Ergebnisse werden als Attribute im Request-Objekt gespeichert: request.setAttribute("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 © Holger Röder Winter 2008/2009 Programmentwicklung se 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, response); ... // 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, response); 44