Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
166
Servlet - Lebenszyklus
Laden staticstaticstaticstatic{...}{...}{...}{...}
Instanziieren newnewnewnew MyServletMyServletMyServletMyServlet()()()()
Initialisieren initinitinitinit()()()()
Bearbeiten serviceserviceserviceservice()()()()
Aufruf von doGetdoGetdoGetdoGet()()()() oder doPostdoPostdoPostdoPost()()()()
Löschen destroydestroydestroydestroy()()()()
requestrequestrequestrequest
responseresponseresponseresponse
meist einwieder-verwendetesExemplar
für Entwicklungrelevant
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
167
Beispiel: Keine Threadsicherheit (1/2)
publicpublicpublicpublic classclassclassclass TimerServletTimerServletTimerServletTimerServlet extendsextendsextendsextends HttpServletHttpServletHttpServletHttpServlet {{{{private private private private intintintint zvzvzvzv; // un; // un; // un; // unüüüüblichblichblichblich
@@@@OverrideOverrideOverrideOverride publicpublicpublicpublic voidvoidvoidvoid initinitinitinit() {() {() {() {zvzvzvzv = 42;= 42;= 42;= 42;
}}}}
protectedprotectedprotectedprotected voidvoidvoidvoid processRequest(HttpServletRequestprocessRequest(HttpServletRequestprocessRequest(HttpServletRequestprocessRequest(HttpServletRequest requestrequestrequestrequest, , , , HttpServletResponseHttpServletResponseHttpServletResponseHttpServletResponse responseresponseresponseresponse))))throwsthrowsthrowsthrows ServletExceptionServletExceptionServletExceptionServletException, , , , IOExceptionIOExceptionIOExceptionIOException {{{{
response.setContentType("text/html;charset=UTFresponse.setContentType("text/html;charset=UTFresponse.setContentType("text/html;charset=UTFresponse.setContentType("text/html;charset=UTF----8");8");8");8");PrintWriterPrintWriterPrintWriterPrintWriter out = out = out = out = response.getWriterresponse.getWriterresponse.getWriterresponse.getWriter();();();();out.println((newout.println((newout.println((newout.println((new Date()) + " <Date()) + " <Date()) + " <Date()) + " <brbrbrbr> ");> ");> ");> ");intintintint tmp=zvtmp=zvtmp=zvtmp=zv;;;;trytrytrytry {{{{Thread.sleep(10000);Thread.sleep(10000);Thread.sleep(10000);Thread.sleep(10000);
} catch (} catch (} catch (} catch (InterruptedExceptionInterruptedExceptionInterruptedExceptionInterruptedException ex) {}ex) {}ex) {}ex) {}zvzvzvzv = tmp+1;= tmp+1;= tmp+1;= tmp+1;out.println("Wertout.println("Wertout.println("Wertout.println("Wert: " + : " + : " + : " + zvzvzvzv););););out.closeout.closeout.closeout.close();();();();
}...}...}...}...
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
168
Beispiel: Keine Threadsicherheit (2/2)
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
169
Berechnen und Weiterleiten (1/2)
publicpublicpublicpublic classclassclassclass MachAMachAMachAMachA extendsextendsextendsextends HttpServletHttpServletHttpServletHttpServlet {{{{
protectedprotectedprotectedprotected voidvoidvoidvoid processRequest(HttpServletRequestprocessRequest(HttpServletRequestprocessRequest(HttpServletRequestprocessRequest(HttpServletRequest requestrequestrequestrequest, , , , HttpServletResponseHttpServletResponseHttpServletResponseHttpServletResponse responseresponseresponseresponse))))throwsthrowsthrowsthrows ServletExceptionServletExceptionServletExceptionServletException, , , , IOExceptionIOExceptionIOExceptionIOException {{{{
request.setAttribute("Startrequest.setAttribute("Startrequest.setAttribute("Startrequest.setAttribute("Start", ", ", ", newnewnewnew Date());//String,ObjectDate());//String,ObjectDate());//String,ObjectDate());//String,Object// keine // keine // keine // keine responseresponseresponseresponse----NutzungNutzungNutzungNutzung!!!!trytrytrytry {{{{Thread.sleep(10000);Thread.sleep(10000);Thread.sleep(10000);Thread.sleep(10000);
} catch (} catch (} catch (} catch (InterruptedExceptionInterruptedExceptionInterruptedExceptionInterruptedException ex) {ex) {ex) {ex) {}}}}RequestDispatcherRequestDispatcherRequestDispatcherRequestDispatcher viewviewviewview = = = = requestrequestrequestrequest....
getRequestDispatcher("MachBgetRequestDispatcher("MachBgetRequestDispatcher("MachBgetRequestDispatcher("MachB");");");");view.forward(requestview.forward(requestview.forward(requestview.forward(request, , , , responseresponseresponseresponse););););// nichts weiter!// nichts weiter!// nichts weiter!// nichts weiter!
}}}}
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
170
Berechnen und Weiterleiten (2/2)
publicpublicpublicpublic classclassclassclass MachBMachBMachBMachB extendsextendsextendsextends HttpServletHttpServletHttpServletHttpServlet {{{{
protectedprotectedprotectedprotected voidvoidvoidvoid processRequest(HttpServletRequestprocessRequest(HttpServletRequestprocessRequest(HttpServletRequestprocessRequest(HttpServletRequest requestrequestrequestrequest, , , ,
HttpServletResponseHttpServletResponseHttpServletResponseHttpServletResponse responseresponseresponseresponse))))
throwsthrowsthrowsthrows ServletExceptionServletExceptionServletExceptionServletException, , , , IOExceptionIOExceptionIOExceptionIOException {{{{
response.setContentType("text/html;charset=UTFresponse.setContentType("text/html;charset=UTFresponse.setContentType("text/html;charset=UTFresponse.setContentType("text/html;charset=UTF----8");8");8");8");
PrintWriterPrintWriterPrintWriterPrintWriter out = out = out = out = response.getWriterresponse.getWriterresponse.getWriterresponse.getWriter();();();();
trytrytrytry {{{{
out.println("Gestartetout.println("Gestartetout.println("Gestartetout.println("Gestartet: "+: "+: "+: "+request.getAttribute("Startrequest.getAttribute("Startrequest.getAttribute("Startrequest.getAttribute("Start"));"));"));"));
out.println("<br>Beendetout.println("<br>Beendetout.println("<br>Beendetout.println("<br>Beendet: "+: "+: "+: "+newnewnewnew Date());Date());Date());Date());
} } } } finallyfinallyfinallyfinally { { { {
out.closeout.closeout.closeout.close();();();();
}}}}
}... }... }... }...
Klassenname in web.xml auch als Servlet-Name gesetzt
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
171
HHTP ist zustandslos/gedächtnislos (1/4)
<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "----//W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 Transitional//ENTransitional//ENTransitional//ENTransitional//EN">">">">
<<<<htmlhtmlhtmlhtml>>>>
<<<<headheadheadhead>>>>
<<<<title></titletitle></titletitle></titletitle></title>>>>
<<<<metametametameta httphttphttphttp----equiv="Contentequiv="Contentequiv="Contentequiv="Content----TypeTypeTypeType" " " "
content="text/htmlcontent="text/htmlcontent="text/htmlcontent="text/html; charset=UTF; charset=UTF; charset=UTF; charset=UTF----8">8">8">8">
</</</</headheadheadhead>>>>
<<<<bodybodybodybody>>>>
<form <form <form <form name="amnesiename="amnesiename="amnesiename="amnesie" " " " action="Amnesieaction="Amnesieaction="Amnesieaction="Amnesie" " " " method="POSTmethod="POSTmethod="POSTmethod="POST">">">">
Programmiersprache Nr.1?Programmiersprache Nr.1?Programmiersprache Nr.1?Programmiersprache Nr.1?
<<<<inputinputinputinput type="texttype="texttype="texttype="text" name="prog1" " name="prog1" " name="prog1" " name="prog1" valuevaluevaluevalue="" size="12" />="" size="12" />="" size="12" />="" size="12" />
<<<<inputinputinputinput type="submittype="submittype="submittype="submit" " " " value="Abschickenvalue="Abschickenvalue="Abschickenvalue="Abschicken" name="send1" />" name="send1" />" name="send1" />" name="send1" />
</form></form></form></form>
</</</</bodybodybodybody>>>>
</</</</htmlhtmlhtmlhtml>>>>
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
172
HHTP ist zustandslos/gedächtnislos (2/4)
publicpublicpublicpublic classclassclassclass Amnesie Amnesie Amnesie Amnesie extendsextendsextendsextends HttpServletHttpServletHttpServletHttpServlet {{{{
protectedprotectedprotectedprotected voidvoidvoidvoid processRequest(HttpServletRequestprocessRequest(HttpServletRequestprocessRequest(HttpServletRequestprocessRequest(HttpServletRequest requestrequestrequestrequest, , , , HttpServletResponseHttpServletResponseHttpServletResponseHttpServletResponse responseresponseresponseresponse))))throwsthrowsthrowsthrows ServletExceptionServletExceptionServletExceptionServletException, , , , IOExceptionIOExceptionIOExceptionIOException {{{{
response.setContentType("text/html;charset=UTFresponse.setContentType("text/html;charset=UTFresponse.setContentType("text/html;charset=UTFresponse.setContentType("text/html;charset=UTF----8");8");8");8");PrintWriterPrintWriterPrintWriterPrintWriter out = out = out = out = response.getWriterresponse.getWriterresponse.getWriterresponse.getWriter();();();();String prog1 = request.getParameter("prog1");String prog1 = request.getParameter("prog1");String prog1 = request.getParameter("prog1");String prog1 = request.getParameter("prog1");trytrytrytry {{{{ifififif (prog1 == null) {(prog1 == null) {(prog1 == null) {(prog1 == null) {out.println("Spracheout.println("Spracheout.println("Spracheout.println("Sprache 1: "1: "1: "1: "
+request.getAttribute("prog1"));+request.getAttribute("prog1"));+request.getAttribute("prog1"));+request.getAttribute("prog1"));out.println("<brout.println("<brout.println("<brout.println("<br> Sprache 2: " > Sprache 2: " > Sprache 2: " > Sprache 2: "
+ request.getParameter("prog2"));+ request.getParameter("prog2"));+ request.getParameter("prog2"));+ request.getParameter("prog2"));} } } } elseelseelseelse {...//n{...//n{...//n{...//näääächste Foliechste Foliechste Foliechste Folie
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
173
HHTP ist zustandslos/gedächtnislos (3/4)
elseelseelseelse {{{{request.setAttribute("prog1", prog1); // nur Versuchrequest.setAttribute("prog1", prog1); // nur Versuchrequest.setAttribute("prog1", prog1); // nur Versuchrequest.setAttribute("prog1", prog1); // nur Versuchout.println("<html><head></headout.println("<html><head></headout.println("<html><head></headout.println("<html><head></head>");>");>");>");out.println("<bodyout.println("<bodyout.println("<bodyout.println("<body>");>");>");>");out.println("<formout.println("<formout.println("<formout.println("<form name=name=name=name=\\\\"a2"a2"a2"a2\\\\" " " " action=action=action=action=\\\\"Amnesie"Amnesie"Amnesie"Amnesie\\\\" "" "" "" "
+ "+ "+ "+ "method=method=method=method=\\\\"POST"POST"POST"POST\\\\">Programmiersprache">Programmiersprache">Programmiersprache">Programmiersprache Nr.2?");Nr.2?");Nr.2?");Nr.2?");out.println("<inputout.println("<inputout.println("<inputout.println("<input type=type=type=type=\\\\"text"text"text"text\\\\" name=" name=" name=" name=\\\\"prog2"prog2"prog2"prog2\\\\" " " " " " " "
+ "+ "+ "+ "valuevaluevaluevalue====\\\\""""\\\\" size=" size=" size=" size=\\\\"12"12"12"12\\\\" />");" />");" />");" />");out.println("<inputout.println("<inputout.println("<inputout.println("<input type=type=type=type=\\\\"submit"submit"submit"submit\\\\" " " " " " " "
+ "+ "+ "+ "value=value=value=value=\\\\"Abschicken"Abschicken"Abschicken"Abschicken\\\\" name=" name=" name=" name=\\\\"send1"send1"send1"send1\\\\" />");" />");" />");" />");out.println("</form></body></htmlout.println("</form></body></htmlout.println("</form></body></htmlout.println("</form></body></html>");>");>");>");
}}}}} } } } finallyfinallyfinallyfinally {{{{out.closeout.closeout.closeout.close();();();();
}}}}}...}...}...}...
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
174
HHTP ist zustandslos/gedächtnislos (4/4)
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
175
Session (1/2)
...String prog1 = request.getParameter("prog1");String prog1 = request.getParameter("prog1");String prog1 = request.getParameter("prog1");String prog1 = request.getParameter("prog1");HttpSessionHttpSessionHttpSessionHttpSession sessionsessionsessionsession = = = = request.getSession(truerequest.getSession(truerequest.getSession(truerequest.getSession(true););););trytrytrytry {{{{ifififif (prog1 == null) {(prog1 == null) {(prog1 == null) {(prog1 == null) {out.println("Spracheout.println("Spracheout.println("Spracheout.println("Sprache 1: "+session.getAttribute("prog1"));1: "+session.getAttribute("prog1"));1: "+session.getAttribute("prog1"));1: "+session.getAttribute("prog1"));out.println("<brout.println("<brout.println("<brout.println("<br> Sprache 2: " > Sprache 2: " > Sprache 2: " > Sprache 2: "
+ request.getParameter("prog2"));+ request.getParameter("prog2"));+ request.getParameter("prog2"));+ request.getParameter("prog2"));} } } } elseelseelseelse {{{{session.setAttribute("prog1", prog1);session.setAttribute("prog1", prog1);session.setAttribute("prog1", prog1);session.setAttribute("prog1", prog1);out.println("<html><head></headout.println("<html><head></headout.println("<html><head></headout.println("<html><head></head>"); ...>"); ...>"); ...>"); ...
• in web.xml wichtig: (Minuten, -1 für unbeschränkt)<<<<sessionsessionsessionsession----configconfigconfigconfig>>>>
<<<<sessionsessionsessionsession----timeouttimeouttimeouttimeout>>>>30303030
</</</</sessionsessionsessionsession----timeouttimeouttimeouttimeout>>>></</</</sessionsessionsessionsession----configconfigconfigconfig>>>>
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
177
HTTPSession
• ein Objekt, dass dem Servlet zugeordnet wird
• Objekt lebt von erster Servlet-Nutzung bis Nutzer Verbindung terminiert, Server terminiert, Servlet neu deployt wird oder Time-out
• mit HttpSessionHttpSessionHttpSessionHttpSession sessionsessionsessionsession = = = = request.getSession(truerequest.getSession(truerequest.getSession(truerequest.getSession(true);););); erhält man Session-Objekt (mit „true“ wird neue Session erzeugt, falls keine existiert, mit „false“ erhält man null falls keine Session existiert)
• Anmerkung: true kann weggelassen werden; ist default
unsere Ziele:
• Nutzer muss sich erst einloggen, wenn notwendig
• HTTPS nur nutzen, wenn nichts anderes möglich
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
178
Cookie zur Nutzeridentifikation
• Nutzer bekommt beim ersten Kontakt individuelle Session ID
HTTPHTTPHTTPHTTP
GETGETGETGET
………… WebWebWebWebServerServerServerServer
SteuerungSteuerungSteuerungSteuerung
GETGETGETGET
…………............
WebWebWebWeb----ServerServerServerServer
ClientClientClientClient
WebWebWebWebServerServerServerServer
SteuerungSteuerungSteuerungSteuerung
<HTML><HTML><HTML><HTML>
[Cookie][Cookie][Cookie][Cookie]
…………............
HTTPHTTPHTTPHTTP…………
<HTML><HTML><HTML><HTML>
[Cookie][Cookie][Cookie][Cookie]
…………
erster Kontakt:berechne ID,erstelle Cookie
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
179
Containerunterstützung für Cookies
• wir teilen mit, ob neue Session gewünscht ist, oder Session
genutzt wird
• Container erzeugt Session ID
• Container erzeugt Cookie mit Session ID als Inhalt
• Container macht Cookie zum Teil von response
• Achtung zwei Wirkungen einer Methode
HttpSessionHttpSessionHttpSessionHttpSession sessionsessionsessionsession = = = = request.getSession(truerequest.getSession(truerequest.getSession(truerequest.getSession(true):):):):
ifififif ((((requestrequestrequestrequest enthenthenthenthäääält Cookie mit Session ID)lt Cookie mit Session ID)lt Cookie mit Session ID)lt Cookie mit Session ID)
finde Session mit der genannten IDfinde Session mit der genannten IDfinde Session mit der genannten IDfinde Session mit der genannten ID
elseelseelseelse ifififif ((((requestrequestrequestrequest enthenthenthenthäääält keinen Cookie mit Session IDlt keinen Cookie mit Session IDlt keinen Cookie mit Session IDlt keinen Cookie mit Session ID
oder es gibt keine aktuelle Session mit der ID)oder es gibt keine aktuelle Session mit der ID)oder es gibt keine aktuelle Session mit der ID)oder es gibt keine aktuelle Session mit der ID)
erzeuge neue Sessionerzeuge neue Sessionerzeuge neue Sessionerzeuge neue Session
• Methode isNewisNewisNewisNew()()()() erlaubt Prüfung, ob Session gerade erzeugt
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
180
Browser ohne Cookie-Unterstützung
• Cookies können im Browser ausgeschaltet werden
• Container ermöglicht auch hier (unsicherere) Session ID-
Nutzung
• bei ausgeschalteten Cookies liefert isNew() immer true (was
ursprünglichen Ansatz verhindert)
• Lösung: URL Rewriting, Parameter jsessionid in URL
• Ansatz: immer wenn URL (Pfad) ausgegeben werden soll,
dann encode nutzen
out.println("<formout.println("<formout.println("<formout.println("<form name=name=name=name=\\\\"a2"a2"a2"a2\\\\" " " " actionactionactionaction====\\\\""""""""
+response.encodeURL("/ServletSpielerei4/Amnesie2")+response.encodeURL("/ServletSpielerei4/Amnesie2")+response.encodeURL("/ServletSpielerei4/Amnesie2")+response.encodeURL("/ServletSpielerei4/Amnesie2")
+"+"+"+"\\\\" " " " method=method=method=method=\\\\"POST"POST"POST"POST\\\\">Programmiersprache">Programmiersprache">Programmiersprache">Programmiersprache Nr.2?");Nr.2?");Nr.2?");Nr.2?");
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
181
Garantieren von URL-Rewriting
• In spezieller Datei des Web-Servers; Glassfish: sun-web.xml
<session<session<session<session----configconfigconfigconfig>>>><session<session<session<session----properties>properties>properties>properties>
<property name="<property name="<property name="<property name="enableCookiesenableCookiesenableCookiesenableCookies" value="false" />" value="false" />" value="false" />" value="false" /><property name="<property name="<property name="<property name="enableURLRewritingenableURLRewritingenableURLRewritingenableURLRewriting" value="true" /> " value="true" /> " value="true" /> " value="true" />
</session</session</session</session----properties>properties>properties>properties></session</session</session</session----configconfigconfigconfig>>>>
• URL-Rewriting bei Weiterleitung:
response.encodeRedirectURLresponse.encodeRedirectURLresponse.encodeRedirectURLresponse.encodeRedirectURL((((""""/Mach2/Mach2/Mach2/Mach2""""););););
Generell bei der Entwicklung
• Browser nach Nutzung schließen!
•
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
182
Irritationsversuch mit Session
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
183
Phishing (geht so auch ohne Cookie und Servlet)
:NaiverNutzer :ITBoesewicht :Servlet
Email: Gratis auf www.bankk.de
Geht auf Seite www.bankk.de Verbindung zu
www.bank.de
Session-CookieSession-Cookie+Login?
ID+Passwort+Session-Cookie ID+Passwort+
Session-CookiePeinliche Daten+Session-Cookie Peinliche Daten+
Session-Cookie
Bösewicht kann sich nach Passworterhalt ausklinken
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
184
Phishing mit Session ID
:NormalerNutzer :ITBoesewicht :UnerfahrenesServlet
Email: Gratis auf www.bank.de/jsessionmit Session ID
Geht auf Seite www.bank.de mit Session ID
Verbindung zu www.bank.de
Session ID
Session ID+Login?
ID+Passwort+Session ID
nutzt Session ID füreigene Entdeckungen
Gegenmaßnahmen:- Timeout für Sessions setzen- session.invalidatesession.invalidatesession.invalidatesession.invalidate()()()() um Session bei Login zu beenden- nach Login neue Session ID vergeben
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
185
Weitere interessante Möglichkeiten
• Event-Listener (welchen Zustandswechsel führt ein Servlet
aus, welches Attribut ändert sich, ..)
z. B. Zählen aktiver Sessions
• Servlet kann Parameter im Deployment Descriptor haben,
die gelesen werden können
• HTTPSession-Objekte können serialisiert werden und von
einer zur anderen virtuellen Maschine wandern
• Applikation (Summe der zusammengehörigen Servlets) kann
(Context-) Parameter im Deployment Descriptor haben, die
gelesen werden können
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
186
5. JavaServer Pages
• Prinzip: Java in HTML
• Typisches Tags
• JSP-Lebenszyklus
• MVC2
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
187
Vorgehensweise
• Bekannt: Servlets erlauben Erstellung von Web-
Applikationen, leider viel HTML in Java
• JSP-Ansatz: Java in HTML einbetten
• Hier zunächst: JSP-Grundlagen getrennt betrachten
• Späteres Ziel: Vereinigung von Servlets, JSP, JavaBeans, JPA
zur strukturierten mehrschichtigen Software
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
188
Einführendes Beispiel
<%@<%@<%@<%@pagepagepagepage contentType="text/htmlcontentType="text/htmlcontentType="text/htmlcontentType="text/html" pageEncoding="UTF" pageEncoding="UTF" pageEncoding="UTF" pageEncoding="UTF----8"%>8"%>8"%>8"%><!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "----//W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 Transitional//ENTransitional//ENTransitional//ENTransitional//EN"""""http://www.w3.org/TR/html4/loose.dtd">"http://www.w3.org/TR/html4/loose.dtd">"http://www.w3.org/TR/html4/loose.dtd">"http://www.w3.org/TR/html4/loose.dtd">
<<<<htmlhtmlhtmlhtml>>>><<<<headheadheadhead>>>><<<<metametametameta httphttphttphttp----equiv="Contentequiv="Contentequiv="Contentequiv="Content----TypeTypeTypeType" " " "
content="text/htmlcontent="text/htmlcontent="text/htmlcontent="text/html; charset=UTF; charset=UTF; charset=UTF; charset=UTF----8">8">8">8"><<<<title>Zahlen</titletitle>Zahlen</titletitle>Zahlen</titletitle>Zahlen</title>>>>
</</</</headheadheadhead>>>><%@<%@<%@<%@pagepagepagepage import="java.util.Listimport="java.util.Listimport="java.util.Listimport="java.util.List, , , , java.util.ArrayListjava.util.ArrayListjava.util.ArrayListjava.util.ArrayList" %>" %>" %>" %><%! <%! <%! <%! List<IntegerList<IntegerList<IntegerList<Integer> zahlen = > zahlen = > zahlen = > zahlen = newnewnewnew ArrayList<IntegerArrayList<IntegerArrayList<IntegerArrayList<Integer>();%>>();%>>();%>>();%><% <% <% <% forforforfor ((((intintintint i = 1; i < 10; i = i + 3) i = 1; i < 10; i = i + 3) i = 1; i < 10; i = i + 3) i = 1; i < 10; i = i + 3) zahlen.add(izahlen.add(izahlen.add(izahlen.add(i); %>); %>); %>); %><<<<bodybodybodybody>>>><h3>Zahlen!</h3><h3>Zahlen!</h3><h3>Zahlen!</h3><h3>Zahlen!</h3><<<<ulululul>>>><% <% <% <% forforforfor (Integer i : zahlen) { %>(Integer i : zahlen) { %>(Integer i : zahlen) { %>(Integer i : zahlen) { %>
<<<<lililili> <%=i%> </> <%=i%> </> <%=i%> </> <%=i%> </lililili>>>><% }%><% }%><% }%><% }%>
</</</</ulululul>>>></</</</bodybodybodybody>>>>
</</</</htmlhtmlhtmlhtml>>>>
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
189
Typische Sprachelemente
• <%@ <%@ <%@ <%@ pagepagepagepage [[[[eigenschafteneigenschafteneigenschafteneigenschaften] %>] %>] %>] %>
Direktiven, hier Seiteneigenschaften, Info für Container
• <%! [Deklaration] %><%! [Deklaration] %><%! [Deklaration] %><%! [Deklaration] %>
Deklaration von in der Seite nutzbaren Methoden, Variablen
• <% [Programmst<% [Programmst<% [Programmst<% [Programmstüüüück] %>ck] %>ck] %>ck] %>
Ausführbare Code-Fragmente (Scriptlets)
• <%= [Ausdruck] %><%= [Ausdruck] %><%= [Ausdruck] %><%= [Ausdruck] %>
Auswertbarer Ausdruck, nutzt toStringtoStringtoStringtoString()()()()
• Anmerkung: Gibt auch reine XML-Syntax (wesentlich
sauberer, aber später eingeführt und längere Tipperei,
daher seltener genutzt)
<<<<jsp:directive.pagejsp:directive.pagejsp:directive.pagejsp:directive.page [[[[eigenschafteneigenschafteneigenschafteneigenschaften] />] />] />] />
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
190
JSPs sind Servlets
C:\Sun\AppServer\domains\domain1\generated\jsp\j2ee-modules\JSPSpielerei1\org\apache\jsppublicpublicpublicpublic final final final final classclassclassclass index_jspindex_jspindex_jspindex_jsp extendsextendsextendsextends // aus // aus // aus // aus index.jspindex.jspindex.jspindex.jsp
org.apache.jasper.runtime.HttpJspBaseorg.apache.jasper.runtime.HttpJspBaseorg.apache.jasper.runtime.HttpJspBaseorg.apache.jasper.runtime.HttpJspBase...{...{...{...{List<IntegerList<IntegerList<IntegerList<Integer> zahlen = > zahlen = > zahlen = > zahlen = newnewnewnew ArrayList<IntegerArrayList<IntegerArrayList<IntegerArrayList<Integer>(); ...>(); ...>(); ...>(); ...publicpublicpublicpublic voidvoidvoidvoid ____jspService(HttpServletRequestjspService(HttpServletRequestjspService(HttpServletRequestjspService(HttpServletRequest requestrequestrequestrequest, , , ,
HttpServletResponseHttpServletResponseHttpServletResponseHttpServletResponse responseresponseresponseresponse))))throwsthrowsthrowsthrows java.io.IOExceptionjava.io.IOExceptionjava.io.IOExceptionjava.io.IOException, , , , ServletExceptionServletExceptionServletExceptionServletException {...{...{...{...
trytrytrytry {{{{response.setContentType("text/html;charset=UTFresponse.setContentType("text/html;charset=UTFresponse.setContentType("text/html;charset=UTFresponse.setContentType("text/html;charset=UTF----8");8");8");8");response.setHeader("Xresponse.setHeader("Xresponse.setHeader("Xresponse.setHeader("X----PoweredPoweredPoweredPowered----ByByByBy", "JSP/2.1"); ...", "JSP/2.1"); ...", "JSP/2.1"); ...", "JSP/2.1"); ...
forforforfor ((((intintintint i = 1; i < 10; i = i + 3) i = 1; i < 10; i = i + 3) i = 1; i < 10; i = i + 3) i = 1; i < 10; i = i + 3) zahlen.add(izahlen.add(izahlen.add(izahlen.add(i); ...); ...); ...); ...
forforforfor (Integer i : zahlen) {(Integer i : zahlen) {(Integer i : zahlen) {(Integer i : zahlen) {out.write("out.write("out.write("out.write("\\\\nnnn");");");");out.writeout.writeout.writeout.write(" <(" <(" <(" <lililili>");>");>");>");out.print(iout.print(iout.print(iout.print(i););););out.write("</li>out.write("</li>out.write("</li>out.write("</li>\\\\nnnn");");");");out.writeout.writeout.writeout.write(" ");(" ");(" ");(" ");
}...}...}...}...
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
191
Implizite Objekte - Ausschnitt (1/2)
<%@<%@<%@<%@pagepagepagepage contentType="text/htmlcontentType="text/htmlcontentType="text/htmlcontentType="text/html" pageEncoding="UTF" pageEncoding="UTF" pageEncoding="UTF" pageEncoding="UTF----8"%>8"%>8"%>8"%><<<<htmlhtmlhtmlhtml>>>><<<<headheadheadhead> <> <> <> <title>Implizitetitle>Implizitetitle>Implizitetitle>Implizite Objekte</titleObjekte</titleObjekte</titleObjekte</title> </> </> </> </headheadheadhead>>>><% response.setContentType("text/html;charset=UTF<% response.setContentType("text/html;charset=UTF<% response.setContentType("text/html;charset=UTF<% response.setContentType("text/html;charset=UTF----8"); %>8"); %>8"); %>8"); %><% <% <% <% ifififif ((((session.isNewsession.isNewsession.isNewsession.isNew()) {()) {()) {()) {
session.setAttribute("Zaehlersession.setAttribute("Zaehlersession.setAttribute("Zaehlersession.setAttribute("Zaehler", 1);", 1);", 1);", 1);}}}}
%>%>%>%><<<<body><formbody><formbody><formbody><form name="f1" name="f1" name="f1" name="f1" action="index.jspaction="index.jspaction="index.jspaction="index.jsp" " " " method="POSTmethod="POSTmethod="POSTmethod="POST">">">">
<% <% <% <% ifififif ((((request.getParameter("nrequest.getParameter("nrequest.getParameter("nrequest.getParameter("n") != null){%>") != null){%>") != null){%>") != null){%>letzte Nachricht: <%=letzte Nachricht: <%=letzte Nachricht: <%=letzte Nachricht: <%=request.getParameter("nrequest.getParameter("nrequest.getParameter("nrequest.getParameter("n")%> <")%> <")%> <")%> <brbrbrbr>>>><% ;}%><% ;}%><% ;}%><% ;}%>Nachricht:<inputNachricht:<inputNachricht:<inputNachricht:<input type="texttype="texttype="texttype="text" " " " name="nname="nname="nname="n" " " " valuevaluevaluevalue="" size="12" />="" size="12" />="" size="12" />="" size="12" /><% <% <% <% intintintint anzahlanzahlanzahlanzahl = (Integer) = (Integer) = (Integer) = (Integer) session.getAttribute("Zaehlersession.getAttribute("Zaehlersession.getAttribute("Zaehlersession.getAttribute("Zaehler");");");");
out.println("<brout.println("<brout.println("<brout.println("<br> Ihre Aufrufe: " + (> Ihre Aufrufe: " + (> Ihre Aufrufe: " + (> Ihre Aufrufe: " + (anzahl++)+"<branzahl++)+"<branzahl++)+"<branzahl++)+"<br>");>");>");>");session.setAttribute("Zaehlersession.setAttribute("Zaehlersession.setAttribute("Zaehlersession.setAttribute("Zaehler", ", ", ", anzahlanzahlanzahlanzahl););););
%>%>%>%><<<<inputinputinputinput type="submittype="submittype="submittype="submit" " " " value="Weitervalue="Weitervalue="Weitervalue="Weiter" name="w1" />" name="w1" />" name="w1" />" name="w1" />
</</</</form></bodyform></bodyform></bodyform></body>>>></</</</htmlhtmlhtmlhtml>>>>
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
192
Implizite Objekte - Ausschnitt (2/2)
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
193
JSP - Lebenszyklus
Klasse laden
Instanziieren
Initialisieren jspInitjspInitjspInitjspInit()()()()
Bearbeiten ____jSPjSPjSPjSPserviceserviceserviceservice()()()()
Löschen jspDestroyjspDestroyjspDestroyjspDestroy()()()()
requestrequestrequestrequest
responseresponseresponseresponse
Erster Aufruf?
für Entwicklungrelevant
JSP-Seite in Servlet übersetzen
JSP-Seite kompilieren
[nein]
[ja]
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
194
Nutzung von Beans (1/2)
• Generell können in Servlets und JSPs selbst entwickelte Java-Klassen (POJO, Plain Old Java Objects) direkt genutzt werden
• Um möglichst wenig Java in JSPs zu haben existieren sogenannte Aktionselemente (Action Elements)
• Idee: XML-artige Erzeugung und Nutzung von Beans
• Beanerzeugung
<<<<jsp:useBeanjsp:useBeanjsp:useBeanjsp:useBean id="kundeid="kundeid="kundeid="kunde" " " " class="entities.Kundeclass="entities.Kundeclass="entities.Kundeclass="entities.Kunde" />" />" />" />
entspricht kundekundekundekunde = = = = newnewnewnew entities.Kundeentities.Kundeentities.Kundeentities.Kunde();();();();
idididid: (Variablen-)Name, auch kunde.getAdressekunde.getAdressekunde.getAdressekunde.getAdresse()()()() möglich
classclassclassclass: voll qualifizierter Klassenname
scopescopescopescope: Gültigkeitsbereich (page, request, session, application)
typetypetypetype: Typ der Variablen kundekundekundekunde
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
195
Nutzung von Beans (2/2)
• Set-Methode (auch für Attribute und Properties aus request)
<<<<jsp:setPropertyjsp:setPropertyjsp:setPropertyjsp:setProperty name=name=name=name=""""kundekundekundekunde"""" property=property=property=property=""""adresseadresseadresseadresse" " " "
value=value=value=value=““““XstrXstrXstrXstr. 42" />. 42" />. 42" />. 42" />
entspricht kunde.setAdressekunde.setAdressekunde.setAdressekunde.setAdresse((((""""XStrXStrXStrXStr. 42. 42. 42. 42""""););););
namenamenamename: vergebene id
propertypropertypropertyproperty: name der zu ändernden Eigenschaft
valuevaluevaluevalue: Wert (wird konvertiert, wenn möglich)
paramparamparamparam: Alternativ Parameter aus request nutzbar
• Get-Methode (auch für Attribute und Properties aus request)
<<<<jsp:getPropertyjsp:getPropertyjsp:getPropertyjsp:getProperty name="name="name="name="kundekundekundekunde" property="" property="" property="" property="adresseadresseadresseadresse" />" />" />" />
entspricht kunde.getAdressekunde.getAdressekunde.getAdressekunde.getAdresse();();();();
namenamenamename s.o; propertypropertypropertyproperty: zu lesende Eigenschaft
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
196
Basis-Design-Pattern für Web-Applikationen
• Ansatz heißt Model-View-Controller 2 (MVC2)
ServletServletServletServlet
alsalsalsals
ControllerControllerControllerController
JavaBeanJavaBeanJavaBeanJavaBean
alsalsalsals
ModelModelModelModel
JSPJSPJSPJSP
alsalsalsals
ViewViewViewView
requestrequestrequestrequestliestliestliestliest
schreibtschreibtschreibtschreibt
responseresponseresponseresponse
üüüübergibt Kontrollebergibt Kontrollebergibt Kontrollebergibt Kontrolle(und (und (und (und requestrequestrequestrequest))))
liestliestliestliest
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
197
Kombination von HTML, Servlets und JSP (1/6)
packagepackagepackagepackage entitiesentitiesentitiesentities;;;;publicpublicpublicpublic classclassclassclass Kunde {Kunde {Kunde {Kunde {private String private String private String private String namenamenamename;;;;private private private private intintintint alter;alter;alter;alter;private String Adresse;private String Adresse;private String Adresse;private String Adresse;
publicpublicpublicpublic Kunde(){}Kunde(){}Kunde(){}Kunde(){}
publicpublicpublicpublic Kunde(StringKunde(StringKunde(StringKunde(String namenamenamename, , , , intintintint alter, String Adresse) {alter, String Adresse) {alter, String Adresse) {alter, String Adresse) {this.namethis.namethis.namethis.name = = = = namenamenamename;;;;this.alterthis.alterthis.alterthis.alter = alter;= alter;= alter;= alter;this.Adressethis.Adressethis.Adressethis.Adresse = Adresse;= Adresse;= Adresse;= Adresse;
}}}}
// // // // getgetgetget---- und und und und setsetsetset----MethodenMethodenMethodenMethoden ffffüüüür die Attributer die Attributer die Attributer die Attribute
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
198
Kombination von HTML, Servlets und JSP (2/6)
<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "----//W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 Transitional//ENTransitional//ENTransitional//ENTransitional//EN">">">"><<<<htmlhtmlhtmlhtml> <!> <!> <!> <!-------- index.htmlindex.htmlindex.htmlindex.html -------->>>><<<<headheadheadhead>>>><<<<title>Detailanfrage</titletitle>Detailanfrage</titletitle>Detailanfrage</titletitle>Detailanfrage</title>>>><<<<metametametameta httphttphttphttp----equiv="Contentequiv="Contentequiv="Contentequiv="Content----TypeTypeTypeType" " " "
content="text/htmlcontent="text/htmlcontent="text/htmlcontent="text/html; charset=UTF; charset=UTF; charset=UTF; charset=UTF----8">8">8">8"></</</</headheadheadhead>>>><<<<bodybodybodybody>>>><form <form <form <form name="suchename="suchename="suchename="suche" " " " action="Sucheaction="Sucheaction="Sucheaction="Suche">">">">Name:Name:Name:Name:<<<<inputinputinputinput type="texttype="texttype="texttype="text" " " " name="namename="namename="namename="name" " " " valuevaluevaluevalue="" size="15" />="" size="15" />="" size="15" />="" size="15" /><<<<inputinputinputinput type="submittype="submittype="submittype="submit" " " " value="Abschickenvalue="Abschickenvalue="Abschickenvalue="Abschicken" " " " name="sendname="sendname="sendname="send" />" />" />" />
</form></form></form></form></</</</bodybodybodybody>>>>
</</</</htmlhtmlhtmlhtml>>>>
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
199
Kombination von HTML, Servlets und JSP (3/6)
publicpublicpublicpublic classclassclassclass Suche Suche Suche Suche extendsextendsextendsextends HttpServletHttpServletHttpServletHttpServlet {{{{private private private private Set<KundeSet<KundeSet<KundeSet<Kunde> > > > kundenkundenkundenkunden = = = = newnewnewnew HashSet<KundeHashSet<KundeHashSet<KundeHashSet<Kunde>();>();>();>();@@@@OverrideOverrideOverrideOverride publicpublicpublicpublic voidvoidvoidvoid initinitinitinit(){(){(){(){
kunden.add(newkunden.add(newkunden.add(newkunden.add(new Kunde("Ute",42,"XStr. 3"));Kunde("Ute",42,"XStr. 3"));Kunde("Ute",42,"XStr. 3"));Kunde("Ute",42,"XStr. 3"));kunden.add(newkunden.add(newkunden.add(newkunden.add(new Kunde("Urs",43,"YStr. 9"));Kunde("Urs",43,"YStr. 9"));Kunde("Urs",43,"YStr. 9"));Kunde("Urs",43,"YStr. 9"));kunden.add(newkunden.add(newkunden.add(newkunden.add(new Kunde("Ulf",44,"YStr. 3"));Kunde("Ulf",44,"YStr. 3"));Kunde("Ulf",44,"YStr. 3"));Kunde("Ulf",44,"YStr. 3"));
}}}}
protectedprotectedprotectedprotected voidvoidvoidvoid processRequest(HttpServletRequestprocessRequest(HttpServletRequestprocessRequest(HttpServletRequestprocessRequest(HttpServletRequest requestrequestrequestrequest, , , , HttpServletResponseHttpServletResponseHttpServletResponseHttpServletResponse responseresponseresponseresponse))))throwsthrowsthrowsthrows ServletExceptionServletExceptionServletExceptionServletException, , , , IOExceptionIOExceptionIOExceptionIOException {{{{
String String String String namenamenamename= = = = request.getParameter("namerequest.getParameter("namerequest.getParameter("namerequest.getParameter("name");");");");Kunde Kunde Kunde Kunde ergebnisergebnisergebnisergebnis= = = = newnewnewnew Kunde(name,Kunde(name,Kunde(name,Kunde(name,----1,"fehlt");1,"fehlt");1,"fehlt");1,"fehlt");for(Kundefor(Kundefor(Kundefor(Kunde k:kundenk:kundenk:kundenk:kunden))))if(k.getName().equals(nameif(k.getName().equals(nameif(k.getName().equals(nameif(k.getName().equals(name))))))))
ergebnis=kergebnis=kergebnis=kergebnis=k;;;;request.setAttribute("ergrequest.setAttribute("ergrequest.setAttribute("ergrequest.setAttribute("erg", ", ", ", ergebnisergebnisergebnisergebnis););););RequestDispatcherRequestDispatcherRequestDispatcherRequestDispatcher viewviewviewview = = = = request.getRequestDispatcher("ergebnis.jsprequest.getRequestDispatcher("ergebnis.jsprequest.getRequestDispatcher("ergebnis.jsprequest.getRequestDispatcher("ergebnis.jsp");");");");
view.forward(requestview.forward(requestview.forward(requestview.forward(request, , , , responseresponseresponseresponse););););}... }... }... }...
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
200
Kombination von HTML, Servlets und JSP (4/6)
<%@<%@<%@<%@pagepagepagepage contentType="text/htmlcontentType="text/htmlcontentType="text/htmlcontentType="text/html" pageEncoding="UTF" pageEncoding="UTF" pageEncoding="UTF" pageEncoding="UTF----8"%>8"%>8"%>8"%>
<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "----//W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 Transitional//ENTransitional//ENTransitional//ENTransitional//EN""""
"http://www.w3.org/TR/html4/loose.dtd">"http://www.w3.org/TR/html4/loose.dtd">"http://www.w3.org/TR/html4/loose.dtd">"http://www.w3.org/TR/html4/loose.dtd">
<<<<htmlhtmlhtmlhtml>>>>
<<<<headheadheadhead>>>>
<<<<metametametameta httphttphttphttp----equiv="Contentequiv="Contentequiv="Contentequiv="Content----TypeTypeTypeType" " " "
content="text/htmlcontent="text/htmlcontent="text/htmlcontent="text/html; charset=UTF; charset=UTF; charset=UTF; charset=UTF----8">8">8">8">
<<<<title>Suchergebnis</titletitle>Suchergebnis</titletitle>Suchergebnis</titletitle>Suchergebnis</title>>>>
</</</</headheadheadhead>>>>
<<<<bodybodybodybody>>>>
Name: <Name: <Name: <Name: <jsp:getPropertyjsp:getPropertyjsp:getPropertyjsp:getProperty name="ergname="ergname="ergname="erg" " " " property="nameproperty="nameproperty="nameproperty="name"/> <"/> <"/> <"/> <brbrbrbr>>>>
Alter: <Alter: <Alter: <Alter: <jsp:getPropertyjsp:getPropertyjsp:getPropertyjsp:getProperty name="ergname="ergname="ergname="erg" " " " property="alterproperty="alterproperty="alterproperty="alter"/> <"/> <"/> <"/> <brbrbrbr>>>>
Adresse: <Adresse: <Adresse: <Adresse: <jsp:getPropertyjsp:getPropertyjsp:getPropertyjsp:getProperty name="ergname="ergname="ergname="erg" " " " property="adresseproperty="adresseproperty="adresseproperty="adresse"/>"/>"/>"/>
</</</</bodybodybodybody>>>>
</</</</htmlhtmlhtmlhtml>>>>
Komponentenbasierte Software-
Entwicklung
Prof. Dr.
Stephan Kleuker
201
Kombination von HTML, Servlets und JSP (5/6)
<?<?<?<?xmlxmlxmlxml version="1.0" encoding="UTFversion="1.0" encoding="UTFversion="1.0" encoding="UTFversion="1.0" encoding="UTF----8"?>8"?>8"?>8"?><<<<webwebwebweb----appappappapp version="2.5" version="2.5" version="2.5" version="2.5"
xmlns="http://java.sun.com/xml/ns/javaeexmlns="http://java.sun.com/xml/ns/javaeexmlns="http://java.sun.com/xml/ns/javaeexmlns="http://java.sun.com/xml/ns/javaee" " " " xmlns:xsi="http://www.w3.org/2001/XMLSchemaxmlns:xsi="http://www.w3.org/2001/XMLSchemaxmlns:xsi="http://www.w3.org/2001/XMLSchemaxmlns:xsi="http://www.w3.org/2001/XMLSchema----instance" instance" instance" instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaeexsi:schemaLocation="http://java.sun.com/xml/ns/javaeexsi:schemaLocation="http://java.sun.com/xml/ns/javaeexsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/webhttp://java.sun.com/xml/ns/javaee/webhttp://java.sun.com/xml/ns/javaee/webhttp://java.sun.com/xml/ns/javaee/web----app_2_5.xsd">app_2_5.xsd">app_2_5.xsd">app_2_5.xsd"><<<<servletservletservletservlet>>>>
<<<<servletservletservletservlet----name>Suche</servletname>Suche</servletname>Suche</servletname>Suche</servlet----namenamenamename>>>><<<<servletservletservletservlet----class>servlets.Suche</servletclass>servlets.Suche</servletclass>servlets.Suche</servletclass>servlets.Suche</servlet----classclassclassclass>>>>
</</</</servletservletservletservlet>>>><<<<servletservletservletservlet----mappingmappingmappingmapping>>>>
<<<<servletservletservletservlet----name>Suche</servletname>Suche</servletname>Suche</servletname>Suche</servlet----namenamenamename>>>><<<<urlurlurlurl----pattern>/Suche</urlpattern>/Suche</urlpattern>/Suche</urlpattern>/Suche</url----patternpatternpatternpattern>>>>
</</</</servletservletservletservlet----mappingmappingmappingmapping>>>><<<<welcomewelcomewelcomewelcome----filefilefilefile----listlistlistlist>>>>
<<<<welcomewelcomewelcomewelcome----file>index.html</welcomefile>index.html</welcomefile>index.html</welcomefile>index.html</welcome----filefilefilefile>>>></</</</welcomewelcomewelcomewelcome----filefilefilefile----listlistlistlist>>>>
</</</</webwebwebweb----appappappapp>>>>