Einführung / GeschichteEinführung / Geschichte MotivationMotivation BeispielBeispiel Architektur / KomponentenArchitektur / Komponenten KonfigurationKonfiguration FazitFazit
Open Source Framework für Web-Open Source Framework für Web-AnwendungenAnwendungen
Kompatibel zur J2EE PlattformKompatibel zur J2EE Plattform Teil des umfangreichen Apache Jakarta Teil des umfangreichen Apache Jakarta
ProjektsProjekts Struts: bautechnischer Ausdruck (engl.) Struts: bautechnischer Ausdruck (engl.)
für „Verstrebungen, Abstützungen“für „Verstrebungen, Abstützungen“ basiert auf Standard Java APIsbasiert auf Standard Java APIs basiert auf Model-View-Controller-Patternbasiert auf Model-View-Controller-Pattern basiert auf JSP- und Servlet-Technologiebasiert auf JSP- und Servlet-Technologie aktuelle Version ist Struts 1.3aktuelle Version ist Struts 1.3
2000:2000:› Craig R. McCalahanCraig R. McCalahan
war auch federführend bei der Entwicklung war auch federführend bei der Entwicklung von Java-Server-Facesvon Java-Server-Faces
› Entwicklung eines MVC Frameworks für Entwicklung eines MVC Frameworks für Java-PlattformJava-Plattform
Januar 2001:Januar 2001:› Apache Software Foundation veröffentlicht Apache Software Foundation veröffentlicht
MVC Framework: StrutsMVC Framework: Struts
Bewährte Architekturen und Bewährte Architekturen und Entwurfsmuster können benutzt werden, Entwurfsmuster können benutzt werden, anstatt sie immer wieder neu zu anstatt sie immer wieder neu zu implementierenimplementieren
Erleichterung von Standardaufgaben in Erleichterung von Standardaufgaben in Web-Anwendungen:Web-Anwendungen:› FormularbehandlungFormularbehandlung› MehrsprachigkeitMehrsprachigkeit
Schnellere EntwicklungszeitenSchnellere Entwicklungszeiten Statt unschönem HTML-Code (hoffentlich) Statt unschönem HTML-Code (hoffentlich)
schönere JSP CustomTagsschönere JSP CustomTags
Struts Übersicht
Das Action Servlet
Die Action Form Klassen
Die Action Klassen
Die Struts Konfiguration
MVC Architektur (Model 2)MVC Architektur (Model 2)› Model: z.B.: JavaBeans, EJBs, Datenbank, EIS, ...Model: z.B.: JavaBeans, EJBs, Datenbank, EIS, ...› View: JSPView: JSP› Controller: Teile von Struts und eigene Controller Controller: Teile von Struts und eigene Controller
KlassenKlassen MehrsprachigkeitMehrsprachigkeit JSP TaglibsJSP Taglibs Server- und clientseitige Eingabevalidierung Server- und clientseitige Eingabevalidierung
möglichmöglich XML basierte Konfiguration für die XML basierte Konfiguration für die
FormularnavigationFormularnavigation Tiles Framework zur Steuerung des LayoutsTiles Framework zur Steuerung des Layouts Deklaratives Exception HandlingDeklaratives Exception Handling
ActionServletActionServlet
ActionFormActionForm
ActionActionJSPJSP
TagLibsTagLibs
struts-config.xmlstruts-config.xml
ActionActionActionAction
ActionAction
ActionFormActionFormActionFormActionForm
JSPJSP
Controller View
Model
Struts
Anwendung
Struts Übersicht
Das Action Servlet
Die Action Form Klassen
Die Action Klassen
Die Struts Konfiguration
httpresponse
httpresponse
httprequesthttprequest
Das Action Servlet
Struts Übersicht
Die Action Form Klassen
Die Action Klassen
Die Struts Konfiguration
AblaufsteuerungAblaufsteuerung Zentrale Controller-Instanz der Struts Web-Zentrale Controller-Instanz der Struts Web-
AnwendungAnwendung Wird über ein Konfigurationsfile (struts-Wird über ein Konfigurationsfile (struts-
config.xml) gesteuertconfig.xml) gesteuert
Nimmt Parameter aus den Formularen Nimmt Parameter aus den Formularen entgegen und füllt damit die entgegen und füllt damit die ActionFormActionForm ObjekteObjekte
Leitet die Leitet die ActionFormActionForm Objekte nach Objekte nach erfolgreicher Validierung an die erfolgreicher Validierung an die ActionAction Objekte weiterObjekte weiter
Die Action Form Klassen
Struts Übersicht
Das Action Servlet
Die Action Klassen
Die Struts Konfiguration
Erlauben eine einfache Übernahme der Formulardaten in Erlauben eine einfache Übernahme der Formulardaten in die Properties einer JavaBean Klassedie Properties einer JavaBean Klasse
Vorbelegung von Formularfeldern mit Werten aus den Vorbelegung von Formularfeldern mit Werten aus den JavaBean PropertiesJavaBean Properties
Jedes HTML-Eingabefeld besitzt ein gleichnamiges Bean-Jedes HTML-Eingabefeld besitzt ein gleichnamiges Bean-Property im ActionFormProperty im ActionForm
Optional können die übernommenen Eingabewerte in einer Optional können die übernommenen Eingabewerte in einer validate()validate() Methode überprüft werden Methode überprüft werden
Werden abgeleitet von Werden abgeleitet von org.apache.struts.action.ActionFormorg.apache.struts.action.ActionForm
<html:form action="/SaveAddress"> <tr> <td><bean:message key="address.name"/></td> <td><html:text property="name"/></td> </tr> … <html:submit property="submit"> <bean:message key="detail.save"/> </html:submit> …</html:form>
AddressFormAddressForm
namefirstNamenamefirstName
validate()validate()
addressDetails.jsp
ActionFormActionForm
Die Action Form Klassen
Struts Übersicht
Das Action Servlet
Die Action Klassen
Die Struts Konfiguration
Verbindung zwischen der Aktion SaveAddress und der Klasse AddressForm laut struts-config.xml
Verbindung durch die Namensgleichheit des JSP Tag Attribut-Werts und des JavaBean Property-Namens
Neben der Neben der validate()validate() Methode in der Methode in der ActionFormActionForm Klasse kann die Validierung auch Klasse kann die Validierung auch deklarativ über eine XML Datei erfolgen.deklarativ über eine XML Datei erfolgen.› Dazu beinhaltet Struts eine Reihe von Standard-Dazu beinhaltet Struts eine Reihe von Standard-
Validatoren (z.B. für Beträge, Zahlen, e-mail Validatoren (z.B. für Beträge, Zahlen, e-mail Adresse, ...) und stellt dazu Standard-Adresse, ...) und stellt dazu Standard-Fehlermeldungen bereit.Fehlermeldungen bereit.
› Einer dieser Validatoren ("mask") kann über Einer dieser Validatoren ("mask") kann über Regular Expressions parametrisiert werden. Damit Regular Expressions parametrisiert werden. Damit lassen sich die meisten Einzelfeldprüfungen lassen sich die meisten Einzelfeldprüfungen realisieren.realisieren.
Mit einem Eingabefeld können mehrere Mit einem Eingabefeld können mehrere Validatoren verknüpft werden.Validatoren verknüpft werden.
Die Action Form Klassen
Struts Übersicht
Das Action Servlet
Die Action Klassen
Die Struts Konfiguration
public class AddressForm extends ActionForm{ private String name; private String firstName; ... ... 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; }}
public class AddressForm extends ActionForm{ private String name; private String firstName; ... ... 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; }}
TextschlüsselTextschlüsselEin leeres errors Object steht für eine erfolgreiche ValidierungEin leeres errors Object steht für eine erfolgreiche Validierung
AddressForm.java
Die Action Form Klassen
Struts Übersicht
Das Action Servlet
Die Action Klassen
Die Struts Konfiguration
Implementierung der validate() Methode ist optionalImplementierung der validate() Methode ist optional
...<BODY>
<html:errors/>
<html:form....
...<BODY>
<html:errors/>
<html:form....
Das <html:errors> Tag benötigt diese beiden Textschlüssel
Das <html:errors> Tag benötigt diese beiden Textschlüssel
Mit diesem Tag werden alle Fehlermeldungen im ActionErrors Object ausgegeben
Mit diesem Tag werden alle Fehlermeldungen im ActionErrors Object ausgegeben
errors.header = Eingabefehlererrors.footer = <hr>
detail.error.name.required=Bitte geben Sie einen Namen ein !detail.error.email.noat=eMail - Address enthält kein @ !
errors.header = Eingabefehlererrors.footer = <hr>
detail.error.name.required=Bitte geben Sie einen Namen ein !detail.error.email.noat=eMail - Address enthält kein @ !
MessageResource.properties
AddressDetails.jsp
Die Action Form Klassen
Struts Übersicht
Das Action Servlet
Die Action Klassen
Die Struts Konfiguration
Erweiterung der Funktionalität durch Tag-BibliothekenErweiterung der Funktionalität durch Tag-Bibliotheken
Bean-TagsBean-Tags› Zugriff auf Beans und deren Properties (get/set)Zugriff auf Beans und deren Properties (get/set)› <jsp:useBean id=„mybean“ class=„myBean“/><jsp:useBean id=„mybean“ class=„myBean“/>
HTML-TagsHTML-Tags› Form Tags (z.B. <html:form>, <html:text>)Form Tags (z.B. <html:form>, <html:text>)› Tag Attribute für JavaScript (z.B. Event Handling)Tag Attribute für JavaScript (z.B. Event Handling)› MehrsprachigkeitMehrsprachigkeit
Logic-TagsLogic-Tags› Bedingte TextausgabeBedingte Textausgabe› Iteration über Objekt-Collections (<logic:iterate>)Iteration über Objekt-Collections (<logic:iterate>)› Anwendungsfluss-ManagementAnwendungsfluss-Management› Existenzprüfung (<logic:present>)Existenzprüfung (<logic:present>)
JSTL JSP Standard Tag LibraryJSTL JSP Standard Tag Library› Iterationen, Kontrolle, Import via ftp oder http, XML, Datenbanken …Iterationen, Kontrolle, Import via ftp oder http, XML, Datenbanken …
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %><%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
Die Action Form Klassen
Struts Übersicht
Das Action Servlet
Die Action Klassen
Die Struts Konfiguration
Die Action Klassen
Struts Übersicht
Das Action Servlet
Die Action Form Klassen
Die Struts Konfiguration
Sind Teil des Contollers und stellen die Verbindung Sind Teil des Contollers und stellen die Verbindung zum Model herzum Model her
Werden abgeleitet von Werden abgeleitet von org.apache.struts.action.Actionorg.apache.struts.action.Action
Bearbeiten den Request bzw. die Daten aus dem Bearbeiten den Request bzw. die Daten aus dem ActionForm ObjektActionForm Objekt
Erzeugen eine Ausgabe über den Response oder Erzeugen eine Ausgabe über den Response oder leiten zu einer Ausgabeseite weiterleiten zu einer Ausgabeseite weiter
müssen Thread-Safe sein, da das Struts Framework müssen Thread-Safe sein, da das Struts Framework nur eine Instanz pro Klasse hältnur eine Instanz pro Klasse hält
Das gewünschte Verhalten wird durch Das gewünschte Verhalten wird durch Überschreiben der Überschreiben der execute()execute() Methode Methode implementiertimplementiert
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 konfiguriert) return actionMapping.findForward("continue");}
„Business Logik“ Zeile„Business Logik“ Zeile
AddressAction.java
Mapping Namen für die FolgeseiteMapping Namen für die Folgeseite
Die Struts Konfiguration
Struts Übersicht
Das Action Servlet
Die Action Form Klassen
Die Action Klassen
Identifikation der Elemente einer Struts Identifikation der Elemente einer Struts Anwendung erfolgt über logische Anwendung erfolgt über logische Namen (Mapping)Namen (Mapping)› Zuordnung logischer Namen zu Java Server Zuordnung logischer Namen zu Java Server
Page, Servlet, KlassePage, Servlet, Klasse› Start der Anwendung: Einlesen erzeugt Start der Anwendung: Einlesen erzeugt
Mapping-TabelleMapping-Tabelle
...<servlet> <servlet-name>action</servlet-name> <servlet-class> org.apache.struts.action.ActionServlet </servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param></servlet>
<servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern></servlet-mapping>...
...<servlet> <servlet-name>action</servlet-name> <servlet-class> org.apache.struts.action.ActionServlet </servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param></servlet>
<servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern></servlet-mapping>... web.xml
Struts Konfigurationsdatei
Die Struts Konfiguration
Struts Übersicht
Das Action Servlet
Die Action Form Klassen
Die Action Klassen
<struts-config>
<form-beans> <form-bean name="addressForm" type="adressbook.AddressForm"/> </form-beans>
<global-forwards> <forward name="initList" path="/List.do"/> </global-forwards>
<action-mappings> ... (siehe nächste Folie) </action-mappings>
</struts-config>
<struts-config>
<form-beans> <form-bean name="addressForm" type="adressbook.AddressForm"/> </form-beans>
<global-forwards> <forward name="initList" path="/List.do"/> </global-forwards>
<action-mappings> ... (siehe nächste Folie) </action-mappings>
</struts-config>
Anwendungs-globales Mapping von Namen auf SeitenAnwendungs-globales Mapping von Namen auf Seiten
Zuordnung von Formularnamen zu ActionForm Klassen (diese Namen werden im Action-Mapping benötigt)
Zuordnung von Formularnamen zu ActionForm Klassen (diese Namen werden im Action-Mapping benötigt)
Konfiguration einer AktionKonfiguration einer Aktion
struts-config.xml
Die Struts Konfiguration
Struts Übersicht
Das Action Servlet
Die Action Form Klassen
Die Action Klassen
<action-mappings> <action path="/SaveAddress" type="adressbook.AddressAction" name="addressForm" input="/addressDetail.jsp" scope="request" validate="true">
<forward name="continue" path="/List.do" /> </action></action-mappings>
<action-mappings> <action path="/SaveAddress" type="adressbook.AddressAction" name="addressForm" input="/addressDetail.jsp" scope="request" validate="true">
<forward name="continue" path="/List.do" /> </action></action-mappings> struts-config.xml
Die Struts Konfiguration
Struts Übersicht
Das Action Servlet
Die Action Form Klassen
Die Action Klassen
Mapping Name laut web.xml URL-MappingMapping Name laut web.xml URL-Mapping
Klassenname der Action-SubklasseKlassenname der Action-Subklasse
Name der vorher definierten ActionFormName der vorher definierten ActionForm
In der Action Klasse lokal gültige Namen für Weiterleitungen
In der Action Klasse lokal gültige Namen für Weiterleitungen
validate() in der ActionForm aufrufen
validate() in der ActionForm aufrufen
list.title=Willkommen im Addressbuchlist.title=Willkommen im Addressbuch
MessageResource_de.properties
...<bean:message key="list.title"/>...
...<bean:message key="list.title"/>... AddressDetails.jsp
Textschlüssel für die Struts-TagsTextschlüssel für die Struts-Tags
<message-resources parameter="MessageResource"/> <message-resources parameter="MessageResource"/>
struts-config.xml
Die Struts Konfiguration
Struts Übersicht
Das Action Servlet
Die Action Form Klassen
Die Action Klassen
Name (Präfix) der Property-Files mit den Text-Ressourcen
Name (Präfix) der Property-Files mit den Text-Ressourcen
Die Struts Konfiguration
Struts Übersicht
Das Action Servlet
Die Action Form Klassen
Die Action Klassen
<tiles:insert><tiles:insert><tiles:insert>
<tiles:insert><tiles:insert><tiles:insert>
layout.jsp
<definition name="templateDefinition“ path="/layout.jsp"> <put name="title“ value="This is the title." /> <put name="header“ value="header.jsp" /> <put name="body“ value="body.jsp" /> <put name=“footer“ value=“footer.jsp" /></definition>
<definition name="templateDefinition“ path="/layout.jsp"> <put name="title“ value="This is the title." /> <put name="header“ value="header.jsp" /> <put name="body“ value="body.jsp" /> <put name=“footer“ value=“footer.jsp" /></definition>
struts-config.xml
header.jsp
body.jsp
footer.jsp
Vorteile:Vorteile:
› Komplexe Webanwendung wird in kleine Komponenten aufgeteilt (Bottom Komplexe Webanwendung wird in kleine Komponenten aufgeteilt (Bottom
Up)Up)
› Anwendung leicht erweiterbar und Komponenten durch Trennung Anwendung leicht erweiterbar und Komponenten durch Trennung
wiederverwendbarwiederverwendbar
› Für grosse Anwendungen geeignetFür grosse Anwendungen geeignet Bei Wachstum der Anwendung bleiben Überblick und Variabilität erhaltenBei Wachstum der Anwendung bleiben Überblick und Variabilität erhalten
Nachteile:Nachteile:
› Aufteilung der Anwendung in KomponentenAufteilung der Anwendung in Komponenten
hohe Komplexität hohe Komplexität
› Noch in Weiterentwicklung und VeränderungNoch in Weiterentwicklung und Veränderung
Änderungen im Code möglicherweise nötig Änderungen im Code möglicherweise nötig
› Das Erstellen der Konfigurationsdatei ist sehr fehlerträchtigDas Erstellen der Konfigurationsdatei ist sehr fehlerträchtig
die XML Attributnamen sind oft wenig intuitiv die XML Attributnamen sind oft wenig intuitiv
› Action-Klasse muss Thread-Safe sein (jeweils nur eine Instanz)Action-Klasse muss Thread-Safe sein (jeweils nur eine Instanz)
› Einführung von Struts erfordert Refactoring der ApplikationEinführung von Struts erfordert Refactoring der Applikation
Struts HomeStruts Home
http://jakarta.apache.org/struts/http://jakarta.apache.org/struts/ WikipediaWikipedia
http://de.wikipedia.org/wiki/Strutshttp://de.wikipedia.org/wiki/Struts Buch Java-EE 5Buch Java-EE 5
Addion-WesleyAddion-Wesley
ISBN: 3-8273-2362-2ISBN: 3-8273-2362-2