einführung / geschichte einführung / geschichte motivation motivation beispiel beispiel...

24

Upload: elissa-boettner

Post on 05-Apr-2015

103 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration
Page 2: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

Einführung / GeschichteEinführung / Geschichte MotivationMotivation BeispielBeispiel Architektur / KomponentenArchitektur / Komponenten KonfigurationKonfiguration FazitFazit

Page 3: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 4: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 5: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 6: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 7: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 8: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 9: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 10: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

<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

Page 11: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 12: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten 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

Page 13: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 14: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten 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

Page 15: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten 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

Page 16: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 17: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 18: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 19: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

<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

Page 20: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

<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

Page 21: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 22: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 23: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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

Page 24: Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration

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