Struts Code Pieces – ValidatorActionForm Allgemeines Die
Transcription
Struts Code Pieces – ValidatorActionForm Allgemeines Die
Struts Code Pieces – ValidatorActionForm Diese Tutorial erläutert die Verwendung der Klasse ValidatorActionForm anhand eines Beispiels. Allgemeines Autor: Sascha Wolski Sebastian Hennebrüder http://www.laliluna.de/tutorials.html – Tutorials für Struts, EJB, xdoclet und eclipse. Datum: 11. Februar 2005 Development Tools Eclipse 3.x Dependencies Struts 1.1 Jboss, Tomcat, Jetty etc PDF download: http://www.laliluna.de/download/struts-validatoraction-form-de.pdf Source download: http://www.laliluna.de/download/struts-validatoraction-form-source.zip Die ValidatorActionForm Klasse Die Klasse ValidatorActionForm ist eine Subklasse der ValidatorForm Klasse und erbt von ihr die Besonderheit, das Felder eines Formulars auf Basis von XML Dateien validiert werden können. Die beiden Klassen besitzen nur einen Unterschied, die Klasse ValidatorActionForm ermittelt die Validierungsregeln für die Form-Bean Eigenschaften anhand des Pfades mit dem eine Action aufgerufen wird (/path-to-action/action.do). Es ist dadurch möglich ein Form-Bean für jede Action, in der es verwendet, nach anderen Validierungsregeln zu testen. Beispiel: public class ExampleForm extends ValidatorActionForm {} Für die erstellte FormBean Klasse wird in der Struts Config ein Name festgelegt. Beispiel: <form-beans > <form-bean name="exampleForm" type="my.package.ExampleForm" /> </form-beans> Das Form-Bean kann danach in einer Action verwendet werden. Unten sehen Sie das ActionMapping in der Struts Config. Beispiel: <action attribute="exampleForm" input="/form/example.jsp" name="exampleForm" path="/example" scope="request" type="my.package.ExampleAction" /> Validierung von Eigenschaften Die Klasse ValidatorActionForm bietet die Möglichkeit Standard-Validierungen auf Basis von XML Dateien zu nutzen. Struts bietet mehrere Validierungsregeln an, die sich in der XML Datei validator-rules.xml wiederfinden. Diese Validierungsregeln können genutzt werden um Eigenschaften des Form-Beans zu prüfen. Welche Validierung nun für welche Eigenschaft zum Tragen kommt definiert man in einer separaten XML Datei (validation.xml) Beispiel aus validation.xml: <form-validation> <formset> <!-- validation mapping für example action --> <form name="/example"> <field property="name" depends="required, minlength"> <arg0 key="exampleForm.name" /> <arg1 key="${var:minlength}" resource="false" /> <var> <var-name>minlength</var-name> <var-value>3</var-value> </var> </field> </form> </formset> </form-validation> Initialisierung von Eigenschaften Die ValidatorActionForm Klasse bietet wie die Klasse ActionForm eine Methode reset(..) zum Initialisieren von Eigenschaften an. Diese Methode wird automatisch von Struts aufgerufen und es können innerhalb der Methode zum Beispiel Standardwerte für Eigenschaften gesetzt werden. Beispiel: public void reset(ActionMapping mapping, HttpServletRequest request) { } //Initialisieren der Eigenschaft text text = "Hello World"; Verwendung eines ValidatorActionForm Beans Anhand einer Beispielanwendungen wird die Verwendung eines ValidatorActionForm Bean aufgezeigt. Erstellen der ValidatorActionForm Klasse Erstelle eine neue Klasse ExampleForm in einem Package. (Bsp: de.laliluna.tutorials.validatoractionform.form). Die Klasse soll von der Klasse ValidatorActionForm erben. Erstelle zwei Eigenschaften, name (Name) vom Typ String und age (Alter) vom Typ int. Für die Eigenschaften erstelle jeweils eine Getter- und Setter-Methode. Die Klasse sollte wie folgt aussehen. public class ExampleForm extends ValidatorActionForm { //Eigenschaften der Klasse private String name; private int age; //Getter und Setter Methoden public int getAge() { return age; } } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } Erstellen der Action Klasse Erstelle im Package de.laliluna.tutorial.validatoractionform.action neue Klasse ExampleAction. Die Klasse erbt von der Klasse Action. Implementiere die Methode execute(..). Zuweisen der ValidatorActionForm Klasse Zugriff und Ausgabe der Variablen name und age innerhalb der Action Klasse. Der folgende Quellcode zeigt die Klasse ExampleAction public class ExampleAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { //ValidatorActionForm zuweisen ExampleForm exampleForm = (ExampleForm) form; //Zugriff auf Eigenschaften der ValidatorActionForm //Klasse innerhalb der Action Klasse System.out.println(exampleForm.getName()); System.out.println(exampleForm.getAge()); } return mapping.findForward("success"); } Erstellen der JSP Dateien Erstelle im Verzeichnis ../WebRoot/form/ des Projektes zwei neue JSP Datei mit dem Namen example1.jsp und example2.jsp. Kopiere den unterstehenden Quelltext in die beiden JSP Dateien. Ändere den Wert bei <html:form action=“..“> im ersten JSP auf /example1 und im zweiten JSP auf /example2. <%@ page language="java"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> <html> <head> <title>JSP for exampleForm</title> </head> <body> <html:form action="/example1"> <html:errors /> Name: <html:text property="name" /> <br> Age: <html:text property="age" /> <br> <html:submit value="Send"/> </html:form> </body> </html> Erstellen des Form-Beans (struts-config.xml) Öffne die struts-config.xml und füge im oberen Teil, bei <form-bean>, folgende Zeilen ein. (Hinweis: Wir beziehen uns immer auf das Package de.laliluna.tutorial.validatoractionform) Das Attribut name definiert den Namen unter dem das Form-Bean angesprochen werden kann. type definiert den Typ des Form-Beans in unserem Fall unsere ValidatorActionForm Klasse. <form-beans > <form-bean name="exampleForm" type="de.laliluna.tutorial.validatoractionform.form.ExampleForm" /> </form-beans> Erstellen von zwei Action-Mappings (struts-config.xml) Um den Umgang mit der ValidatorActionForm Klasse aufzuzeigen, erstellen wir zwei ActionMappings in der struts-config.xml. Bei beiden Action-Mappings wird das selbe Form-Bean verwendet. Um uns ein wenig Arbeit zu ersparen nutzen wir auch gleich bei beiden Mappings die gleiche Action Klasse ExampleAction. Erstelle in der struts-config.xml innerhalb von <action-mapping> zwei Action-Mappings für die Action Klasse. Weise der Action das Form-Bean exampleForm zu und erstelle ein Weiterleitung auf die jeweiligen JSP Dateien. Vergibt für die erste Action den Pfad (path) /example1 und für die zweite Action /example2. name weisen wir der Action das Form-Bean zu. input weisst auf eine JSP Datei die nach fehlerhafter Validierung der Daten ausgerufen wird. In unserem Fall ist es die gleiche JSP Datei, die auch zur Anzeige des Formulars verwendet wird. type weist der Action die Action Klasse ExampleAction zu. <forward ...> weisst auf die JSP Datei example1.jsp und example2.jsp. <action-mappings > <action attribute="exampleForm" input="/form/example1.jsp" name="exampleForm" path="/example1" scope="request" type="de.laliluna.tutorial.validatoractionform.action.ExampleAction"> <forward name="showExample" path="/form/example1.jsp" /> </action> <action attribute="exampleForm" input="/form/example2.jsp" name="exampleForm" path="/example2" scope="request" type="de.laliluna.tutorial.validatoractionform.action.ExampleAction"> <forward name="showExample" path="/form/example2.jsp" /> </action> </action-mappings> Initialisieren von Eigenschaften in ValidatorActionForm Klasse Im nächsten Schritt bearbeiten wir die ValidatorActionForm Klasse ExampleForm und fügen die reset(..) Methode hinzu. Innerhalb der reset(..) Methode werden die beiden Eigenschaften der ValidatorActionForm Klasse initialisiert. Folgender Quelltext zeigt die Methode reset(..) der Klasse ExampleForm. public void reset(ActionMapping mapping, HttpServletRequest request) { } //Initialisieren der Eigenschaften name = "Adam Weisshaupt"; age = 23; Validierung der Eigenschaften auf Basis einer XML Datei Erstelle im Verzeichnis /WebRoot/WEB-INF/ die XML Datei validation.xml und lege für jedes Action-Mapping Validierungsregeln an. Beim ersten Action-Mapping soll der Name und das Alter validiert werden, wobei der Name mindestens aus 3 Zeichen bestehen muss und das Alter zwischen 1 und 150 liegt. Beim zweiten Action-Mapping soll nur der Name validiert werden, wobei der Name mindestens aus 6 Zeichen bestehen muss. <form name=“..“> definiert hier den Action-Mapping Pfad für welches die Validierungen ausgeführt werden sollen. <field property=“..“> gibt die Eigenschaft im Form-Bean an, für die eine Validierung ausgeführt werden soll. Mit dem Attribut depends legt man die Regeln der Validierung fest (Regeln sind in der validator-rules.xml festgelegt). <arg0 key=“..“> definiert einen Schlüssel für die Fehlerausgabe. Bei der Fehlerausgabe wird der Platzhalter {0} durch den Wert des Schlüssels ersetzt. (siehe MessageResouce). <var-name> gibt den Name einer Variablen an, die für eine Validierungsregel genutzt wird und <var-value> den Wert der Variablen. Erstelle folgende Validierungen für die Form-Bean Eigenschaften: <form-validation> <formset> <!-- validation mapping for action /example1 --> <form name="/example1"> <field property="name" depends="required, minlength"> <arg0 key="exampleForm.name" /> <arg1 key="${var:minlength}" resource="false" /> <var> <var-name>minlength</var-name> <var-value>3</var-value> </var> </field> <field property="age" depends="required, intRange, integer"> <arg0 key="exampleForm.age"/> <arg1 name="intRange" key="${var:min}" resource="false" /> <arg2 name="intRange" key="${var:max}" resource="false" /> <var> <var-name>min</var-name> <var-value>1</var-value> </var> <var> <var-name>max</var-name> <var-value>150</var-value> </var> </field> </form> <!-- validation mapping for action /example2 --> <form name="/example2"> <field property="name" depends="required, minlength"> <arg0 key="exampleForm.name" /> <arg1 key="${var:minlength}" resource="false" /> <var> <var-name>minlength</var-name> <var-value>6</var-value> </var> </field> </form> </formset> </form-validation> Aktivieren des ValidatorPlugins in der Struts Config Um den Struts-Validator zu nutzen muss das ValidatorPlugin und die zu verwendenden XML Dateien in der Struts Config angegeben werden. Öffne die Datei struts-config.xml und füge folgende Einstellungen an das Ende innerhalb des Tag <struts-config> ein. Mit dem Tag <set-property ...> definiert man die XML Dateien die vom ValidatorPlugin verwendet werden. <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/> </plug-in> Erstellen einer Message Resource Datei Die Message Resource Datei wird für die Ausgabe der Fehlermeldungen benötigt und enthält die benötigten Texte für die Fehlerausgabe. Erstelle im Package de.laliluna.tutorial.validatoractionform eine neue Datei mit dem Namen ApplicationResources.properties Nähere Informationen zu Message Resource Dateien erhält man im MessageResource Tutorial http://www.laliluna.de/struts-message-resources-tutorial-de.html Füge die folgenden Zeilen in die Datei: errors.suffix=<br> # -- default error messages for struts validator errors.required='{0}' is required. errors.minlength='{0}' can not be less than {1} characters. errors.range='{0}' is not in the range {1} through {2}. # -- field names exampleForm.name=Name exampleForm.age=Age Öffne die struts-config.xml und füge die folgende Zeile hinzu: <message-resources parameter="de.laliluna.tutorial.validatoractionform.ApplicationResources"/> Testen des Beispiels Damit haben wir anhand eines kleinen Beispiels, die Verwendung der Klasse ValidatorActionForm näher gebracht. Das Beispiel kann jetzt getestet werden. Rufen Sie die Anwendung mit folgenden Links auf. (Achtung: wir setzten eine Standardinstallation von JBOSS oder Tomcat voraus.) http://localhost:8080/ValidatorActionForm/example1.do (Validierung von Name und Alter) http://localhost:8080/ValidatorActionForm/example2.do (Validierung von Name)