Struts DispatchAction eclipse

5

Por admin | Para la categoría de struts | noticia del 18-09-2009

Tutorial de struts

DispatchAction, la clase DispatchAction permite múltiples operaciones en una sola clase, la idea es no tener que hacer para cada acción una clase action distinta que procese una petición concreta.

Si tenemos en un formulario por ejemplo con acceso a una base de datos de libros, puede que tengamos diversos botones en esa vista, para poder acceder al listado o bien acceder a otro menú donde podemos editar determinados campos del registro o calcular el volumen de ventas. Si utilizamos la clase action tendríamos que hacer que cada una de esas acciones de la vista fuese a una clase distinta que la procesase.

Para la utilización de la clase DispatchAction, necesitamos crear una clase que amplie y añada un método para cada función que se necesite.

Habíamos visto los links en struts con el atributo pages apuntando hacia una página jsp en la página de ejercicios incluimos un nuevo enlace hacia el formulario para dispatchaction pero en este caso utilizamos el atributo “action” de la etiqueta “hml:link”. Esto permite hacer un enlace a la accion que a su vez será reenviada a una página jsp.

Código para la configuración del archivo struts-config.xml

1
2
3
 <action        
        path="/dispatchAccion"
        forward="/pages/formulariodispatch.jsp" />

Código que añadimos al archivo ejercicios.jsp

1
2
3
4
 
   <div class="enlace">
   <html:link action="/dinamicolibro"> 4) formulario  dispatchAction  </html:link>
   </div>

Imagen para Ejercicios.jsp

ejercicios2

Declaración del formulario dinámico en el fichero struts-config.xml

1
2
3
4
5
6
7
8
9
10
11
 
   <!-- ================================ Form Bean Definitions --->
 
 
   <form-bean name="dinamicolibro" type="org.apache.struts.validator.DynaValidatorForm">    
 
    <form-property name="titulo" type="java.lang.String" />
    <form-property name="autor"  type="java.lang.String" />    
    <form-property name="cambio" type="java.lang.String" />
 
    </form-bean>

El bean dinámico tiene dos propiedades titulo y autor que se comprueban que existan

Configuración del action para el fichero de recogida de datos del libro el action “dinamicolibro”

el nombre de la accion viene determinada por el atributo path dinamico libro
la clase de accion viene determinada por el atributo type
el atributo scope determina el ámbito en este caso de petición
el atributo name hace referencia al nombre del bean al que esta asociada la accion
el atributo validate a true indica que se va a establecer una validación de los campos del formulario dinámico
el atributo input indica cual es el formulario de entrada para desarrollar la acción y en caso de validación cual es
la jsp que se muestra.
los forwards para realizar los reenvíos correspondientes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   <action        
        path="/dispatchAccion"
        forward="/pages/formulariodispatch.jsp" />  
 
        <action         
        path="/dinamicolibro"
        type="acciones.AccionDispatch"
        scope="request"
        name="dinamicolibro"
        validate="true"
        input ="/pages/formulariodispatch.jsp"
        parameter="method" >         
 
        <set-property property="cancellable" value="true" /> 
 
        <forward name="cancelada" path="/pages/cancelada2.jsp"/> 
        <forward name="editarlibros" path="/pages/edicion.jsp"/>        
        </action>

configuración del action en el struts-config.xml action “dinamicolibro2″

1
2
3
4
5
6
7
8
9
10
11
12
13
  <action 
 
         path="/dinamicolibro2"
         type="acciones.AccionDispatch"
         scope="request"
         name="dinamicolibro"
         validate="false"
         parameter="method">
 
         <set-property property="cancellable" value="true"/>         
         <forward name="cancelada" path="/pages/cancelada2.jsp"/>
         <forward name="datoslibro" path="/pages/datoslibros.jsp"/>
         </action>

Como estamos haciendo un formulario dinámico y lo queremos validar, tenemos que crear las siguientes reglas
en el fichero validation.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 <formset>
       <form name="dinamicolibro">
       <field        
        property="titulo"
        depends="required">
 
        <arg key="libro.titulo" />
      </field>
 
      <field
        property="autor" 
        depends="required">
        <arg key="libro.autor" />
      </field>    
      </form>
 
    </formset>

el nombre del formulario en form name=”dinamicolibro” es el mismo que el name
de la configuración del bean declarado en el struts-config.xml

Imagen del fichero formulariodispatch.jsp, a la introducción de datos del libro

libros

Imagen del fichero formulariodispatch.jsp

libro1

Imagen resultado del envío de los datos

libros2

Introducimos titulo2 en el campo de titulo

libros3

resultado final

libros4

import org.apache.struts.actions.DispatchAction;

Código del fichero action de la clase dispatchAction importamos import org.apache.struts.actions.DispatchAction,
esa línea de código solamente con el proyecto de struts para la versión 1.3.10 que es con la que se estan haciendo todos los ejemplos da error ya que el proyecto en blanco no la reconoce. Para solventar este problema, tenemos que importar del directorio donde descomprimimos el proyecto struts, el fichero jar lstruts-extras-1.3.10.jar dentro del fichero lib del proyecto web eclipse.

“lib/struts-extras-1.3.10.jar”,

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
  package acciones;
 
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.validator.DynaValidatorForm;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
 
 
public class AccionDispatch extends DispatchAction {
 
 
	private ActionForward envio;
	private DynaValidatorForm formulario;
	private String titulo;
	private String autor;
 
 
	//creamos los métodos que responden a las acciones
	public  ActionForward crear ( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws Exception
	{
 
		//si hemos cancelado la ejecución mandamos al jsp de cancelación
		if (isCancelled(request))
		{
			envio = mapping.findForward("cancelada");
		}
		else
		{   
			//recuperamos los datos del formulario bean dinámico Validator
		    formulario = (DynaValidatorForm) form;
 
		    titulo = formulario.getString("titulo");
		    autor = formulario.getString("autor"); 
 
		    System.out.println(titulo);
 
			envio = mapping.findForward("editarlibros");
		}
 
		return envio;
 
	}
 
	public ActionForward EditarTitulo (ActionMapping mapping, ActionForm form, HttpServletRequest resquest, HttpServletResponse response) throws Exception
	{
 
		//recuperamos los datos del formulario bean dinámico Validator
	    formulario = (DynaValidatorForm) form;
 
	    String cadena = "Se ha cambiado "+this.titulo+" por "+formulario.getString("titulo");
 
	    formulario.set("cambio",cadena);
 
	    //recargamos el formulario con el valor guardado
	     formulario.set("autor",this.autor);
 
 
		 envio = mapping.findForward("datoslibro");
 
		 return envio;
	}
 
	public ActionForward EditarAutor (ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		//recuperamos los datos del formulario bean dinámico Validator
 
		//recuperamos los datos del formulario bean dinámico Validator
	    formulario = (DynaValidatorForm) form;
 
	    String cadena = "Se ha cambiado "+this.autor+" por "+formulario.getString("autor");
 
 
 
	    formulario.set("cambio",cadena);
 
	    //recargamos el formulario con el 
	    formulario.set("titulo",this.titulo);
 
 
	    envio = mapping.findForward("datoslibro");	
 
	    return envio;
 
	}
 
 
}

código fuente del fichero del fichero formulariodispatch.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
49
 
<%@ 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.libro"/></title>
<html:base/>
<link rel="stylesheet" type="text/css" href="../css/estilo.css" />
</head>
<body>
<div id="contenedor">
<h2><bean:message key="titulo.libro"/></h2>
 
<div id="errores">
  <html:errors/> 
</div>
 <div id="imagen">
  <html:img srcKey="libro.imagen" titleKey="libro.imagen.alt"/>
  </div>
 
<div id="contenido">
<html:form action="dinamicolibro" focus="nombre" styleId="formulario" method="post">
 <div class="campo"> 
  <bean:message key="libro.titulo"/>
  <html:text property="titulo" />
  </div> 
 
  <div class="campo">
  <bean:message key="libro.autor"/>
  <html:text property="autor" />
  </div>
 
  <html:hidden property="method" value="crear"/>
 
  <html:submit styleClass="boton" value="enviar"/>
  <html:cancel styleClass="boton" value="cancelar"/>
  <html:reset  styleClass="boton" value="borrar"/> 
</html:form>
</div>
<div id="pie">
    <p> www.railsymas.com </p>
</div>
</div> 
 
</body>
</html:html>

Código fuente del fichero edicion.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
49
50
51
52
53
54
55
56
57
58
59
<%@ 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="editar.titular"/></title>
<html:base/>
 <link rel="stylesheet" type="text/css" href="../css/estilo.css" />
</head>
<body>
  <div id="contenedor">
  <h2> <bean:message key="editar.titular"/></h2>
 
  <div id="imagen">
  <html:img srcKey="editar.imagen" titleKey="editar.imagen.alt"/>
  </div>
 
  <div id="mensaje">
  <bean:message key="editar.mensaje"/>
 
  <html:form action="dinamicolibro2" styleClass="formulario" method="post"> 
  <div class="campo">
  <bean:message key="editar.valor" />
  <br/> 
  <bean:write name="dinamicolibro" property="titulo"/>
  </div>
  <html:text property="titulo"/>     
 
  <html:hidden property="method" value="EditarTitulo"/>
  <html:submit  styleClass="boton"  value="editar"/>
 
  </html:form>
 
  <html:form action="dinamicolibro2" styleClass="formulario" method="post">
  <div class="campo" class="flotaizquierda">
 
  <bean:message key="editar.valor" />
  <br/>
  <bean:write name="dinamicolibro" property="autor"/>
  </div>
 
  <html:text property="autor"/>
 
  <html:hidden property="method" value="EditarAutor"/>
 
  <html:submit  styleClass="boton" value="editar"/>
 
  </html:form> 
  </div>
 
  <div id="pie">
  <p>www.railsymas.com </p>
  </div> 
 
 </div>
</body>
</html:html>

Código fuente del fichero datoslibros.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="resultado.mensaje"/></title>
<html:base/>
 <link rel="stylesheet" type="text/css" href="../css/estilo.css" />
</head>
<body>
  <div id="contenedor">
  <h2><bean:message key="resultado.mensaje"/></h2>
 
  <div id="imagen">
  <html:img srcKey="resultado.imagen" titleKey="resultado.imagen.alt"/>
  </div>
  <div id="mensaje">
  <bean:message key="resultado.mensaje"/>
 
  <div class="campo">
  <bean:write name="dinamicolibro" property="titulo"/>
  </div>
  <div class="campo">
  <bean:write name="dinamicolibro" property="autor"/>
  </div>
  <div class="campo">
  <bean:write name="dinamicolibro" property="cambio"/>
  </div>  
  </div>
 <div id="pie">
 <p>www.railsymas.com </p>
 </div> 
 
</div>
</body>
</html:html>

Comentarios (5)

Excelente Tutorial…

cabe destacar la implementacion de las acciones en el JSP , deve haber un form para cada action dentro del cual se define un

//el property(nombre) se especifica en Struts-config.xml
//como el atributo “parameter” en el tag del action
//y claro el nombre de nuestra accion dentro del Action deve ser igual a la definida en

La ventaja de dispatchAction, radica en poder recoger múltiples acciones en una misma clase, se puede aprovechar como comentas un form para cada cada acción y también de una, manera más profesional, que no la he implementado, dado que estos ejemplos tienen un carácter educador, donde lo importante es el concepto. La forma o manera a la que me refiero, sería con javascript y en un mismo y único form capturar y dintiguir, cual es el botón pulsado para componer dinámicamente por javascript el action del formulario y así ejecutar una acción, “método” de la clase dispatchaction, sería una forma más eficiente.

Muchas gracias por tu aporte .. Pacmann, animo a todos los que posean conocimientos sobre java y struts que hagan sus propios tutoriales, aportando conocimientos a la comunidad de internet.

Felicidades gran tutorial….

exelente tutorial. justamente lo que buscaba, gracias por comportir conocimiento con las personas que necesitamos

Buen tuto, gracias por tus aportes

Escribe un comentario