formulario DynaActionForm Struts Eclipse

1

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

formdina

Ventana de datospersonales una vez el registro ha sido enviado

satisdinamico

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

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 si estan bien los datos se mada a la pagina datospersonales,jsp por que en la clase AccionDinámima teníamos
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&aacute;mico

Comentarios (1)

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


Comentarios cerrados automáticamente al pasar más de un año