Por admin | Para la categoría de struts | noticia del 14-09-2009
Tutorial de struts DynaValidatorForm
En el anterior post para la categoría de struts habíamos visto los formularios dinámicos de struts, como repaso decíamos que eliminaban la creación de de la clase de tipo actionForm mediante la configuración del form bean en el fichero struts-config.xml.
Lo que ocurria con la clase DynaActionForm era que aunque teníamos el código para la validación de los campos en la clase no funcionaba pero que se podían imprimir los mensajes y devolverlos mediante el objeto request de petición.
La validación también sería posible mediante javascript como otros lenguajes pero struts dispone de una clase que facilita todo esto, esta clase se llama DynaValidatorForm y permite la validación de los campos de un formulario dinámico.
En los ejemplos anteriores redirigíamos la accion Welcome.do a las páginas correspondientes de cada ejemplo con lo cual perdíamos en el proyecto la posibilidad de interactuar con los anteriores ejemplos, para que no ocurra eso se puede crear una página sólo de enlaces, a los diferentes ejercicios a modo de menú.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <global-forwards> <!-- Default forward to "Welcome" action --> <!-- Demonstrates using index.jsp to forward --> <forward name="welcome" path="/Welcome.do"/> </global-forwards> <!-- =========================================== Action Mapping Definitions --> <action-mappings> <!-- Default "Welcome" action --> <!-- Forwards to Welcome.jsp --> <!-- modificamos el forward para que apunte a la pagina de login.jsp --> <action path="/Welcome" forward="/pages/ejercicios.jsp"/> |
lo que estamos haciendo es redirigir el Welcome.do a la página ejercicios.jsp que está en la carpeta pages

para la css estilo.css añadido
.enlace { height:40px; }
Código de la página ejercicios.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html:html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Ejercicios</title> <html:base/> <link rel="stylesheet" type="text/css" href="../css/estilo.css" /> </head> <body> <div id="contenedor"> <h2> <bean:message key="ejercicios"/> </h2> <div class="enlace"> <html:link page="/pages/login.jsp"> 1) formulario login ActionFom </html:link> </div> <div class="enlace"> <html:link page="/pages/formulariodinamico.jsp"> 2) formulario dinámico </html:link> </div> <div class="enlace"> <html:link page="/pages/formdinavalidacion.jsp"> 3) formulario dinámico validación </html:link> </div> <div id="pie"> <p> www.railsymas.com </p> </div> </div> </body> </html:html> |
Cofiguración en el struts-config.xml del bean dynavalidatorform tenemos el nombre del bean en el atributo name y en el atributo type la clase a la que pertenece, después tenemos los mismos campos que en el formulario dynaactionform, nombre, domicilio y edad inicializado a 18
1 2 3 4 5 6 | <form-bean name="dinamicoValidacion" type="org.apache.struts.validator.DynaValidatorForm"> <form-property name="nombre" type="java.lang.String" /> <form-property name="domicilio" type="java.lang.String" /> <form-property name="edad" type="java.lang.Integer" initial="18" /> </form-bean> |
Si nos fijamos en el fichero de configuración struts-config.xml viene lo siguiente descomentado ya en el proyecto en blanco struts-blank.xml del que partimos
1 2 3 4 | <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/org/apache/struts/validator/validator-rules.xml, /WEB-INF/validation.xml"/> </plug-in> |
Struts utiliza dos ficheros xml de configuración uno que vamos a introducir datos validation.xml y el otro lo dejaremos como está y comentaremos más adelante validator-rules.xml donde tenemos la configuración tipos de campos (entero real etc ) presencia o no de un campo todo ya proporcionado por el framework struts. Estos dos ficheros estan en la carpeta web-inf del proyecto.
Dentro del fichero validation.xml introducimos lo siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <formset> <form name="dinamicoValidacion"> <field property="nombre" depends="required"> <arg key="campo.nombre"/> </field> <field property="domicilio" depends="required"> <arg key="campo.domicilio"/> </field> </form> </formset> |
Como ya venía este fichero con bloques declarados nos fijamos que tiene la siguiente estructura
El name del form tiene que ser el mismo del nombre que el declarado en la sección formbean para el formulario de validación dinámica. Solamente para los dos campos del formulario nombre y domicilio se pide que sean rellenados para ello ponemos depends=”required” esto funciona ya que el fichero validator-rules.xml lo tiene así establecido.
Código de la página formdinavalidacion.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <html:html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title><bean:message key="titulo.dinamico"/></title> <html:base/> <link rel="stylesheet" type="text/css" href="../css/estilo.css" /> </head> <body> <div id="contenedor"> <h2><bean:message key="titulo.dinamicoValidacion"/></h2> <div id="errores"> <html:errors/> </div> <div id="imagen"> <html:img srcKey="dinamicoValidacion.registro.imagen" titleKey="dinamicoValidacion.registro.imagen.alt"/> </div> <div id="contenido"> <html:form action="dinamicoValidacion" focus="nombre" styleId="formulario" method="post"> <div class="campo"> <bean:message key="login.nombre"/> <html:text property="nombre"/> </div> <div class="campo"> <bean:message key="login.domicilio"/> <html:text property="domicilio"/> </div> <div class="campo"> <bean:message key="login.edad" /> <html:password property="edad" maxlength="3" size="3"/> </div> <html:submit styleClass="boton" value="enviar"/> <html:cancel styleClass="boton" value="cancelar"/> </html:form> </div> <div id="pie"> <p> www.railsymas.com </p> </div> </div> </body> </html:html> |
imagen del formulario

Se puede ver como al enviar el formulario ya valida la presencia de los campos en este caso se envió vacío y nos muestra el aviso de los dos campos
Código del formulario de cancelación es el mismo código que en el formulario DynaActionForm ya que no es necesario tocarlo pero se vuelve a incluir aquí para este ejemplo código de cancelada2.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <%@taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html:html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title> <bean:message key="cancelada.titulo"/></title> <html:base/> <link rel="stylesheet" type="text/css" href="../css/estilo.css" /> </head> <body> <div id="contenedor"> <h2> <bean:message key="cancelada.login"/> </h2> <div id="imagen"> <html:img srcKey="cancelada.imagen" titleKey="cancelada.imagen.alt"/> </div> <div id="mensaje"> <bean:message key="cancelada.mensaje"/> <div class="campo"> <html:link page="/pages/ejercicios.jsp" > Volver al menú de ejercicios </html:link> </div> </div> <div id="pie"> <p> www.railsymas.com </p> </div> </div> </body> </html:html> |
Código fuente de la página personales datospersonales2.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <%@taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html:html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title><bean:message key="titulo.dinamicoValidacion"/></title> <html:base/> <link rel="stylesheet" type="text/css" href="../css/estilo.css" /> </head> <body> <div id="contenedor"> <h2>Bienvenido <bean:write name="dinamicoValidacion" property="nombre"/></h2> <div id="imagen"> <html:img srcKey="dinamicoValidacion.imagen" titleKey="dinamicoValidacion.imagen.alt"/> </div> <div id="mensaje"> <bean:message key="dinamicoValidacion.mensaje"/> <div class="campo"> <bean:write name="dinamicoValidacion" property="nombre"/> </div> <div class="campo"> <bean:write name="dinamicoValidacion" property="domicilio"/> </div> <div class="campo"> <bean:write name="dinamicoValidacion" property="edad"/> </div> </div> <div id="pie"> <p>www.railsymas.com </p> </div> </div> </body> </html:html> |
El formulario se ha enviado correctamente y se muestran los datos
pasando nombre:manolo domicilio: casa de manolo edad 59

Cofiguración del action en el fichero struts-config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <action path="/dinamicoValidacion" type="acciones.AccionDinamicaValidacion" scope="request" name="dinamicoValidacion" validate="true" input="/pages/formdinavalidacion.jsp" > <set-property property="cancellable" value="true" /> <forward name="cancelada" path="/pages/cancelada2.jsp" /> <forward name="datospersonales" path="/pages/datospersonales2.jsp"/> </action> |
Clase Action en el package de acciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package acciones; import org.apache.struts.action.Action; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionForm; import org.apache.struts.validator.DynaValidatorForm; public class AccionDinamicaValidacion extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DynaValidatorForm formularioValidacion = (DynaValidatorForm) form; ActionForward reenvio = null; if (isCancelled(request)) { //log.debug("Se ha pulsado el boton cancel"); return mapping.findForward("cancelada"); } reenvio = mapping.findForward("datospersonales"); return reenvio; } } |
Código de messageResources_es_Es.properties
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #titulo página ejercicios ejercicios = Ejercicios #claves para la página de formulario titulo.dinamicoValidacion = formulario dinámico Validación dinamicoValidacion.imagen = ../imagenes/iconovalidacion.png dinamicoValidacion.imagen.alt = icono validaci&oaccuten dinamicoValidacion.mensaje = Te has registrado correctamente dinamicoValidacion.registro.imagen = ../imagenes/usuario2.png dinamicoValidacion.registro.imagen.alt = icono usuario campo.nombre = el nombre campo.domicilio = el domicilio errors.required={0} es requerido. |
Vemos como en el fichero de propiedades pares, clave valor properties viene “error.required” donde {0} se sustituye por el valor campo domicilio segun el fichero validation.xml en ”
