© Holger Röder
Winter 2009/2010
Programmentwicklung
se
Java: Kapitel 10
Einführung in die Java Platform,
Enterprise Edition (Java EE):
Servlets und Java Server Pages
Programmentwicklung WS 2009/2010
Holger Röder
holger.roeder@informatik.uni-stuttgart.de
© Holger Röder
Winter 2009/2010
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 WebAnwendungen.
Programmentwicklung
Winter 2009/2010
Überblick über die Java EE
se
3
© Holger Röder
Programmentwicklung
Winter 2009/2010
Java EE Application Model
se
Quelle: Sun Microsystems
4
© Holger Röder
Winter 2009/2010
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 2009/2010
Web-Container: Beispiel Apache Tomcat
se
6
© Holger Röder
Winter 2009/2010
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 2009/2010
Statische vs. dynamische Web-Seiten (2)
Dynamische Web-Seiten:
Statisch vorliegende Dokumente (z. B. Grafiken) werden vom WebServer 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 2009/2010
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 2009/2010
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.
Request
Web
Container
Programmentwicklung
Servlet
se
Geschäftslogik
(in „StandardJava“
implementiert)
Response
Das Servlet erstellt dynamisch die Folgeseite und
liefert diese an den Web-Browser zurück.
10
© Holger Röder
Winter 2009/2010
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 2009/2010
Servlet-Hierarchie
se
12
© Holger Röder
Winter 2009/2010
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 2009/2010
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 2009/2010
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 Responsethrows ServletException, IOException {
Objekt
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 2009/2010
© 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 2009/2010
Deployment von Web-Anwendungen
se
17
© Holger Röder
Deployment Descriptor
Beispiel: Auschnitt aus einer Konfigurationsdatei web.xml
Programmentwicklung
Winter 2009/2010
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 2009/2010
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 2009/2010
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 2009/2010
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 2009/2010
© Holger Röder
Anfrage-Objekte: ServletRequest
22
© Holger Röder
Winter 2009/2010
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 2009/2010
HttpServletRequest (2)
se
24
se
Programmentwicklung
Winter 2009/2010
© Holger Röder
Antwort-Objekte: ServletResponse
25
© Holger Röder
Winter 2009/2010
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 2009/2010
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 NameWert-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 2009/2010
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 2009/2010
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 2009/2010
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 URL-Encoding
etc.)
30
© Holger Röder
Winter 2009/2010
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 2009/2010
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 2009/2010
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 2009/2010
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 2009/2010
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 2009/2010
JSPs und JavaBeans (2)
se
36
© Holger Röder
Winter 2009/2010
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 2009/2010
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)
Programmentwicklung
<%! int a = 17; %>
se
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 2009/2010
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 2009/2010
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 JSP-Codes
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 2009/2010
Kommentare
se
41
© Holger Röder
Winter 2009/2010
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.
Request
Web
Container
Servlet
Geschäftslogik
JSP
JavaBeans
Response
42
© Holger Röder
Winter 2009/2010
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 2009/2010
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