Por admin | Para la categoría de struts | noticia del 19-08-2009
Para este tutorial partimos del proyecto holamundo creado inicialmente en anteriores posts, esta imagen se corresponde a la ventana de login para el formulario dinámico
Ventana de registro dinámico

Ventana de datospersonales una vez el registro ha sido enviado

Lo primero de todo que es DynaActionForm o mejor ¿para que sirve?, bueno esta clase permite a struts trabajar con los campos de un formulario sin tener que hacer una clase FormBean como en el ejemplo de login struts anteriormente visto.
Pasos que hay que seguir o que es lo que necesitamos, 1 formulario jsp , 2 una configuración en el archivo struts-config.xml y 3 una clase DynaActionForm.java
1 El formulario es como siempre una página web con las etiquetas struts
2 La configuración del archivo struts-config.xml consta de dos pasos
2.1 La configuración del Bean dinámico
aqui se indica las propiedades que va a tener este nuevo bean
2.2 La configuación del la clase Action responsable de tratar el formulario
Se establece la relación con el bean dynaActionForm y la clase que trata los campos del formulariio y los reenvios a las páginas jsp segun se hayan introducido los datos bien o no.
Fichero formulariodinamico.jsp para (para crearlo viene en post de login struts anterior)
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.dinamico"/></h2> <div id="errores"> <html:errors/> </div> <div id="imagen"> <html:img srcKey="dinamico.registro.imagen" titleKey="dinamico.registro.imagen.alt"/> </div> <div id="contenido"> <html:form action="dinamicoAction" 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> |
Clase action dentro del package acciones AccionDinamica.java
Si los campos estan vacíos se mapea la hacia cancelada y si estan completos hacia sa
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 49 50 51 52 53 54 55 56 | package acciones; import org.apache.struts.action.Action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForm; import org.apache.struts.action.DynaActionForm; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionMessage; public class AccionDinamica extends Action { public ActionForward execute ( ActionMapping mapping, ActionForm form ,HttpServletRequest request , HttpServletResponse response ) throws Exception { //creamos un objeto dynamicactionform DynaActionForm formularioDinamico = (DynaActionForm) form; ActionForward reenvio = null; ActionErrors mensajes = new ActionErrors(); if (((String) formularioDinamico.get("nombre")).equals("") ) { mensajes.add("nombre",new ActionMessage("error.login.nombre")); } if (((String) formularioDinamico.get("domicilio")).equals("") ) { mensajes.add("domicio",new ActionMessage("error.login.domicilio")); } //preguntamos si hay errores para hacer el reenvio a la pagina if (mensajes.isEmpty()) { reenvio = mapping.findForward("datospersonales"); } else { reenvio = mapping.findForward("cancelada"); } System.out.print(reenvio.getPath()); return reenvio; } } |
Ventana cancelada2

Página jsp cancelada2.jsp
Página que muestra el mensaje de que la acción ha sido cancelada
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-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/login.jsp" > Volver al formulario login </html:link> </div> </div> <div id="pie"> <p> www.railsymas.com </p> </div> </div> </body> </html:html> |
Página datospersonales.jsp
Esta página recupera los datos introducidos por el usuario mediante la etiqueta
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.dinamico"/></title> <html:base/> <link rel="stylesheet" type="text/css" href="../css/estilo.css" /> </head> <body> <div id="contenedor"> <h2>Bienvenido <bean:write name="dinamicoFormulario" property="nombre"/></h2> <div id="imagen"> <html:img srcKey="dinamico.imagen" titleKey="dinamico.imagen.alt"/> </div> <div id="mensaje"> <bean:message key="dinamico.mensaje"/> <div class="campo"> <bean:write name="dinamicoFormulario" property="nombre"/> </div> <div class="campo"> <bean:write name="dinamicoFormulario" property="domicilio"/> </div> <div class="campo"> <bean:write name="dinamicoFormulario" property="edad"/> </div> </div> <div id="pie"> www.railsymas.com </div> </div> </body> </html:html> |
Declaración del formulario dinámico en el fichero de configuración struts-config.xml
En la definición del form bean vemos como a diferencia del ejemplo del login cuando teníamos un form bean y hacíamos una referencia mediante el atributo “type” a una clase de nuestro proyecto ahora lo hacemos a una clase de struts “org.apache.struts.action.DynaActionForm”. Después declaramos las propiedades del bean mediante su tipo y si queremos un valor inicial se pone el atributo “initial” con un valor
En el ejemplo se dan los valor a los campos nombre = usuarioPepe domicilio = domicilioPepe y se deja sin tocar la edad pero como estaba inicializada a 18 sale por pantalla. Además en la clase action no se mira si esta vacía o no ya que por defecto tiene el valor 18
1 2 3 4 5 6 7 8 | <!-- ================================================ Form Bean Definitions --> <form-bean name="dinamicoFormulario" type="org.apache.struts.action.DynaActionForm" > <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> |
Declaración del reenvío global
Como funciona la aplicación bien hay un index.jsp por defecto en el proyecto esto ya viene asi configurado en el archivo web.xml, “fichero de despliegue”. Se genera entonces la acción Welcome.do en el reenvío global,
1 2 3 4 5 6 7 8 9 | <!-- =========================================== Global Forward Definitions --> <global-forwards> <!-- Default forward to "Welcome" action --> <!-- Demonstrates using index.jsp to forward --> <forward name="welcome" path="/Welcome.do"/> </global-forwards> |
En las definiciones de las acciones en Action Mapping, la acción welcome recogido por el atributo path es mapeada al archivo jsp “formularioDinámico.jsp” por lo que es la primera página que sale por defecto.
Cuando el usuario rellena los campos y pulsa sobre los botones del formulario se procesa la accion “dinamicoAction” que se establece en el fichero struts-config.xml por el atributo path y se mapea en el proyecto por la clase java “acciones.AccionDinámica”.
Se suele poner un package siempre para las clases acciones y otro para las clases bean “pero es gusto del consumidor hacerlo o no”
Cuando la clase AccionDinámica procesa los campos del formulario manda mediante un objeto de la clase actionMapping encontrar la referencia de un objeto mapeado en el struts-config.xml mediante
reenvio = mapping.findForward(“datospersonales”); y mediante el name=”datospersonales obtenimos la página datospersonales.jsp.
De la misma forma si los campos estan vacíos tenemos errores y mensajes.isEmpty() nos devuelve false por lo que nos manda a la página cancelada2.jsp
Una diferencia de este ejemplo con el del formulario de login, a parte de que nos evitamos una clase formbean es que no nos salen los errores en el formulario de recogida de datos, podríamos resolverlo con objetos de la clase AcctionMessages pero existe otra variante del DynaActionForm que si permite de una forma sencilla la validación de los campos llamada DynaActionFormValidator y lo veremos en otro posts.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <!-- =========================================== 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/formulariodinamico.jsp"/> <action path="/dinamicoAction" type="acciones.AccionDinamica" scope="request" name="dinamicoFormulario" input="/pages/formulariodinamico.jsp"> <set-property property="cancellable" value="true" /> <forward name="cancelada" path="/pages/cancelada2.jsp" /> <forward name="datospersonales" path="/pages/datospersonales.jsp" /> </action> |
claves para el archivo de propropiedades .properties como siempre el formato es clave=valor
1 2 3 4 5 6 7 8 |
#claves para dinamico
dinamico.mensaje = Te has registrado correctamente
dinamico.imagen = ../imagenes/base.jpg
dinamico.imagen.alt = imagen icono registro
dinamico.registro.imagen = ../imagenes/usuario2.png
dinamico.registro.imagen.alt = icono usuario
titulo.dinamico = Registro dinámico |

Muy buen post! En minutos implemente formularios dinamicos!
Saludos!