37
Komponentenbasierte Software- Entwicklung Prof. Dr. Stephan Kleuker 166 Servlet -Lebenszyklus Laden static static static static{...} {...} {...} {...} Instanziieren new new new new MyServlet MyServlet MyServlet MyServlet() () () () Initialisieren init init init init() () () () Bearbeiten service service service service() () () () Aufruf von doGet doGet doGet doGet() () () () oder doPost doPost doPost doPost() () () () Löschen destroy destroy destroy destroy() () () () request request request request response response response response meist ein wieder- verwendetes Exemplar für Entwicklung relevant

Servlet -Lebenszyklushome.edvsz.fh-osnabrueck.de/skleuker/WS09_KbSE/WS09KbSE_Teil0… · Servlet -Lebenszyklus ... Cookie zur Nutzeridentifikation ... • Servlet kann Parameter im

Embed Size (px)

Citation preview

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

176

Session (2/2)

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>>>>

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

202

Kombination von HTML, Servlets und JSP (6/6)