Übersicht Struts Forms Allgemeines Was ist ein Java Bean Was ist
Transcrição
Übersicht Struts Forms Allgemeines Was ist ein Java Bean Was ist
Übersicht Struts Forms Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen. Allgemeines Autor: Sascha Wolski http://www.laliluna.de/tutorials.html – Tutorials für Struts, EJB, xdoclet und eclipse. Datum: September, 13th 2004 Software: Struts Framework 1.2.6 PDF Download http://www.laliluna.de/download/struts-forms-overview-de.pdf Was ist ein Java Bean Vorab sollte der Begriff Java Bean nochmal kurz erläutert werden. Java Beans sind nichts weiter als Klassen die für ihre Ereignis-Verarbeitungen und Methoden bestimmte von Sun festgelegte Namenskonversationen (Vorgaben) einhalten müssen. Sie werden schon seit Jahren bei der Konstruktion grafischer Benutzeroberfläschen eingesetzt. Die Eigenschaften der Java Beans werden, wie bei anderen Klassen auch, durch Attribute (Variablen) festgelegt. Nur darf bei Java Beans keine dieser Attribute öffentlich (global) sein. Der Zugriff auf die Attribute erfolgt über entsprechende Zugriffsmethoden. Die Java-Spezifikation sieht hier getter- und setter- Methoden vor. Hat ein Java Bean ein Attribute name, so wird der Wert dieses Attributes mit einer Methode setName() gesetzt und mit der Methode getName() ausgelesen. Was ist eine ActionForm Klasse Eine ActionForm Klasse ist ein JavaBean, dass Daten speichert, ähnlich einer Objekt-Klasse. Diese ActionForm kann man einer Action in der struts-config.xml zu weisen. Es gibt für diese ActionForm Klassen zwei Möglichkeiten der Nutzung. • Daten können gespeichert werden, mit denen man den Inhalt eines Formulars vorbelegen möchte (Bsp.:Formular zum Editieren) oder die man in einer JSP Datei ausgegeben werden sollen. • Struts schreibt nach dem Abschicken eines Formulars die Daten wieder in eine ActionForm Im zweiten Fall muss der Entwickler häufig diese Daten validieren, ob die Daten im entsprechenden Format sind und den richtigen Wertebereich haben, zum Beispiel ob eine Emailadresse das richtige Format hat, ein Datum stimmt oder eine Zahl in einem Wertebereich liegt. Das kann der Entwickler entweder per Hand in der dazugehörigen Action machen oder mit der von der Klasse ActionForm bereitgestellten Methode validate(..). Eine weitere Möglichkeit ist das festlegen von Regeln in einer XML Datei. Struts bietet eine Vielzahl von Validierungsregeln, die man einem Feld in einem Formular zuordnen kann. Varianten der ActionForm Klasse Es existieren verschiedene Varianten der ActionForm Klasse, diese man in zwei große Bereiche, ActionForms (Programmierung von Hand) und dynamische ActionForms (Generierung durch Struts) unterteilt. ActionForm (Programmierung per Hand) Dabei erstellt der Entwickler eine Klasse die von der Klasse ActionForm abgeleitet wird. Beispiel einer ActionForm Klasse, mit Validierung in der validate(..) Methode. public class myActionForm extends ActionForm { private String text = "Hello World!" public String getText(){ return text; } public void setText(String text){ text = this.text; } public ActionErrors validate( ActionMapping mapping, HttpServletRequest request) { ActionErrors actionErrors = new ActionErrors(); if(!text.equals("Hello World!")) actionErrors.add("form", new ActionMessage("Error !!")); } return actionErrors; } Definition des Form-Beans in der struts-config.xml: <form-beans> <form-bean name="myForm" type="my.package.myActionForm" /> </form-beans> Zugriff auf Form-Bean innerhalb der Action Klasse: public class myAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { //casten der form als ActionForm ActionForm myForm = (ActionForm) form; //wert auslesen System.out.println("TEXT=" + myForm.getItem()); } return mapping.findForward("success"); } Dynamische ActionForms (Generierung durch Struts) Es wird bei einer dynamischen ActionForm (DynaActionForm) keine Klasse erstellt. Man definiert das Bean und die dazugehörigen Eigenschaften in der struts-config.xml und Struts generiert die Klasse temporär. Definition des Form-Beans in der struts-config.xml: <form-beans> <form-bean name="myForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="text" type="java.lang.String" initial="Hello World!"/> </form-bean> </form-beans> Zugriff auf Form-Bean innerhalb der Action Klasse: public class myAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { //casten der form als DynaActionForm DynaActionForm myForm = (DynaActionForm) form; //wert auslesen System.out.println("TEXT=" + myForm.get("text")); } return mapping.findForward("success"); } Validierung auf Basis von XML Regeln Eine weitere Variante die sowohl für die dynamiche, aber auch für die normale ActionForm Klasse exisitert, ist die Erweiterung einer XML basierenden Validierung der Eigenschaften. Man spricht dabei von ValidatorForm und DynaValidatorForm Klassen. Die Zuordnung der XML Regeln für die Validierung wird durch das name Attribut der dazugehörigen Action, definiert in der strutsconfig.xml, realisiert. Hinweis:Bei allen Validator Forms muss das Validator-Plugin in der struts-config.xml geladen sein. <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml"/> </plug-in> Beispiel einer nicht dynamischen ValidatorForm Klasse: public class myValidatorForm extends ValidatorForm { private String text = "Hello World!" public String getText(){ return text; } public void setText(String text){ text = this.text; } } Definition des Form-Beans in der struts-config.xml: <form-beans> <form-bean name="myForm" type="my.package.myValidatorForm" /> </form-beans> Zugriff auf Form-Bean innerhalb der Action Klasse: public class myAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { //casten der form als ValidatorForm ValidatorForm myForm = (ValidatorForm) form; //wert auslesen System.out.println("TEXT=" + myForm.getItem()); } return mapping.findForward("success"); } Definition einer dynamischen ValidatorForm in der struts-config.xml: <form-beans> <form-bean name="myDynaForm" type="org.apache.struts.validator.DynaValidatorForm"> <form-property name="item" type="java.lang.String" /> </form-bean> </form-beans> Beispiel für XML Validierung (validation.xml): <form-validation> <formset> <form name="myDynaForm"> <field property="item" depends="required"> <arg0 key="prompt.item"/> </field> </form> </formset> </form-validation> Bei den ValidatorForms, ob nun dynamisch oder nicht, existiert eine weitere Variante, die eine andere Vorgehensweise für die Zuordnung der XML Regeln zur Validierung benutzt. Dabei wird das path Attribut der dazugehörigen Action, definiert in der struts-config.xml, genutzt und die Regeln zur Validierung werden anhand des ausgerufenen Pfades ermittelt. Die Klassen dazu heissen ValidatorActionForm oder DynaValidatorActionForm. Besondere Varianten der ValidatorForm Klasse Es existieren zwei besondere Varianten der ValidatorForm Klasse, die BeanValidatorForm (ab Struts-Version 1.2.4) und LazyValidatorForm (ab Struts-Version 1.2.6). Beide Klassen unterstützen wie die ValidatorForm Klasse die XML basierende Validierung von Eigenschaften. Die BeanValidatorKlasse wird genutzt um aus einer normalen Objektklasse (POJO) ein Bean zu erzeugen. Dabei gibt man beim Anlegen des FormBeans in der struts-config.xml die Objektklasse an. Beispiel einer Objektklasse: public class myPOJOClass { private String text = "Hello World!" public String getText(){ return text; } public void setText(String text){ text = this.text; } } Definition des Form-Beans in der struts-config.xml <form-beans> <form-bean name="myForm" type="my.package.myPOJOClass" /> </form-beans> Zugriff auf Form-Bean innerhalb der Action Klasse public class myAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { //casten der form als BeanValidatorForm BeanValidatorForm myForm = (BeanValidatorForm) form; //wert auslesen System.out.println("TEXT=" + myForm.get("text")); } return mapping.findForward("success"); } Die LazyValidatorForm ist eine dynamische Variante der ValidatorForm, es muss also keine Klasse erstellt werden. Definiert wird ein Bean vom Typ LazyValidatorForm in der strutsconfig.xml. Die Besonderheit dieser Klasse, es ist nicht mehr notwendig Eigenschaften (Variablen) zu definieren. Die benötigten Eigenschaften werden von Struts ahand der übergebenen Parameter erstellt. Definition des Form-Beans in der struts-config.xml <form-beans> <form-bean name="testForm" type="org.apache.struts.validator.LazyValidatorForm" /> </form-beans> Ausschnitt aus JSP Datei: <html:form action="/test"> <html:text property="text" /> <br> <html:submit /> </html:form> Zugriff auf Form-Bean innerhalb der Action Klasse: public class myPOJOAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { //casten der form als LazyValidatorForm LazyValidatorFormtestForm = (LazyValidatorForm) form; //wert auslesen System.out.println("NAME=" + testForm.get("text")); } return mapping.findForward("success"); } Übersicht der ActionForm Klassen Form Typ Besonderheiten Validierung Dynamisch ActionForm Basis ActionForm Klasse, von dieser erben alle Varianten von ActionForm Klassen. Nein Nein DynaActionForm Dynamische Variante ActionForm Klasse. Es wird keine Klasse benötigt. Definition in struts-config.xml Nein Ja ValidatorForm XML basierende Validierung Zuordnung der XML Regeln für Validierung anhand des Attributes name der dazugehörigen Action Ja Nein DynaValidatorForm Dynamische Variante der ActionForm Klasse. Es wird keine Klasse benötigt. Definition in struts-config.xml. XML basierende Validierung Ja Ja ValidatorActionForm XML basierende Validierung. Zurordnung der XML Regeln für Validierung anhand des path Attributes der dazugehörigen Action. Ja Nein Ja Ja Ja Nein Dadurch können für das gleiche Formbean unterschiedliche Validierungen vorgenommen werden, abhängig vom Action, in dem es verwendet wird. DynaValidatorActionForm Dynamische Variante der ActionForm Klasse. XML basierende Validierung Zurordnung der XML Regeln für Validierung anhand des path Attributes der dazugehörigen Action Dadurch können für das gleiche Formbean unterschiedliche Validierungen vorgenommen werden, abhängig vom Action, in dem es verwendet wird. BeanValidatorForm XML basierende Validierung, Wird genutzt um normale Objektklasse als Form-Bean zu nutzen. Form Typ LazyValidatorForm Besonderheiten Dynamische Variante der ActionForm Klasse. XML basierende Validierung, Es ist nicht notwendig Eigenschaften zu definieren. Validierung Dynamisch Ja Ja