Modell 2 und JSF JSP und Modell 1 MVC und Modell 2 Java Web Frameworks und Struts Java Server Faces
JSP ein mächtiges Werkzeug! Client JSP Bean Fachlogik JSP Eine JSP empfängt Benutzer-Anfragen, "Requests" erstellt und benutzt Beans, die die Fachlogik aufrufen erzeugt und sendet eine Response oder verzweigt für die Response zu einer anderen JSP Im Prinzip ist damit alles machbar! (c) schmiedecke 07 SE2-11-Anforderungsmanagement 2
JSP Details (Review) Instanziierung und Benutzung von Beans <jsp:usebean>-direktive das angegebene Bean wird gesucht oder instanziiert Problem: verteilte Erzeugung und Verwaltung von Beans Kontexte Kontexte bestimmen die Lebensdauer der Beans Kontexte gemeinsam von allen JSP-s nutzbar application session request page Navigation einfache HTML-Links <jsp:forward> <jsp:redirect> (c) schmiedecke 07 SE2-11-Anforderungsmanagement 3
Modell 1 JSP Bean JSP Client JSP Bean Fachlogik JSP Bean JSP Jede JSP reagiert selbständig auf Benutzeranfragen erstellt und benutzt Beans, die die Fachlogik aufrufen verzweigt ggf. für die Response zu einer anderen JSP (c) schmiedecke 07 SE2-11-Anforderungsmanagement 4
Probleme mit Modell 1 Jede JSP-Seite reagiert selbständig auf Anfragen Verteilte Kontrolle Verteilte Navigation Harte "Verdrahtung" der Anbindung an das "Backend" unübersichtlich uneinheitlich schlecht zu ändern Abhilfe Rückbesinnung auf MVC (c) schmiedecke 07 SE2-11-Anforderungsmanagement 5
MVC - klassisch Model (auch Domain Model oder Fachlogisches Modell) enthält und verwaltet die persistenten Daten und die Fachoperationen darauf View liest die erforderlichen Daten aus dem Model, bereitet sie auf und präsentiert sie. View registriert sich beim Model, um Veränderungen zu erfahren Controller nimmt die Nutzeranfragen entgegen und leitet sie an die zuständigen Stellen weiter. (c) schmiedecke 07 SE2-11-Anforderungsmanagement 6
MVC 2 oder Modell 2 Client JSP Front Controller Servlet Bean Bean Bean Front Controller empfängt alle Requests instanziiert und füllt Beans leitet an die passende Antwort-JSP weiter. JSP JSP JSP liest Beans erzeugt und sendet Response (c) schmiedecke 07 SE2-11-Anforderungsmanagement 7
Front Controller Servlet - Details Attribut-Definition und Benutzung aus einem Servlet Im FacesServlet für Beans benutzt // Save and get a request-scoped value req.setattribute("com.mycompany.req-param", "req-value"); Object value = req.getattribute("com.mycompany.req-param"); // Save and get a session-scoped value HttpSession session = req.getsession(false); if (session!= null) { session.setattribute("com.mycompany.session-param", "session-value"); value = session.getattribute("com.mycompany.session-param"); } // Save and get an application-scoped value getservletcontext().setattribute("com.mycompany.app-param", "app-value"); value = getservletcontext().getattribute("com.mycompany.app-param"); (c) schmiedecke 07 SE2-11-Anforderungsmanagement 8
Front Controller Servlet - Details Forwarding aus einem Servlet: RequestDispatcher rdispatcher = null; rdispatcher = request.getrequestdispatcher("index.jsp"); request.setattribute("error", "test"); try { rdispatcher.forward(request, response); } catch (Exception e) { System.out.println("exception..."); } Redirect analog (c) schmiedecke 07 SE2-11-Anforderungsmanagement 9
Skalierbarkeit von Modell 2 Modell 2 macht Web-Anwendungen beliebiger Größe prinzipiell beherrschbar: klare Trennung zwischen Darstellung und Kontrolle alle Komponenten separat entwickelbar beliebig komplexes Modell anschließbar zentralisierte Ablaufsteuerung Aufgabenteilung zwischen Designern und Programmierern (c) schmiedecke 07 SE2-11-Anforderungsmanagement 10
...dennoch harte Arbeit Front-Controller-Servlet sieht immer ähnlich aus, muss aber jedesmal neu geschrieben werden. Alle Navigationen sind "hart verdrahtet", d.h. die URL steht im Code. Die Zuordnung von Bean-Attributen zu GUI- Komponenten muss einzeln ausprogrammiert werden. Die Zuordnung von Aktionen zu GUI-Ereignissen muss über die Request-Parameter ausprogrammiert werden. Textvarianten und Internationalisierung müssen von Programmieren ist weniger Hand gelöst werden. schlimm als Ändern (c) schmiedecke 07 SE2-11-Anforderungsmanagement 11
Die Antwort heißt Web Application Frameworks Definieren Objekttypen und ihre Zusammenarbeit: immer MVC Bieten (erweiter- oder konfigurierbare) Standardobjekte Ersetzen harte Verdrahtung der Seitennavigation durch Konfiguration Unterstützen die Zuordnung von Beans Unterstützen den Aufbau von GUIs deutlich verbesserte Wiederverwendbarkeit der Komponenten. (c) schmiedecke 07 SE2-11-Anforderungsmanagement 12
Java Web-Frameworks: Apache Struts Java Server Faces Echo Tapestry GWT... (c) schmiedecke 07 SE2-11-Anforderungsmanagement 13
Was leisten Web-Frameworks? Client Controller Action Model FlowManager ViewTemplate 1 : POST() 2 : createaction() 3 : perform() 4 : buisinessmethod() 5 : nextview() 6 : lookup() 7 : forward() (c) schmiedecke 07 SE2-11-Anforderungsmanagement 14
Was leisten Web-Frameworks? Abstrakte Klasse XMLkonfiguriert Bean- Verwaltung XMLkonfiguriert Standard Tags / UI-Komponenten Client Controller Action Model FlowManager ViewTemplate 1 : POST() 2 : createaction() 3 : perform() 4 : buisinessmethod() 5 : nextview() 6 : lookup() 7 : forward() (c) schmiedecke 07 SE2-11-Anforderungsmanagement 15
Kurzer Blick auf Apache Struts Struts - "Mutter aller Web Frameworks" Use Data ActionServlet findet oder erzeugt passendes ActionForm-Objekt und füllt es mit Request-Daten ruft passendes Action-Objekt Action-Objekt ruft Fachlogik nutzt und ändert Daten in ActionForm-Objekt erzeugt ActionForward-String ActionServlet selektiert JSP aufgrund des ActionForward-Strings verzweigt dorthin Quelle: jsptutorial.org JSP/Servlet nutzt ActionForm-Daten erzeugt und sendet Response (c) schmiedecke 07 SE2-11-Anforderungsmanagement 16
Struts - Konzepte ActionForm und Action sind abstrakte Klassen, die der Benutzer erweitert. Das ActionServlet ist fertig es wird durch eine xml-datei konfiguriert: stuts-config.xml enthält insbesondere auch die Navigation in Abhängigkeit von ActionForward-Strings Für die Gestaltung der Oberfläche und die Interaktion gibt es eine komfortable "Tag-Library" Details dazu hoffentlich in einem Fachvortrag! (c) schmiedecke 07 SE2-11-Anforderungsmanagement 17
Java Server Faces - JSF Java Server Faces gilt als Nachfolge-Technologie zu Struts "Vater" ist der Struts-Designer J.McCallahan JSF-Ziele Web-Frontendgestaltung mit Fertigkomponenten erweiterbare Komponentenbibliotheken client- und serverseitige Validierung Visuelle Gestaltung "Zusammenklicken" der Oberflächen visuelle Navigations-Konfiguration Swing-ähnliche Programmierung Ajax-Funktionalität "Eingebaute" Accessability-Unterstüzung Spezifikation es gibt verschiedene Implementierungen (c) schmiedecke 07 SE2-11-Anforderungsmanagement 18
JSF - Features Visuell konfigurierbare GUI-Komponenten mit Listenern (Ajax) verschiedene Technologien möglich (nicht nur JSP) Konfigurierbare Backing Beans mit Abhängigkeiten Data Binding statt explizitem Speichern und Lesen von Daten Validation Konfigurierbare Seitennavigation Internationalisierungs- und Zugänglichkeits-Unterstützung (c) schmiedecke 07 SE2-11-Anforderungsmanagement 19
JSF-Entwicklungsprozess 1. Entwickle ein (Interaktions-)Datenmodell aus Beans 2. Entwirf die GUIs und binde die Datenfelder an das Datenmodell 3. Entwirf die Seitennavigation abhängig von Ergebnissen 4. Führe die "Verdrahtung" im web.xml und facesconfig.xml durch (c) schmiedecke 07 SE2-11-Anforderungsmanagement 20
Backing Beans und Data Binding class MailBean { String mailprovider; String mailaddress; AddressBean ref; JSP } class AddressBean { String surname; String Address; }... File register.jsp <f:view> <h:form> <b>please provide your name</b><br/> <h:outputtext value="name*"/></td> <h:inputtext id="name" required="true" value="#{address.surname}" size="20"> <f:validatelength minimum="2" maximum="12"/> </h:inputtext> <h:message for="name" style="color: red;"/> <p>... </f:view> (c) schmiedecke 07 SE2-11-Anforderungsmanagement 21
Welche Beans werden "gemanaged"? Alle, die in faces-config.xml aufgelistet werden: <managed-bean> <managed-bean-name>address</managed-bean-name> <managed-bean-class> firstform.addressbean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <managed-bean> <managed-bean-name>mail</managed-bean-name> <managed-bean-class> firstform.mailbean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>ref</property-name> <value>address</value> </managed-property> </managed-bean> class MailBean { String mailprovider; String mailaddress; AddressBean ref; } class AddressBean { String surname; String Address; } (c) schmiedecke 07 SE2-11-Anforderungsmanagement 22
JSF- Statische Seitennavigation register.jsp enthält: <h:commandbutton id="submit" action="submitted" value="submit" /> faces-config.xml enthält: <navigation-rule> <from-view-id>/register.jsp</from-view-id> <navigation-case> <from-outcome>submitted</from-outcome> <to-view-id>/welcome.jsp</to-view-id> </navigation-case> </navigation-rule> (c) schmiedecke 07 SE2-11-Anforderungsmanagement 23
JSF - Dynamische Navigation register.jsp enthält: <h:commandbutton id="submit" action="#{mailbean.checkmailaddress}" value="submit" /> faces-config.xml enthält: <navigation-rule> <from-view-id>/register.jsp</from-view-id> <navigation-case> <from-action>#{mailbean.checkmailaddress}</from-action> <from-outcome>valid</from-outcome> <to-view-id>/welcome.jsp</to-view-id> </navigation-case> class MailBean { String mailprovider; String mailaddress; AddressBean ref; String checkmailaddress(); } <navigation-case> <from-action>#{mailbean.checkmailaddress}</from-action> <from-outcome>invalid</from-outcome> <to-view-id>/invalidmail.jsp</to-view-id> </navigation-case> </navigation-rule> (c) schmiedecke 07 SE2-11-Anforderungsmanagement 24
Anschluss der Fachlogik: Methodenaufruf in BackingBeans Als Action einer Command-Komponente, z.b. Button Aufruf einer parameterlosen Methode mit String-Ergebnis Auswertung ergibt das "outcome"-argument <h:commandbutton id="submit" action="#{mailbean.checkmailaddress}" value="submit" /> Aufruf aus einer Getter- oder Setter-Methode heraus: alle Bean-Zugriffe laufen über Getter und Setter von hier aus kann sogar ein Datenbank-Zugriff programmiert werden... Über Komponenten-Listener (c) schmiedecke 07 SE2-11-Anforderungsmanagement 25
"Verdrahtung" - Konfiguration Deployment-Deskriptor web.xml Spezifikation des FacesServlet in web.xml url-mapping: Alle anfragen an das Wurzelverzeichnis werden an das FacesServlet weiter gegeben: JSF-Deskriptor faces-config.xml Liste der Managed Beans Liste der Navigationsregeln gehört ins WEB-INF Verzeichnis ("neben" web.xml) JSF-Bibliotheken einbinden gehören ins WEB-INF Verzeichnis, Unterverzeichnis lib (c) schmiedecke 07 SE2-11-Anforderungsmanagement 26
Faces Servlet in web.xml spezifizieren Faces-Servlet als zentralen Einstiegspunkt definieren <!-- Faces Servlet --> <servlet> <servlet-name>faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.facesservlet</servlet-class> <load-on-startup> 1 </load-on-startup> </servlet> <!-- Faces Servlet Mapping --> <servlet-mapping> <servlet-name>faces Servlet</servlet-name> <url-pattern>myapp/*</url-pattern> </servlet-mapping> (c) schmiedecke 07 SE2-11-Anforderungsmanagement 27
JSF- Bibliotheken jsf-api.jar jsp-impl.jar jstl.jar standard.jar commons-beanutils.jar commons-digester.jar commons-collections.jar commons-logging.jar (c) schmiedecke 07 SE2-11-Anforderungsmanagement 28
Modell 2 mit JSF Client Fertigteil von JSF Faces Servlet Bean Bean FacesServlet empfängt alle Requests füllt Beans leitet an die passende Antwort-JSP weiter. JSP JSP Bean FacesContext instanziiert die Beans JSP xml-konfiguriert statt "hart verdrahtet" JSP liest Beans erzeugt und sendet Response (c) schmiedecke 07 SE2-11-Anforderungsmanagement 29
Und der Clou: Visuelle GUI-Gestaltung und Ajax-Funktionalität (c) schmiedecke 07 SE2-11-Anforderungsmanagement 30
... und Visuelle Navigations-Programmierung (c) schmiedecke 07 SE2-11-Anforderungsmanagement 31
Web-Programmierung kann ja so einfach sein... oder?