itec 1 web client (browser) web server _____.html request url ( get, post ) response html _____.jsp...
TRANSCRIPT
1
iTec
web client(browser)
web server
_____.html
request URL (get, post)
response HTML_____.jsp
_____.class
application
DBMS
JDBC
RMISocketsCORBAEJB
Ausgangslage
(HTML-Seiten, Applets)
Einführung Web-basierte Anwendungsarchitekturen
HT
TP
2
iTec
Einführung Web-basierte Anwendungsarchitekturen
verteilte Präsentation
entfernte Präsentation
verteilte Anwendung
fat client
3
iTec
Präsentation
Einführung Web-basierte Anwendungsarchitekturen
Browser PresentationLayer
Web-Server
Domain LogicLayer
Application Server
DB Server
DB
Web-Client(z.B. HTTP) (RPC,
CORBA)
(z.B. JDBC)
. . .
Web-basierte Anwendungen haben eineverteilte Präsentationsschicht
die Richtung der Kontrolle geht nur ineine Richtung
4
iTec
Model
was darstellen?
Controller(Maus, Tastatur,..)
View(Window)
Model-unabhängigeFunktionalität
Änderung!
Änderung!
Applikation
MVC - Model View Controller Architektur: in GUI-Anwendungen
GUI Schicht Domänen Schichtdies ist KEIN Controller für UseCases, sondern ein GUI Event-Handling
dies ist KEIN Controller für UseCases, sondern ein GUI Event-Handling
Ziel: mache dasModell unabhängigvom GUI
Einführung Web-basierte Anwendungsarchitekturen
5
iTec
ProcessSaleHandler
...
endSale()enterItem(...)makeNewSale()makeCashPayment(...)
GUI-basierte Präsentation mit Controller-Klassen (UseCase Controller)
actionPerformed( actionEvent )
:ProcessSaleHandler
: Cashier
:SaleJFrame
presses button
1: enterItem(itemID, qty)
End sale
actionPerformed( actionEvent )
:ProcessSaleHandler
:SaleJFrame
1: endSale()
EnterPayment
actionPerformed( actionEvent )
:ProcessSaleHandler
:SaleJFrame
1: MakeCashPayment (amount)
...
... ...UseCase Controller
Einführung Web-basierte Anwendungsarchitekturen
6
iTec
Einführung Web-basierte Anwendungsarchitekturen
actionPerformed( ActionEvent )
:Register
: Cashier
:SaleJFrame
drückt Knopf
1: enterItem(itemID, qty)
1. textValueChanged( TextEvent )
:SaleJFrame
valueChanged(ListSelectionEvent)
:SaleJFrame ...
item-Id 925AE
€ 1.15
1
productSpec Erdnuss Riesenpack
price
quantity
addItem endOfSale
category GetränkeLebensmittelDrogeriewarenHaushaltswaren
Lebensmittel
gibt Text ein
wählt aus Liste
1.1: spec := find(itemId, category)
spec:ProductSpecification
GUI-Schicht
Domänen-Schicht
implementierenEventListeners
diese Art von Interaktionist in HTTP nicht möglich
1.2 productSpec
7
iTec
web browser
web server
_____.html
request URL (get, post)
response HTML(HTML-Seiten,
Applets)
_____.jsp
_____.classnur ein Servletfür alle Clients
Ausgangslage:eigentlich traurig H
TT
P
Einführung Web-basierte Anwendungsarchitekturen
nur eine Operationnur eine Operation
nur einen Datentyp (String) ohne jedeinnere Struktur (flach!)
nur einen Datentyp (String) ohne jedeinnere Struktur (flach!)
nur formatierterHypertext
nur formatierterHypertext
Objektorientierung ade?
8
iTec
Einführung Web-basierte Anwendungsarchitekturen
Web-basierte Anwendungen müssen unbedingteine gut strukturierte Server-seitige Architektur erhalten.
Die Praxis sieht leider anders aus.
Daran ist auch die Technologie schuld.
9
iTec
der Seiten-zentrierte Ansatz
Web-App = Sammlung von JSPs
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
database
request
response
JSP
+ einfach zu Beginn (wenn es nicht weiterwächst)- Code ist eine Mischung aus Präsentation, Domänenlogik,
Datenzugriffstechniken: ein Wartungsalptraum- nicht skalierbar- vieles doppelt und dreifach
Eingabenprüfen
JSP
Ausgabenauswählen
10
iTec
database
request
response
JSPJSP
+ Auslagerung einiger Teile der Anwendungslogik in Beans- zuviel Steuerlogik in den JSPs
bean
Web-App = Sammlung von JSPs + Beans
der Seiten-mit-Beans Ansatz
Eingabenprüfen
bean
DB-Mapping
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
11
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
Beispiel: Lotterie (aus Bergsten2001)
12
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
13
iTec
. . . . .<body bgcolor="white"> <jsp:useBean id="userInfo" class="com.ora.jsp.beans.userinfo.UserInfoBean" scope="request" />
<%-- Output list of values with invalid format, if any --%> <font color="red"> <jsp:getProperty name="userInfo" property="propertyStatusMsg" /> </font>
<%-- Output form with submitted valid values --%> <form action="userinfovalidate.jsp" method="post"> <table> <tr> <td>Name:</td> <td><input type="text" name="userName" value="<%= StringFormat.toHTMLString(userInfo.getUserName()) %>" > </td> </tr> . . . . .
userinfoinput.jspuserinfoinput.jsp
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
14
iTec
<%@ page language="java" %><jsp:useBean id="userInfo" scope="request" class="com.ora.jsp.beans.userinfo.UserInfoBean" > <jsp:setProperty name="userInfo" property="*" /></jsp:useBean>
<% if (userInfo.isValid()) { %>
<jsp:forward page="userinfovalid.jsp" />
<% } else { %>
<jsp:forward page="userinfoinput.jsp" />
<% } %>
userinfovalidate.jsp:reine Kontrolllogik-JSP(kein HTML)
userinfovalidate.jsp:reine Kontrolllogik-JSP(kein HTML)
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
15
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
16
iTec
<html> <head> <title>User Info Validated</title> </head> <body bgcolor="white"> <font color=green size=+3> Thanks for entering valid information! </font> </body></html>
userinfovalid.jsp:reines HTML – trotzdem gleich als JSP anlegen für zukünftige Erweiterungen
userinfovalid.jsp:reines HTML – trotzdem gleich als JSP anlegen für zukünftige Erweiterungen
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
17
iTec session scope
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
18
iTec
CatalogBean ProductBeans CartBeans
application scope session scope
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
19
iTec
modelview
controller
database
Client Web Server Data
request
State changeeventForward
event
data
response
servletservlet
JSPJSP beanbean
der Servlet-Controller Ansatz
+ MVC Trennung der Belange: JSP als reiner View+ skalierbar- etwas aufwendig bei sehr kleinen Anwendungen
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
20
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
Servlets:damit könnteman eigentlichalles machen
21
iTec
modelview
controllerrequest
State changeeventForward
event
data
response
servletservlet
JSPJSP beanbean
Event dispatcherSecurity gatewayModel preparationError handlingResponse triggeringlogging
Aufgaben des Controller Servlets
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
22
iTec
modelview
controllerrequest
State change event
Forwardevent
data
response
servletservlet
JSPJSP beanbean
business logicdata stateread/writeutilities
Aufgaben des Model Beans
database
validation, security
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
23
iTec
presentation logicread-only
modelview
controllerrequest
State change event
Forwardevent
data
response
servletservlet
JSPJSP beanbeandatabase
validation, security
Aufgaben des View JSPs
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
24
iTec
beanbeanmodel2
page2
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
page1
controller
request
Forwardevents
servletservlet
JSPJSP
<form action= “process?action=a2” method="post">
post(..)
action
(action == “a1”)
doA1(..)
JSPJSP
(action == “a2”)
doA2(..)
(action == “a3”)
doA3(..)
page3JSPJSP
response
auf “process” imweb.xml abgebildet
+doPost(..)-doA1(..)-doA2(..)-doA3(..)
model1beanbean
“url rewriting”
Alternative: “hidden fields”
“url rewriting”
Alternative: “hidden fields”
25
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
der Servlet Life Cycle
- init(): einmalig aufgerufen bei Instanzierung des Servletsinstanziiert entweder bei erstem Request auf Servlet, oder beim Starten der Servlet Engine
- service(..): (doPost, doGet) bei jedem Request des Servlets
- destroy(..): einmalig vor dem Löschen aus der VM wann das geschieht, entscheidet Servlet Engine
Merke: es gibt zu jedem Servlet nur immer höchstens ein Objekt!
26
iTec
in init(): – in die Methode direkt hineinimplementiert:
• private Attribute. Servlet-Scope: werden geteilt von allen Requests
• Attribute mit Applikations-Scope: ServletContext.set/getAttribute(..) für jede Applikation gibt es genau ein ServletContext Objekt. Also: alle Servlets und JSPs einer Applikation teilen dieses Objekt
– über web.xml Parameter: werden im <init-param>-Tag gesetzt
servlet-spezifisch: über ein ServletConfig Objekt wird aus den Parametereinträgen (<init-param>-Tag innerhalb <servlet>-Tag) in web.xml erzeugt und in init() mit getInitParameter(..) gelesen
applikationsspezifisch: über ServletContext Objekt, aus (<context-param>-Tag innerhalb <web-app>-Tag) in web.xml. oder aus ServletContext.setAttribute(..)in anderen Servlets oder JSPs erzeugt
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
Servlet Initialisierung
27
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
<servlet>
<servlet-name> pbController </servlet-name>
<servlet-class> com.ora.jsp.servlets.PBControllerServlet1 </servlet-class> <init-param> <param-name>maxNews</param-name> <param-value>100</param-value> </init-param>
</servlet>
web.xml
28
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
login.jsp
Anwendung “Project Billboard” (Bergsten2001)
29
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
main.jsp
30
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
entermsg.jsp
31
iTec
Anwendung “Project Billboard” (Bergsten2001)
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
action=“storeMsg”
action=authenticate
action=updateprofile oder =showPage&page=entermsg.jsp
action= showPage &page= . . .
32
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
public void init() throws ServletException { DataSource ds = null; try { ds = new DataSourceWrapper("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:example", null, null); } catch (Exception e) {} // Ignore all in this example EmployeeRegistryBean empReg = new EmployeeRegistryBean(); empReg.setDataSource(ds); getServletContext().setAttribute("empReg", empReg);
NewsBean news = new NewsBean(); getServletContext().setAttribute("news", news); }
die init-Methode des Controller Servlets
Zugriff auf news-Bean von anderen Servlets: NewsBeans newsBeans = (NewsBeans) getServletContext.getAttribute(“news”);
<jsp:useBean id=“news” scope=“application” class=“com.ora.jsp.beans.news.NewsBean”/>
Zugriff auf news-Bean von JSPs dieser Anwendung:
33
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String action = request.getParameter("action");
// Check if the user is authenticated if (!isAuthenticated(request) && !("authenticate".equals(action) || "logout".equals(action))) { doForwardToLogin(request, response); } else { if ("authenticate".equals(action)) { doAuthenticate(request, response); } else if ("logout".equals(action)) { doLogout(request, response); } else if ("storeMsg".equals(action)) { doStoreMsg(request, response); } else if ("updateProfile".equals(action)) { doUpdateProfile(request, response); } else if ("showPage".equals(action)) { doShowPage(request, response); } else { response.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); } } }
Controller Servlet: zentralisierte Request Bearbeitung
Controller Servlet: zentralisierte Request Bearbeitung
Besonderheit: jeder Request dieser Anwendung bedarf einer Authentifizierung
Besonderheit: jeder Request dieser Anwendung bedarf einer Authentifizierung
34
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
doPost(request, response);
}
private boolean isAuthenticated(HttpServletRequest request) { boolean isAuthenticated = false; HttpSession session = request.getSession();
if (session.getAttribute("validUser") != null) { isAuthenticated = true; } return isAuthenticated; }
35
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
private void doForwardToLogin(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String origURL = HttpUtils.getRequestURL(request).toString();
String queryString = request.getQueryString();
if (queryString != null) { origURL += "?" + queryString; }
String loginURL = "login.jsp" + "?origURL=" + URLEncoder.encode(origURL) + "&errorMsg=" + URLEncoder.encode("Please log in first");
forward(loginURL, request, response); }
der Parameter origURL dient dazu, die ursprüngliche URL des Requestszu speichern – was man natürlich auch in dem Session Objekt hättetun können
Besonderheit: der ursprüngliche, nicht authentifizierte Requestwird “gespeichert”, damitder Benutzer ihn nicht nochmals eingeben muss
Besonderheit: der ursprüngliche, nicht authentifizierte Requestwird “gespeichert”, damitder Benutzer ihn nicht nochmals eingeben muss
36
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
Request “xyz?abc=123”
Servlet
[nicht authentifiziert] doForwardToLogin
login.jspforward
origUrl=“xyz?abc=123”origUrl(hidden)
action=authenticate hidden:origURLname, password
doAuthenticate
userNameCookie, passwordCookie
origUrlredirect
Request “xyz?abc=123” [authentifiziert] doXYZ
…
Authentifizieren eines Requests
37
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
<form action="process?action=authenticate" method="post">
<% String origURL = request.getParameter("origURL"); %> <input type="hidden" name="origURL" value="<%= origURL == null ? "" : origURL %>">
Please enter your User Name and Password, and click Enter. <p> Name: <input name="userName" value="<ora:getCookieValue name="userName" />" size="10"> Password: <input type="password" name="password" value="<ora:getCookieValue name="password" />" size="10"> <input type="submit" value="Enter"> <p> Remember my name and password: <input type="checkbox" name="remember" <%= CookieUtils.isCookieSet("userName", request) ? "checked" : "" %> > <br> (This feature requires cookies to be enabled in your browser) </form>
login.jsp(Ausschnitt)
login.jsp(Ausschnitt)
38
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
private void doAuthenticate(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String userName = request.getParameter("userName");
if (userName == null) { throw new ServletException("Missing User Name"); } String password = request.getParameter("password"); if (password == null) { throw new ServletException("Missing Password"); }
try { EmployeeRegistryBean empReg = (EmployeeRegistryBean) getServletContext().getAttribute("empReg"); boolean isRegistered = empReg.authenticate(userName, password);
if (isRegistered) { EmployeeBean emp = empReg.getEmployee(userName); HttpSession session = request.getSession(); session.setAttribute("validUser", emp);
. . .
39
iTec
. . . Cookie userNameCookie = new Cookie("userName", userName); Cookie passwordCookie = new Cookie("password", password); int maxAge = MAXUSERCOOKIEAGE; if (request.getParameter("remember") == null) { maxAge = 0; } userNameCookie.setMaxAge(maxAge); passwordCookie.setMaxAge(maxAge); response.addCookie(userNameCookie); response.addCookie(passwordCookie); // Redirect to the originally requested URL or main String next = request.getParameter("origURL"); if (next == null || next.length() == 0) { next = getShowPageURL(request) + "main.jsp"; } response.sendRedirect(next); } else { String loginURL = "login.jsp" + "?errorMsg=" + URLEncoder.encode("Invalid User Name or Password"); response.sendRedirect(loginURL); }
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
Unterschied zu forward:-Umleitung geschieht Client-seitig-Aktivierung wieder über Servlet
Unterschied zu forward:-Umleitung geschieht Client-seitig-Aktivierung wieder über Servlet
40
iTec
die einzelnen Schritte eines UseCases in einer Web-Architektur sind voneinander entkoppelt: es gibt keine zentrale Steuerinstanz eines UseCases
damit kann der Client (Browser) jeden Schritt potentiell selber aktivieren, wann er will (sofern er den Request schon einmal ausgeführt hat, ihn also kennt)
eine strenge Kontrolle über den UseCase Ablauf bedarf einer besonderen Steuerlogik, die anders ist als eine GUI-Steuerlogik
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
warum reicht es nicht, “am Anfang” zu authentifizieren?
wichtige Besonderheit von Web-Anwendungen:
41
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
<head> <title>Project Billboard</title> </head> <body bgcolor="white">
<jsp:useBean id="validUser" scope="session" class="com.ora.jsp.beans.emp.EmployeeBean" />
<h1>Welcome <%= validUser.getFirstName() %></h1>. . . <form action="process?action=updateProfile" method="post">
<input type="checkbox" name="projects" value="JSP". . . <input type="checkbox" name="projects" value="Servlet“. . .
main.jsp(Ausschnitt)
main.jsp(Ausschnitt)
Informationsver-arbeitung auf Server
Informationsver-arbeitung auf Server
42
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
. . . <a href=process?action=showPage&page=entermsg.jsp>Post a new message</a> <p> <jsp:useBean id="news" scope="application" class="com.ora.jsp.beans.news.NewsBean" /> <% NewsItemBean[] newsItems = news.getNewsItems(validUser.getProjects()); pageContext.setAttribute("newsItems", newsItems); %> <table> <ora:loop name="newsItems" loopId="newsItem" className="NewsItemBean" > <tr> <td colspan="2"> Project: <jsp:getProperty name="newsItem" property="category" /> </td> . . .
main.jsp(Ausschnitt)
main.jsp(Ausschnitt)
keine Informationsver-arbeitung auf Server, reiner Seitenwechsel
keine Informationsver-arbeitung auf Server, reiner Seitenwechsel
43
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
private void doShowPage(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String url = request.getParameter("page"); if (url == null) { throw new ServletException("Missing page info"); } forward(url, request, response); }
private String getShowPageURL(HttpServletRequest request) { return request.getContextPath() + request.getServletPath() + "?action=showPage&page="; } private void forward(String url, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { RequestDispatcher rd = request.getRequestDispatcher(url); rd.forward(request, response); }
Im Unterschied zu den anderen Aktionen soll hier nur auf eine andere Seite verzweigt werden.Anstatt von einer Seite direkt auf eine andere Seite zu verweisen, wird hier immer ein Durchlauf durch das Servlet erzwungen (Authentifizierung).
Im Unterschied zu den anderen Aktionen soll hier nur auf eine andere Seite verzweigt werden.Anstatt von einer Seite direkt auf eine andere Seite zu verweisen, wird hier immer ein Durchlauf durch das Servlet erzwungen (Authentifizierung).
gibt eine absolute URL zurück, um den nächsten Request wieder über das gleiche Servlet auf die nächste Seite zu lenken. Ist besser als diese URL direkt hineinzukodieren!
gibt eine absolute URL zurück, um den nächsten Request wieder über das gleiche Servlet auf die nächste Seite zu lenken. Ist besser als diese URL direkt hineinzukodieren!
44
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
Request “action=showPage&page=xyz.jsp”
Servlet
[authentifiziert] doShowPage
xyz.jspforward
[page existiert]
anstatt
Request “xyz.jsp”xyz.jsp
45
iTec
Einführung Web-basierte Anwendungsarchitekturen
EnteringItems
enterItem
WaitingForPayment
makeNewSale
makeCashPayment
endSale
AuthorizingPayment makeCheckPayment
makeCreditPayment
authorized
Beispiel: ProcessSale
wie sind in diesem Beispiel die Zustandsübergänge der Session kodiert?
wie macht man dies bei komplexeren Sessions?
46
iTec
1. beginne mit einem Satz verlinkter, statischer HTML-Seiten als Frontend-Prototyp. Es gibt hauptsächlich zwei Hyperlink-Typen:a) Dateneingabe (HTTP Parameter) verarbeiten, Resultat
anzeigeni. data entry (neue Entität), Resultat über Erfolg, evtl. Daten-Echoii. Resultat sind Daten, die mit Dateneingabe identifiziert werden
b) verzweigen zu anderem “Menu” (nächster Arbeitsschritt)manchmal können a) und b) in einem Link zusammenfallen
2. gehe zu dynamischen Seiten (JSP) über, und bilde die Links auf Zustandsübergangslogik eines oder mehrerer Servlet-Controller ab, mit “forwards” auf die JSPs
3. definiere das Domänenmodell (Beans)
4. verbinde Servlets und JSPs mit dem Domänenmodell
zwei Ansätze zur Spezifikation einer WEB-Anwendung
A) Frontend-basiert
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
47
iTec
1. schreibe wie im Unified Process mit UML UseCases mit Arbeits-schritten, und definiere für jeden UseCase ein Controller Servlet
2. schreibe für jeden Arbeitsschritt des UseCases eine Operation des Controllers
3. definiere in einem State-Diagramm Zustandsübergänge eines Controllers (UseCase), um Arbeitsschrittsequenzen einzuschränken
4. definiere für jeden Arbeitsschritt eines UseCases das Interaktionsereignis auf einer Web-Seite (samt Eingabedaten)
5. organisiere diese Ereignisse in eine Reihe von Web-Seiten (JSPs), unter Berücksichtigung von 3
6. definiere das Domänenmodell (Beans)
7. verbinde Servlets und JSPs mit dem Domänenmodell
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
zwei Ansätze zur Spezifikation einer WEB-Anwendung
B) UseCase-basiert
48
iTec
in beiden Ansätzen: gehe nach den Normalfällen das Ganze nochmal durch für die Spezialfälle/Fehlerfälle
am besten: immer beide Ansätze durchgehen
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
zwei Ansätze zur Spezifikation einer WEB-Anwendung
A) Frontend-basiertB) UseCase-basiert
49
iTec
Problem: Jedes Servlet ist ein Controller für einen UseCase.
Dann aber sollte man innerhalb einer Session eventuell mehrere Servlets (Use Cases) laufen lassen können: parallel/verschachtelt Problem damit: Session Management für mehrere UseCases/Servlets – es gibt nur globalen Bereich pro Session, aber nicht pro Session-Servlet!
Lösungen1. verschachtelte/parallele UseCases nur über jeweils neue
Sessions. 2. verschachtelte/parallele UseCases in einem Session-Objekt,
in dem man “per Hand” Servlet-spezifische Zustände führt
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
zwei Ansätze zur Spezifikation einer WEB-Anwendung
50
iTec
Basisausnahme: ServletException wenn diese Exception nicht aufgefangen wird: unschöne Fehlermeldung im Browser
deshalb: Exception im Servlet auffangen und verzweigen (mit forward) auf spezielle Fehler JSP
wo auffangen? so spät (so ”weit oben”) wie möglich: in der service-Methode des Servlets
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
Erqweiterungen
1. Fehlerbehandlung
51
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
BaseServlet
service(request,response)
handle(exception, request,response)
HttpServlet
MyServlet
handle(exception, request,response)doPost(request,response)doGet(request,response). . .
public final void service ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { try { super.service( request, response ); } catch( Throwable aThrowable ) { handle( aThrowable, request, response ); } }
protected void handle (Throwable aThrowable, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {. RequestDispatcher dispatcher = getServletContext().getRequestDispatcher( "error.jsp" ); dispatcher.forward( request, response ); }
52
iTec
Idee: pro Aktion ein spezielles Aktionenobjekt definieren
Abbildung des Aktionsnamens (Request Parameter) auf ein Objekt entweder dynamisch mittels Class.forName während des Request Services, oder in einer Hashtable während der Initialsierung des Servlets anlegen, am besten über Servlet Initialisierungsparameter
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
Erqweiterungen
2. das Servlet unabhängig von den spezifischen Aktionen machen
53
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
beanbeanmodel2
page2page1
controller
request
Forwardevents
servletservlet
JSPJSP
<form action= "process?action=a2" method="post">
post(..)
action[action == a1]
A1
JSPJSP
[action == a2]
A2
[action == a3]
A3
page3JSPJSP
response
auf “process” imweb.xml abgebildet
+doPost(..)
model1beanbean
“url rewriting”
Alternative: “hidden fields”
“url rewriting”
Alternative: “hidden fields”
process(req,res)
process(req,res)
process(req,res)
54
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
BaseServlet
service(request,response)
handle(exception, request,response)
MyServlet
handle(exception, request,response)doPost(request,response)doGet(request,response). . .
55
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
56
iTec
Beans as
x00-x000 sehr kurzlebig
x0 kurzlebig
x0 längerlebigvon mehrerenAnwendungen geteilt
Problem: Skalierbarkeit
Lösung: untersage privateVerbindungen zwischen Clients und kostspieligenRessourcen. Benutze statt dessen Ressourcen-Pools
langlebig
Anzahl Dauer
Einführung Web-basierte Anwendungsarchitekturen
57
iTec
Beans as
Dynamic content creation and delivery
Input collection; validation?
Screen flow
State management?
Support for multiple clients
Business logic?
Einführung Web-basierte Anwendungsarchitekturen
58
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
59
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
60
iTec
die 3 Architekturtypen Web-basierte Anwendungsarchitekturen
61
iTec
1. für jeden „Go-Button“ (HTML buttons mit submit, links auf servlets) mit eigener Funktion: ein eigenes Servlet
2. ein einziges Servlet als Controller, das auf Supportklassen verzweigt, die die speziellen Funktionen ausführen (z.B. mit dem Command-Pattern)
62
iTec
BaseServlet
HttpMethodServlet
+doGet( req, res )+doPost( req, res )+handle( exception, req, res )-processRequest( req, res )-getHttpController( req, res )
{ processRequest(req, res);}
{ HttpController controller = getHttpController( req, res ); controller.process();}
«interface»HttpController+ forward(String aPage)