Struts mit DynaBean und deklarativer Validierung

+ andere TechDocs
+ Webanwendungen
+ Eclipse
+ Apache Struts
+


Struts ist ein sehr flexibles und leistungsfähiges Open-Source-Framework für Thin-Client-Java-Webanwendungen zur Standardisierung der Verarbeitung von Requests.

Im ersten Teil "Struts: Erste Schritte" finden Sie grundlegende Informationen und es wird ein sehr einfaches Beispiel mit manueller Validierung vorgestellt (per 'validate()' in 'ActionForm').

In diesem zweiten Teil wird ein einfaches Beispiel mit dynamisch erzeugter Daten-JavaBean (DynaBean) und deklarativer Validierung (StrutsValidator) vorgestellt (per 'DynaValidatorForm' und 'validation.xml').



Inhalt

  1. Installation von Struts
  2. Einfaches Beispiel mit manueller Validierung
  3. Beispielanwendung mit DynaBean und deklarativer Validierung
    1. index.jsp
    2. MyPage01.jsp
    3. MyPage02.jsp
    4. MyPage03.jsp
    5. MeineAuswerteAction.java
    6. web.xml
    7. struts-config.xml
    8. validation.xml
    9. MessageResources.properties
    10. MessageResources_de.properties
    11. Hinweise zum Build und Test
  4. Links auf weiterführende Informationen


Installation von Struts

Verzeichnisse und Dateien der Struts-Applikation
  1. Installieren Sie Java und Tomcat, zum Beispiel wie hier beschrieben.
    Die Environmentvariablen 'JAVA_HOME' und 'CATALINA_HOME' müssen korrekt gesetzt sein.
  2. Downloaden Sie die Struts-Datei 'jakarta-struts-1.2.4.zip' (12 MByte) von http://struts.apache.org.
  3. Kopieren Sie bei gestopptem Tomcat die Datei 'struts-blank.war' aus dem Verzeichnis '<struts-root>/webapps' des entpackten Struts-Archivs in das '<tomcat-root>/webapps'-Verzeichnis und benennen Sie die Datei um in 'mystrutsdynaval.war'.
  4. Starten Sie Tomcat neu. Unter http://localhost:8080/mystrutsdynaval erhalten Sie einen kurzen Begrüßungstext. Beenden Sie Tomcat wieder.
  5. Verwenden Sie entweder das Ant-Skript 'build.xml' oder richten Sie Ihre Entwicklungsumgebung (z.B. Eclipse) so ein, dass die generierten '.class'-Dateien in Package-Unterverzeichnissen in '<tomcat-root>/webapps/mystrutsdynaval/WEB-INF/classes' generiert werden.


Einfaches Beispiel mit manueller Validierung

... siehe erster Teil.



Beispielanwendung mit DynaBean und deklarativer Validierung

  1. Schauen Sie sich noch mal den Überblick über die Vorgehensweise zur 'mystrutsapp'-Applikation aus dem ersten Teil an.
  2. Installieren Sie Struts wie oben beschrieben.
    Erweitern Sie das dabei angelegte 'mystrutsdynaval'-Projekt um die folgenden Schritte.
  3. Ersetzen Sie den Inhalt von 'index.jsp' in '<tomcat-root>/webapps/mystrutsdynaval' durch:
    <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
    <logic:redirect forward="startForwardName" />
    
  4. Löschen Sie alle Dateien im Verzeichnis '<tomcat-root>/webapps/mystrutsdynaval/pages'.
  5. Erstellen Sie im Verzeichnis '<tomcat-root>/webapps/mystrutsdynaval/pages' die erste Eingabeformular-JSP-Seite 'MyPage01.jsp':
    <%@ 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" %>
    
    <html:html locale="true">
    <head>
      <title>MyPage01.jsp: <bean:message key="Common.title"/></title>
      <html:base/>
    </head>
    <body bgcolor="white">
    
    <logic:notPresent name="org.apache.struts.action.MESSAGE" scope="application">
      <font color="red">ERROR: Application resources not loaded</font>
    </logic:notPresent>
    
    <h3><bean:message key="MyPage01.heading"/></h3>
    <p> <bean:message key="MyPage01.message"/></p>
    
    <html:form action="/htmlForm01ActionPath" focus="username">
      <p> <bean:message key="Common.Name"/>:
          <html:text property="username" size="40" maxlength="40"/><br/>
          <font color=red><html:errors property="username"/></font></p>
      <p> <bean:message key="Common.Password"/>:
          <html:text property="password" size="40" maxlength="40"/><br/>
          <font color=red><html:errors property="password"/></font></p>
      <p> <html:submit property="button2" value="Weiter" /></p>
    </html:form>
    
    </body>
    </html:html>
    
  6. Erstellen Sie im Verzeichnis '<tomcat-root>/webapps/mystrutsdynaval/pages' die zweite Eingabeformular-JSP-Seite 'MyPage02.jsp':
    <%@ 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" %>
    
    <html:html locale="true">
    <head>
      <title>MyPage02.jsp: <bean:message key="Common.title"/></title>
      <html:base/>
    </head>
    <body bgcolor="white">
    
    <logic:notPresent name="org.apache.struts.action.MESSAGE" scope="application">
      <font color="red">ERROR: Application resources not loaded</font>
    </logic:notPresent>
    
    <h3><bean:message key="MyPage02.heading"/></h3>
    
    <html:form action="/htmlForm02ActionPath" focus="date">
      <p> <bean:message key="Common.Date"/>:
          <html:text property="date" size="40" maxlength="40"/><br/>
          <font color=red><html:errors property="date"/></font></p>
      <p> <bean:message key="Common.Age"/>:
          <html:text property="age" size="40" maxlength="40"/><br/>
          <font color=red><html:errors property="age"/></font></p>
      <p> <bean:message key="Common.Email"/>:
          <html:text property="email" size="40" maxlength="40"/><br/>
          <font color=red><html:errors property="email"/></font></p>
      <p> <bean:message key="Common.HomepageUrl"/>:
          <html:text property="homepageUrl" size="40" maxlength="40"/><br/>
          <font color=red><html:errors property="homepageUrl"/></font></p>
      <p> <html:cancel property="button1" value="Zurück" />
          <html:submit property="button2" value="Weiter" /></p>
    </html:form>
    
    </body>
    </html:html>
    
  7. Erstellen Sie im Verzeichnis '<tomcat-root>/webapps/mystrutsdynaval/pages' folgende Ergebnisanzeige-JSP-Seite 'MyPage03.jsp':
    <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
    
    <html:html locale="true">
    <head>
      <title>MyPage03.jsp: Ergebnisanzeige</title>
    </head>
    <body>
    
    <h1>Eingegebene Daten</h1>
    <p> <bean:message key="Common.Name"/>:
        <b><bean:write property="username"    name="MeinDatenFormBeanName"/></b></p>
    <p> <bean:message key="Common.Password"/>:
        <b><bean:write property="password"    name="MeinDatenFormBeanName"/></b></p>
    <p> <bean:message key="Common.Date"/>:
        <b><bean:write property="date"        name="MeinDatenFormBeanName"/></b></p>
    <p> <bean:message key="Common.Age"/>:
        <b><bean:write property="age"         name="MeinDatenFormBeanName"/></b></p>
    <p> <bean:message key="Common.Email"/>:
        <b><bean:write property="email"       name="MeinDatenFormBeanName"/></b></p>
    <p> <bean:message key="Common.HomepageUrl"/>:
        <b><bean:write property="homepageUrl" name="MeinDatenFormBeanName"/></b></p>
    
    <html:form action="/htmlForm03ActionPath">
      <p> <html:submit property="button1"><bean:message key="MyPage03.back1"/></html:submit>
          <html:submit property="button2"><bean:message key="MyPage03.back2"/></html:submit></p>
    </html:form>
    
    </body>
    </html:html>
    
  8. Löschen Sie im Verzeichnis '<tomcat-root>/webapps/mystrutsdynaval/WEB-INF/src' alle Unterverzeichnisse und erstellen Sie darin den neuen Ordner 'meinpackage'. Erstellen Sie in diesem neuen Verzeichnis die folgende '<action>'-.java-Datei (von 'Action' abgeleitete Java-Klasse) 'MeineAuswerteAction.java':
    package meinpackage;
    
    import javax.servlet.http.*;
    import org.apache.struts.action.*;
    import org.apache.commons.beanutils.*;
    
    public final class MeineAuswerteAction extends Action
    {
      public ActionForward execute( ActionMapping       mp,
                                    ActionForm          fm,
                                    HttpServletRequest  rq,
                                    HttpServletResponse rp )
      {
        DynaBean dfb = (DynaBean)fm;
        String sButton1 = (String)dfb.get( "button1" );
        String sButton2 = (String)dfb.get( "button2" );
        dfb.set( "button1", null );
        dfb.set( "button2", null );
        String sAction = "Action2";
        if( null != sButton1 && 0 < sButton1.length() )  sAction = "Action1";
        return mp.findForward( sAction );
      }
    }
    
  9. Ersetzen Sie den Inhalt von 'web.xml' in '<tomcat-root>/webapps/mystrutsdynaval/WEB-INF' durch:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    
    <!DOCTYPE web-app
      PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
      "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
    
    <web-app>
    
      <display-name>My Struts Application</display-name>
    
      <!-- Standard Action Servlet Configuration (with debugging) -->
      <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>
        <init-param>
          <param-name>debug</param-name>
          <param-value>2</param-value>
        </init-param>
        <init-param>
          <param-name>detail</param-name>
          <param-value>2</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
      </servlet>
    
      <!-- Standard Action Servlet Mapping -->
      <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
    
      <!-- The Usual Welcome File List -->
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    
    </web-app>
    
  10. Ersetzen Sie den Inhalt von 'struts-config.xml' in '<tomcat-root>/webapps/mystrutsdynaval/WEB-INF' durch:
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    
    <!DOCTYPE struts-config PUBLIC
      "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
      "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
    
    <struts-config>
    
      <form-beans>
        <form-bean
          name="MeinDatenFormBeanName"
          type="org.apache.struts.validator.DynaValidatorForm"
          dynamic="true">
          <form-property name="username"    type="java.lang.String" />
          <form-property name="password"    type="java.lang.String" />
          <form-property name="date"        type="java.lang.String" />
          <form-property name="age"         type="java.lang.String" />
          <form-property name="email"       type="java.lang.String" />
          <form-property name="homepageUrl" type="java.lang.String" />
          <form-property name="button1"     type="java.lang.String" />
          <form-property name="button2"     type="java.lang.String" />
        </form-bean>
      </form-beans>
    
      <global-forwards>
        <forward name="startForwardName" path="/StartActionPath.do" />
      </global-forwards>
    
      <action-mappings>
        <action path="/StartActionPath"
                forward="/pages/MyPage01.jsp" />
        <action path="/htmlForm01ActionPath"
                type="meinpackage.MeineAuswerteAction"
                name="MeinDatenFormBeanName"
                scope="session"
                validate="true"
                input="/pages/MyPage01.jsp">
            <forward name="Action2" path="/pages/MyPage02.jsp" />
        </action>
        <action path="/htmlForm02ActionPath"
                type="meinpackage.MeineAuswerteAction"
                name="MeinDatenFormBeanName"
                scope="session"
                validate="true"
                input="/pages/MyPage02.jsp">
            <forward name="Action1" path="/StartActionPath.do" />
            <forward name="Action2" path="/ErgebnisanzeigeActionPath.do" />
        </action>
        <action path="/ErgebnisanzeigeActionPath"
                forward="/pages/MyPage03.jsp" />
        <action path="/htmlForm03ActionPath"
                type="meinpackage.MeineAuswerteAction"
                name="MeinDatenFormBeanName"
                scope="session"
                validate="true"
                input="/pages/MyPage03.jsp">
            <forward name="Action1" path="/StartActionPath.do" />
            <forward name="Action2" path="/pages/MyPage02.jsp" />
        </action>
      </action-mappings>
    
      <message-resources parameter="resources.MessageResources" />
    
      <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>
    
  11. Ersetzen Sie den Inhalt von 'validation.xml' in '<tomcat-root>/webapps/mystrutsdynaval/WEB-INF' durch:
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <!DOCTYPE form-validation PUBLIC
      "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
      "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
    
    <form-validation>
      <formset>
        <form name="MeinDatenFormBeanName">
          <field property="username" depends="required">
            <arg0 key="Common.Name" />
          </field>
          <field property="password" depends="required,minlength,mask">
            <arg0 key="Common.Password" />
            <arg1 key="${var:minlength}" resource="false" />
            <var>
              <var-name>minlength</var-name>
              <var-value>3</var-value>
            </var>
            <var>
              <var-name>mask</var-name>
              <var-value>^[0-9a-zA-Z]*$</var-value>
            </var>
          </field>
          <field property="date" depends="date">
            <arg0 key="Common.Date" />
          </field>
          <field property="age" depends="short,intRange">
            <arg0 key="Common.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>0</var-value>
            </var>
            <var>
              <var-name>max</var-name>
              <var-value>199</var-value>
            </var>
          </field>
          <field property="email" depends="email">
            <arg0 key="Common.Email" />
          </field>
          <field property="homepageUrl" depends="url">
            <arg0 key="Common.HomepageUrl" />
          </field>
        </form>
      </formset>
    </form-validation>
    
  12. Erstellen Sie im Verzeichnis '<tomcat-root>/webapps/mystrutsdynaval/WEB-INF/src' das Unterverzeichnis 'resources' und darin folgende englischsprachige Ressourcen-Datei 'MessageResources.properties':
    # -- standard errors --
    errors.header=<UL>
    errors.prefix=<LI>
    errors.suffix=</LI>
    errors.footer=</UL>
    # -- validator --
    errors.invalid='{0}' is invalid.
    errors.maxlength='{0}' can not be greater than {1} characters.
    errors.minlength='{0}' can not be less than {1} characters.
    errors.range='{0}' is not in the range {1} through {2}.
    errors.required='{0}' is required.
    errors.byte='{0}' must be an byte.
    errors.date='{0}' is not a date.
    errors.double='{0}' must be an double.
    errors.float='{0}' must be an float.
    errors.integer='{0}' must be an integer.
    errors.long='{0}' must be an long.
    errors.short='{0}' must be an short.
    errors.creditcard='{0}' is not a valid credit card number.
    errors.email='{0}' is an invalid e-mail address.
    errors.url='{0}' is an invalid url (web address).
    # -- other --
    errors.cancel=Operation cancelled.
    errors.detail='{0}'
    errors.general=The process did not complete. Details should follow.
    errors.token=Request could not be completed. Operation is not in sequence.
    
    # -- Common --
    Common.title=My Struts Application
    Common.Name=Name
    Common.Password=Password
    Common.Date=Date
    Common.Age=Age
    Common.Email=Email
    Common.HomepageUrl=Homepage URL
    # -- MyPage01.jsp --
    MyPage01.heading=Welcome!
    MyPage01.message=Second small Struts Application. \
                     Reads some information and displays them. \
                     With invalid input an error message appears.
    # -- MyPage02.jsp --
    MyPage02.heading=Please fill also these entry fields:
    # -- MyPage03.jsp --
    MyPage03.back1=Back to formular page 1
    MyPage03.back2=Back to formular page 2
    
  13. Erzeugen Sie im Verzeichnis '<tomcat-root>/webapps/mystrutsdynaval/WEB-INF/src/resources' die deutschsprachige Ressourcen-Datei 'MessageResources_de.properties':
    # -- standard errors --
    errors.header=<UL>
    errors.prefix=<LI>
    errors.suffix=</LI>
    errors.footer=</UL>
    # -- validator --
    errors.invalid='{0}' ist ungültig.
    errors.maxlength='{0}' kann nicht länger als {1} Zeichen sein.
    errors.minlength='{0}' kann nicht kürzer als {1} Zeichen sein.
    errors.range='{0}' ist nicht im Bereich {1} bis {2}.
    errors.required='{0}' ist erforderlich.
    errors.byte='{0}' muss ein Byte sein.
    errors.date='{0}' ist kein Datum (z.B. 31.12.2004).
    errors.double='{0}' muss ein Double (Fließkommazahl) sein.
    errors.float='{0}' muss ein Float (Fließkommazahl) sein.
    errors.integer='{0}' muss eine Integer-Zahl (ganze Zahl) sein.
    errors.long='{0}' muss eine Integer-Long-Zahl (ganze Zahl) sein.
    errors.short='{0}' muss eine Integer-Short-Zahl (ganze Zahl) sein.
    errors.creditcard='{0}' ist keine gültige Kreditkartennummer.
    errors.email='{0}' ist eine ungültige E-Mail-Adresse (z.B. abc@xy.de).
    errors.url='{0}' ist eine ungültige URL (Webadresse, z.B. http://www.Torsten-Horn.de/index.htm).
    # -- other --
    errors.cancel=Operation abgebrochen.
    errors.detail='{0}'
    errors.general=Der Prozess konnte nicht abgeschlossen werden. Details sollten folgen.
    errors.token=Der Prozess konnte nicht korrekt beendet werden.
    
    # -- Common --
    Common.title=Meine Struts Applikation
    Common.Name=Name
    Common.Password=Passwort
    Common.Date=Datum
    Common.Age=Alter
    Common.Email=E-Mail
    Common.HomepageUrl=Homepage URL
    # -- MyPage01.jsp --
    MyPage01.heading=Willkommen!
    MyPage01.message=Zweite kleine Struts-Anwendung. \
                     Liest Informationen ein und gibt sie wieder. \
                     Bei fehlerhafter Eingabe erscheint Fehlermeldung.
    # -- MyPage02.jsp --
    MyPage02.heading=Bitte füllen Sie auch die weiteren Felder aus:
    # -- MyPage03.jsp --
    MyPage03.back1=Zurück zu Formular Seite 1
    MyPage03.back2=Zurück zu Formular Seite 2
    
  14. Entweder Sie integrieren die Struts-Webapplikation in Ihre Entwicklungsumgebung (z.B. Eclipse) oder Sie kopieren das Ant-Skript 'build.xml' von der 'mystrutsapp'-Applikation aus dem ersten Teil in das Verzeichnis '<tomcat-root>/webapps/mystrutsdynaval/WEB-INF/src'.
  15. Führen Sie in Ihrer Entwicklungsumgebung (z.B. Ant-Skript 'build.xml' oder Eclipse) einen kompletten Rebuild durch.
    Kontrollieren Sie folgendes:
    Ist die '.java'-Datei compiliert worden und die entstandene '.class'-Datei in '<tomcat-root>/webapps/mystrutsdynaval/WEB-INF/classes/meinpackage' generiert worden?
    Sind die beiden Ressourcen-Dateien 'MessageResources.properties' und 'MessageResources_de.properties' aus '<tomcat-root>/webapps/mystrutsdynaval/WEB-INF/src/resources' nach '<tomcat-root>/webapps/mystrutsdynaval/WEB-INF/classes/resources' kopiert worden?
  16. Testen Sie Ihre Anwendung. Starten Sie Tomcat und geben Sie im Webbrowser ein: 'http://localhost:8080/mystrutsdynaval'.
    Tragen Sie in die Eingabeformularfelder nichts ein und klicken Sie auf den Button 'Weiter': Sie erhalten rote Fehlermeldungen.
    Tragen Sie in die Felder irgendetwas ein und klicken Sie auf 'Weiter' und auf 'Zurück': Die vorherigen Eingaben wurden nicht vergessen.
    Schalten Sie die Sprache Ihres Webbrowsers um von deutsch nach englisch und umgekehrt (im Microsoft Internet Explorer über: 'Extras' | 'Internetoptionen...' | 'Sprachen...' | 'Hinzufügen...' | 'Nach oben'). Wenn Sie Ihren Webbrowser anschließend neu starten, erhalten Sie die 'mystrutsdynaval'-Meldungen in der anderen Sprache.
  17. Damit während des laufenden Betriebs von Tomcat Änderungen an Dateien berücksichtigt werden, beachten Sie folgendes:
    Nach Änderungen in .jsp-Dateien genügt ein Reload im Browser (z.B. per 'Strg+R' oder 'F5').
    Änderungen in .java-Dateien können je nach Tomcat-Konfiguration automatisch zur Neucompilierung führen, sonst muss der Webapplikationskontext neu gestartet werden.
    Nach Änderungen in Konfigurations- und Ressourcendateien muss zumindest der Webapplikationskontext neu gestartet werden, entweder über die Tomcat-Manager-GUI http://localhost:8080/manager/html oder direkt über die Kontext-Reload-URL http://localhost:8080/manager/html/reload?path=/mystrutsdynaval
    (vorher muss Admin/Manager mit <user username="MeinName" password="MeinPasswort" roles="admin,manager"/> in '<tomcat-root>\conf\tomcat-users.xml' eingetragen sein).
    Der Kontext-Reload genügt aber in vielen Fällen nicht. Dann muss Tomcat gestoppt und neu gestartet werden.
    Für einige Änderungen müssen zusätzlich alle Webbrowserfenster geschlossen werden und der Webbrowser neu gestartet werden.
    Bei Problemen lohnt ein Blick in die Log-Dateien in '<tomcat-root>\logs'.
  18. Zum Deployen fassen Sie die Dateien der Webanwendung in einem WAR-Archiv zusammen, welches dann nur noch in das '<tomcat-root>/webapps'-Verzeichnis kopiert zu werden braucht. Wenn Sie dazu das Ant-Skript 'build.xml' (ohne Parameter oder mit Parameter 'dist') verwenden, beachten Sie, dass die '.war'-Datei defaultmäßig im Verzeichnis '/projects/lib' generiert wird.


Links auf weiterführende Informationen

... siehe hier.





Weitere Themen: andere TechDocs | JSP | Eclipse | Webanwendungen | Web Services
© 1998-2007 Torsten Horn, Aachen