Softwareentwicklung mit JAVA EE Beispiel Framework: Struts
Was ist? Open Source Framework zum Bau von Web Applikationen Home Page http://jakarta.apache.org/struts Teil des Apache Jakarta Project Unterstützt die MVC-Architektur Schwerpunkt liegt auf der Controller-Komponente Weitere Komponenten Tag-Libraries Validatoren Unterstützung für Sprachunabhängigkeit Historie Mai 2000 von Craig R. McClanahan begonnen Juli 2001, Struts 1.0 freigegeben Struts-2
Grundprinzip struts-config.xml definiert web.xml Regel für *.do Action bestimmen ActionServlet Folgeseite bestimmen FormBean Action Servlet- Container Antwort JSP-Seite Struts-3
Die Controller-Komponente Hauptkomponente ist ein Servlet der Klasse ActionServlet Definition durch eine Menge von ActionMappings URI Angabe mit Pfad Zugehörige Action-Klasse Geschäftslogik wird implementiert in Action-Klasse Unterklasse von org.apache.struts.action.action Übergabe von Formulardaten durch Instanzen von Form-Bean-Klassen Unterklassen von org.apache.struts.action.actionformbeans Struts-4
Implementierung des Controllers Ablauf Schreiben einer ActionForm Klasse zur Übergabe der Daten aus der View (optional) Schreiben einer Action Klasse für jeden logischen Request (Unterklasse von org.apache.struts.action.action) Konfigurieren eines ActionMapping-Eintrages (in XML) für jeden logischen Request. Die XML Konfigurationsdatei wird üblicherweise struts-config.xml genannt. Struts-5
Konfiguration des Controllers Definition der URLs, die auf Action-Klassen weitergeleitet werden sollen URL Klasse Weiterleitungen <struts-config> <action-mappings> <action path="/auswahl" type="action.auswahlaction"> <forward name="success" path="/auswahl.jsp"/> <forward name="error" path="/fehlerbehandlung.jsp"/> </action>... </action-mappings> </struts-config> Struts-6
Die Action-Klassen Nimmt den Aufruf entgegen und leitet weiter an Web-Seiten oder andere Actions import org.apache.struts.action.*; public class AuswahlAction extends Action { public ActionForward execute(actionmapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {... return mapping.findforward("success"); Struts-7
Definition sprachabhängiger Textresourcen Problem: Sprachabhängige Texte in HTML <td> Benutzername : </td> Lösung: Struts Textresourcen mit bean Taglib Alternative: JSTL fmt <td> <bean:message key="anmeldung.user"/> : </td> Deklaration in struts-config.xml <struts-config> <action-mappings>...</action-mappings> <message-resources parameter="db.applicationresources"/> </struts-config> Struts-8
Sprachabhängige Texte 2 Default-Werte in db.applicationresources.properties Explizite Sprachdefinitionen - Beispiele db.applicationresources_de_de.properties anmeldung.user = Benutzername anmeldung.pw = Passwort db.applicationresources_en_gb.properties Auswahl der Sprache anmeldung.user = User Name anmeldung.pw = Password Übernahme der Steuerung durch Browsereinstellungen in JSP <html:html locale="true"> Alternativ: explizites Setzen des Session-Attributes org.apache.struts.action.locale Struts-9
Die FormBean Optionale JavaBean zur Unterstützung bei der Verarbeitung von formularartigen Seiten kann Werte während Session speichern validate und reset werden unterstützt Beispiel: import org.apache.struts.action.*; public class MyForm extends ActionForm { private String f1; // erfordert entspr. Get-/set-Methoden //... public ActionErrors validate (ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); if (f1 == null f1.length() == 0) { errors.add("f1", new ActionError("errors.f1.required")); //... return errors; <html:form> <html:text property="f1" /> <html:errors property="f1" />... </html:form> Struts-10
Nutzung FormBeam Deklaration in struts-config.xml <form-beans> <form-bean name="myformbean" type="form.myform"/>... </form-beans> Zuordnung zu Action <struts-config> <action-mappings> <action path="/auswahl" type="action.auswahlaction" name="myformbean" > <forward name="success" path="/auswahl.jsp"/> <forward name="error" path="/fehlerbehandlung.jsp"/> </action> </action-mappings> <message-resources parameter="db.applicationresources"/> </struts-config> Struts-11
alternative Form-Validierung Steht zur Verfügung, wenn von ValidatorForm abgeleitet wird import org.apache.struts.action.*; public class MyForm extends ValidatorForm { private String f1; // erfordert entspr. Get-/set-Methoden //... Definition der Regeln in validator-rules.xml zahlreiche vordefinierte Regeln Erweiterungen sind möglich Kann auch Code für Client-seitige Validierung enthalten Zuordnung der Forms/Felder zu Regeln: validation.xml Struts-12
Beispiel: validation.xml Validator-Plugin in struts-config.xml definieren <struts-config>... <plug-in classname="org.apache.struts.validator.validatorplugin"> <set-property property="pathnames" value="/web-inf/validator-rules.xml,/web-inf/validation.xml"/> </plug-in> </struts-config> Definition der Regeln in validation.xml <field property="pw" depends="required,minlength"> <msg name="required" key="errors.fehlt"/> <arg0 key="anmeldung.pw"/> <arg1 name="minlength" key="${var:minlength" /> <var><var-name>minlength</var-name> <var-value>3</var-value></var> </field> Struts-13
validator-rules.xml enthält zahlreiche nützliche vordefinierte Prüfungen required validwhen (Vergleich zweier Felder) mask (Prüfen gegen regulären Ausdruck) minlength, maxlength integer, short, byte, long, float,... date (Pattern kann mitgegeben werden) intrange, floatrange, doublerange creditcard email url Struts-14
Struts Tag Libraries besonders relevant: html-tags vereinfacht Erzeugung von HTML-Seiten ermöglicht Verwendung von FormBeans Beispiel: select mit optionscollection <html:form action="ausgabe.do"> <bean:message key="auswahl.katwahl"/> <html:select property="categoryid"> <html:optionscollection property="kategorien" value="categoryid" label="name"/> </html:select> <html:submit><bean:message key="auswahl.abschicken"/></html:submit> </html:form> Struts-15
Logging
Das Commons Logging Interface Vereinheitlicht verschiedene Logging APIs Verwendung If Log4J is there, use it. If JDK 1.4 is there, use it. Otherwise, use SimpleLog. import org.apache.commons.logging.log; import org.apache.commons.logging.logfactory;... public class Foo { private static Log log = LogFactory.getLog(Foo.class); //... public void setbar(bar bar) { if (log.istraceenabled()) { log.trace("setting bar to " + bar); this.bar = bar; Struts-17
Das Commons Logging Interface 2 Funktionen für das Logging log.fatal(object m); log.fatal(object m, Throwable t); log.error(object m); log.error(object m, Throwable t); log.warn(object m); log.warn(object m, Throwable t); log.info(object m); log.info(object m, Throwable t); log.debug(object m); log.debug(object m, Throwable t); log.trace(object m); log.trace(object m, Throwable t); Zusatzfunktionen log.isfatalenabled(); log.iserrorenabled(); log.iswarnenabled(); log.isinfoenabled(); log.isdebugenabled(); log.istraceenabled(); Struts-18
Java Standard Logging: Levels In absteigender Dringlichkeit SEVERE (höchster Wert) WARNING INFO CONFIG FINE FINER FINEST (niedrigster Wert) Struts-19
Java Standard Logging: Konfiguration Konfiguration Ein Default-File im jdk unter <jre>/lib/logging.properties Festlegen eines eigenen Konfig-Files über die System-Property java.util.logging.config.file Aufruf: java -Djava.util.logging.config.file=... Angabe einer Klasse als Konfigurations-Input Siehe auch: http://java.sun.com/javase/6/docs/technotes/guides/logging/ Struts-20
Einsatz Logging Was loggen? Ein-/Austritt aus Funktionen Beim Eintritt: übergebene Parameter Beim Austritt: Infos über das Ergebnis Beispiel: DB-Funktion public static Collection<PersAbtDTO> findbyabtname(connection cn, String name) { if (log.isinfoenabled()) log.info ("findbyabtname name="+ name);... try {... catch (SQLException e) { log.error("findbyabtname DB-Fehler:", e); if (log.isdebugenabled()) log.debug ("findbyabtname found:"+((erg == null)? 0 : erg.size())); return erg; Struts-21