Einführung / Geschichte Motivation Beispiel Architektur / Komponenten Konfiguration g Fazit Open Source Framework für WebWebA Anwendungen d Kompatibel zur J2EE Plattform Teil des umfangreichen Apache Jakarta Projekts Struts:: bautechnischer Ausdruck (engl.) für Struts g Abstützungen“ g „Verstrebungen, basiert auf Standard Java APIs basiert auf Model Model--View View--Controller Controller--Pattern basiert auf JSPJSP- und ServletServlet-Technologie aktuelle Version ist Struts 1.3 13 2000: › Craig R. McCalahan x war auch h federführend f d füh d bei b i der d Entwicklung E t i kl von JavaJava-ServerServer-Faces › Entwicklung eines MVC Frameworks für Java Java-- Plattform Januar 2001: › Apache Software Foundation veröffentlicht MVC Framework: Struts Bewährte Architekturen und Entwurfsmuster können benutzt werden, anstatt sie immer wieder neu zu implementieren p Erleichterung von Standardaufgaben in Web--Anwendungen: Web › Formularbehandlung › Mehrsprachigkeit Schnellere Entwicklungszeiten Statt unschönem HTMLHTML-Code (hoffentlich) schönere JSP CustomTags Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g MVC Architektur (Model 2) › Model: M d l z.B.: B JavaBeans J JavaBeans, B , EJBs, EJB D Datenbank, t b k EIS EIS, ... › View: JSP › Controller: Teile von Struts und eigene Controller Klassen Mehrsprachigkeit JSP Taglibs g Server-- und clientseitige Eingabevalidierung möglich Server XML basierte Konfiguration für die Formularnavigation Tiles Framework zur Steuerung des Layouts Deklaratives Exception Handling Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g http request http response struts-config.xml TagLibs g Action Action Action Action ActionServlet Controller ActionForm ActionForm ActionForm JSP JSP View Struts Model Anwendung Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g Ablaufsteuerung Zentrale ControllerController-Instanz der Struts WebWebAnwendung Wird Wi d über üb ein i Konfigurationsfile K fi ti fil (struts(struts (t tconfig.xml) gesteuert Nimmt Parameter aus den Formularen entgegen und füllt damit die ActionForm Objekte Leitet die ActionForm Objekte nach erfolgreicher Validierung an die Action Objekte j weiter Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g Erlauben eine einfache Übernahme der Formulardaten in die Properties einer JavaBean Klasse Vorbelegung von Formularfeldern mit Werten aus den JavaBean Properties Jedes HTML HTML--Eingabefeld besitzt ein gleichnamiges Bean Bean-Property im ActionForm Optional können die übernommenen Eingabewerte in einer validate() validate () Methode überprüft werden Werden abgeleitet von org.apache.struts.action.ActionForm Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g Verbindung durch die Namensgleichheit des JSP Tag Attribut-Werts i und des JavaBean Property-Namens Property ActionForm AddressForm <html:form h l f action="/SaveAddress"> i / dd <tr> <td><bean:message key="address.name"/></td> <td><html:text p property="name"/></td> p y / / </tr> … <html:submit property="submit"> <bean message key="detail.save"/> <bean:message ke "detail sa e"/> </html:submit> … </html:form> addressDetails jsp addressDetails.jsp name firstName validate() Verbindung zwischen der Aktion SaveAddress und d Klasse der Kl Add AddressForm F laut struts-config.xml Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g Neben der validate validate() () Methode in der ActionForm Klasse kann die Validierung auch deklarativ über eine XML Datei erfolgen. › Dazu beinhaltet Struts eine Reihe von StandardStandard- Validatoren (z.B. für Beträge, Zahlen, e e--mail Adresse, ...)) und stellt dazu StandardStandard-Fehlermeldungen bereit. bereit › Einer dieser Validatoren ("mask ("mask") ") kann über Regular Expressions parametrisiert werden. Damit lassen sich die meisten Einzelfeldprüfungen realisieren. Mit einem Eingabefeld g können mehrere Validatoren verknüpft werden. Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g public class AddressForm extends ActionForm { private String name; Implementierung der validate() private String firstName; Methode ist optional ... ... Getter und Setter Methoden ... public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); if ((name == null) || (name.equals(""))) { errors.add("name", new ActionMessage("detail.error.name.required")); } return errors; } } AddressForm.java Ein leeres errors Object steht für eine erfolgreiche Validierung Textschlüssel Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g ... <BODY> <html:errors/> <html:form.... <html:form AddressDetails.jsp Das <html:errors> Tag benötigt diese beiden Textschlüssel errors.header = Eingabefehler errors.footer = <hr> Mit diesem Tag werden alle Fehlermeldungen im ActionErrors Object ausgegeben MessageResource.properties detail.error.name.required=Bitte geben Sie einen Namen ein ! detail.error.email.noat=eMail - Address enthält kein @ ! Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g Erweiterung der Funktionalität durch Tag Tag--Bibliotheken <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib t lib uri="/WEB-INF/struts-html.tld" i "/WEB INF/ t t ht l tld" prefix="html" fi "ht l" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> Bean-Tags Bean› Zugriff g auf Beans und deren Properties p ((get (g get//set g set)) › <jsp:useBean id id=„ =„mybean mybean“ “ class class=„ =„myBean myBean“/> “/> HTML-Tags HTML› Form Tags (z.B. <html:form <html:form>, >, < <html:text html:text>) >) › Tag Attribute für JavaScript (z.B. Event Handling) › Mehrsprachigkeit Logic-Tags Logic› Bedingte Textausgabe › Iteration über ObjektObjekt-Collections (< (<logic:iterate logic:iterate>) >) › Anwendungsfluss Anwendungsfluss--Management › Existenzprüfung (<logic:present (<logic:present>) >) JSTL JSP Standard Tag Library › Iterationen, Kontrolle, Import via ftp oder http, XML, Datenbanken … Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g Sind Teil des Contollers und stellen die Verbindung zum Model her Werden abgeleitet von org.apache.struts.action.Action g p Bearbeiten den Request bzw. die Daten aus dem ActionForm Objekt Erzeugen eine i Ausgabe über den Response oder leiten zu einer Ausgabeseite weiter müssen ThreadThread-Safe sein, sein da das Struts Framework nur eine Instanz pro Klasse hält Das g gewünschte Verhalten wird durch Überschreiben der execute execute() () Methode implementiert „Business Business Logik“ Zeile public ActionForward execute(ActionMappin, ActionForm, HttpServletRequest, HttpServletResponse) { … // Zugriff auf Session und Adress-Liste ablegen HttpSession session = httpServletRequest.getSession(); List<Address> addressList = (List<Address>)session.getAttribute("list"); … // Umleiten auf entsprechende JSP-Seite // ( (in struts-config.xml g konfiguriert) g ) return actionMapping.findForward("continue"); } AddressAction.java Mapping Namen für die Folgeseite Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g Identifikation der Elemente einer Struts Anwendung erfolgt über logische Namen (Mapping) › Zuordnung logischer Namen zu Java Server Page, Servlet, Servlet, Klasse › Start der Anwendung: Einlesen erzeugt Mapping--Tabelle Mapping Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g ... <servlet> <servlet-name>action</servlet-name> <servlet-class> org.apache.struts.action.ActionServlet h t t ti ti S l t </servlet-class> <init-param> <param name>config</param name> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> </servlet> Struts Konfigurationsdatei <servlet-mapping> <servlet-name>action</servlet-name> <servlet name>action</servlet name> <url-pattern>*.do</url-pattern> </servlet-mapping> ... web.xml b l Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g <struts-config> Zuordnung von Formularnamen zu ActionForm Klassen (diese Namen werden im Actionpp g benötigt) g) Mapping <form-beans> <form-bean name="addressForm" type="adressbook.AddressForm"/> </f </form-beans> b > Anwendungs-globales Mapping von Namen auf Seiten <global-forwards> <forward name="initList" path="/List.do"/> path="/List do"/> </global-forwards> <action-mappings> ... (siehe nächste Folie) </action-mappings> </struts-config> Konfiguration einer Aktion struts-config.xml Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g Mapping Name laut web.xml b l URL URL-Mapping M i Klassenname der A ti Action-Subklasse S bkl Name der vorher d fi i t definierten A ActionForm ti F <action-mappings> <action path="/SaveAddress" type="adressbook.AddressAction" name addressForm name="addressForm" input="/addressDetail.jsp" scope="request" validate="true"> <forward name="continue" path="/List.do" /> p </action> </action-mappings> struts-config.xml In der Action Klasse lokal gültige Namen für Weiterleitungen validate() in der ActionForm aufrufen Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g <message-resources parameter="MessageResource"/> struts-config.xml g Name (Präfix) der Property-Files mit den Text-Ressourcen Textschlüssel für die Struts-Tags list.title=Willkommen im Addressbuch MessageResource_de.properties ... <bean:message key="list.title"/> ... AddressDetails.jsp Struts Übersicht Das Action Servlet Die Action Form Klassen Die Action Klassen Die Struts Konfiguration g header.jsp <tiles:insert> <tiles:insert> <tiles:insert> layout.jsp <definition name="templateDefinition“ name templateDefinition path="/layout.jsp"> <put name="title“ value="This is the title." /> <put p name="header“ value="header.jsp" /> <put name="body“ value="body.jsp" /> <put name=“footer“ value=“footer.jsp" /> </definition> struts-config.xml body.jsp footer jsp footer.jsp Vorteile: › Komplexe Webanwendung wird in kleine Komponenten aufgeteilt ((Bottom Bottom Up)) Up › Anwendung leicht erweiterbar und Komponenten durch Trennung wiederverwendbar › Für grosse Anwendungen geeignet x Bei Wachstum der Anwendung bleiben Überblick und Variabilität erhalten Nachteile: › Aufteilung der Anwendung in Komponenten Æ hohe Komplexität › Noch in Weiterentwicklung und Veränderung Æ Änderungen im Code möglicherweise nötig › Das Erstellen der Konfigurationsdatei ist sehr fehlerträchtig Æ die XML Attributnamen sind oft wenig intuitiv › Action--Klasse muss ThreadAction Thread-Safe sein (j (jeweils nur eine Instanz)) › Einführung von Struts erfordert Refactoring der Applikation Struts Home http://jakarta.apache.org/struts/ Wikipedia http://de.wikipedia.org/wiki/Struts p // p g/ / Buch JavaJava-EE 5 Addi -Wesley AddionAddion W l ISBN: 33-82738273-2362 2362--2