53
UNIVERSIDAD AUTONOMA DE CHIAPAS FACULTAD DE CONTADURIA Y ADMINISTRACIÓN LICENCIATURA EN SISTEMAS COMPUTACIONALES. APLICACIONES WEB M.C FELIPE ANTONIO ROMAN ALBORES STRUTS-TAGS EDUARDO PÉREZ RUÍZ 1

Practica Struts

Embed Size (px)

Citation preview

Page 1: Practica Struts

UNIVERSIDAD AUTONOMA DE CHIAPAS

FACULTAD DE CONTADURIA Y ADMINISTRACIÓN

LICENCIATURA EN SISTEMAS COMPUTACIONALES.

APLICACIONES WEB

M.C FELIPE ANTONIO ROMAN ALBORES

STRUTS-TAGS

EDUARDO PÉREZ RUÍZ

TUXTLA GUTIERREZ CHIAPAS, A 01 DE OCTUBRE DEL 2013.

1

Page 2: Practica Struts

ContenidoRESUMEN...........................................................................................................................................4

INCLUDE.............................................................................................................................................5LABEL................................................................................................................................................10Action (Acciones)..............................................................................................................................11ACTIONERROR..................................................................................................................................12ACTIONMESSAGE.............................................................................................................................14FILE...................................................................................................................................................15FORM...............................................................................................................................................17COMPONENT....................................................................................................................................18HEAD................................................................................................................................................18HIDDEN............................................................................................................................................18I18N..................................................................................................................................................19IF-ELSEIF-ELSE...................................................................................................................................19Password..........................................................................................................................................22Property...........................................................................................................................................22Push.................................................................................................................................................23Param...............................................................................................................................................24Radio................................................................................................................................................24Reset................................................................................................................................................25CHECKBOXLIST.................................................................................................................................25COMBOBOX......................................................................................................................................28DOUBLESELECT.................................................................................................................................30DATE.................................................................................................................................................31Select................................................................................................................................................33Set....................................................................................................................................................34Submit..............................................................................................................................................34Text..................................................................................................................................................35TextArea...........................................................................................................................................37TextField...........................................................................................................................................37Struts Tag Generator........................................................................................................................39INPUTTRANSFERSELECT:..................................................................................................................41ITERATOR:........................................................................................................................................42MERGE:............................................................................................................................................44OPTGROUP:......................................................................................................................................46

CONCLUSION…………………………………………………………………………………………………………………………….. 48

REFERENCIAS…………………………………………………………………………………………………………………………..49

2

Page 3: Practica Struts

Tabla de Figuras

Fig. 1 Implementación del INCLUDE..................................................................................................8

Fig. 2 configuraciones del strutx.xml, index.jsp, tags.jsp y la clase.jav.......................................9

Fig. 3 configuracion de index.jsp y struts.xml...........................................................................11

Fig. 4 Label generado de la configuración anterior..................................................................11

Fig. 5 configuracion de los 3 componentes(.xml, .jsp y .java)...................................................12

Fig. 6 Ejecución con éxito del ACTION......................................................................................12

Fig. 7 configuración de los 3 elementos principales para el ACTIONERROR.............................13

Fig. 8 ACTIONERROR (no concluido).........................................................................................13

Fig. 9 Configuracion final de los elementos del ACTIONMESAGE.............................................14

Fig. 10 ACTIONMESSAGE en ejecucion (no concluido)............................................................15

Fig. 11 Configuracion de los componentes y ejecución del tag FIELD.......................................17

Fig. 12 Estructura e implementación del HEAD........................................................................18

Fig. 13 Estructura del HIDDEN..................................................................................................19

Fig. 14 i18n............................................................................................................................19

Fig. 15 Configuracion de los componentes del Optiontransferselect.......................................21

Fig. 16 Accion.java y resultado.jsp para el tag PROPERTY.......................................................23

Fig. 17 Estructura del RESET.....................................................................................................25

Fig. 18 CHECKBOXLIST en ejecucion.........................................................................................28

Fig. 18 COMBOBOX en ejecución.............................................................................................30

Fig. 19 SELECT en ejecución......................................................................................................33

Fig. 20 función SET en ejecución..............................................................................................34

Fig. 21 Ejecución del elemento SUBMIT...................................................................................35

3

Page 4: Practica Struts

RESUMENHoy en día es de gran importancia saber que para el desarrollo de

aplicaciones web, se necesita que estas puedan ser creadas de una manera sápida y por supuesto eficiente, es ahí donde entra lo que hoy en día es conocido como STRUTS2 que no es más que un framework que nos ayuda en la realización de aplicaciones web de forma más sencilla, además struts2 hace uso de un modelo especial llamado Modelo Vista Controlador, que para ser sincero al principio no entendía de su significado pero al realizar esta práctica me ayudo ya que me base de distintas fuente en donde mencionaban este modelo, y comprendí que este modelo hace una separación entre los componentes para la re[presentación de la información y la interfaz del usuario permitiéndonos así poder tener un mejor control de las acciones a realizar para que sean vistas desde la interfaz de usuario; lo primero que se debe hacer es configurar los struts mediante archivos XML, ya que son los que se encargan de hacer la mayor parte del trabajo.

Pero struts2 no trabaja solo posee varia herramientas y etiquetas o Tags, con los que podemos trabajar y que es lo que habla esta práctica, algunas resultaron fácil de implementar y de comprobar su resultado, otras no se logró obtener el resultado deseado, además algunos tags como el i18n que me resulto difícil entenderle pero investigando un poco más encontré que son interceptores que nos ayudan o nos brindan un soporte de idioma para nuestras aplicaciones; además de ese elemento hubieron más que al igual no entendía el concepto y peor aún como implementarlos, aunque fueron pocos pues la mayoría si se pudo comprobar y examinar los resultados.

4

Page 5: Practica Struts

INCLUDE.

Función:

Parecido a action con el parámetro executeResult, pero, a diferencia de este, permite incluir cualquier recurso. Como el include de JSP también se le pueden pasar parámetros para que sea dinámico con etiquetas param, pero estos valores no se acceden como propiedades de ValueStack, sino como parámetros de la petición.

Sintaxis:

5

INDEX.JSP

%-- Document : index Created on : 28/09/2013, 12:22:01 PM Author : MARIO ARTURO--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%><!DOCTYPE html><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <%@ taglib uri="/struts-tags" prefix="s"%> <s:include value="tags-include.jsp"> <s:param name="web">http://localHost.com</s:param> </s:include> </body></html>

Page 6: Practica Struts

6

TAGS-INCLUDE.JSP

<%-- Document : tags-include Created on : 28/09/2013, 06:43:24 PM Author : MARIO ARTURO--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%><!DOCTYPE html><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>Bienvenido a ${param.web}</h1> </body></html>

STRUTS.XML

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"><struts> <package name="mi-paquete" extends="struts-default"> <action name="*" class="ejemTags">

<result name="success"> index.jsp </result> </action> <action name="Hola" class="ejemTags"> <result name="success">tags-include.jsp</result> </action> </package></struts>

Page 7: Practica Struts

7

EJEMTAGS.JAVA

import static com.opensymphony.xwork2.Action.SUCCESS;import com.opensymphony.xwork2.ActionSupport;//import org.apache.struts2.views.jsp.IncludeTag;

public class ejemTags extends ActionSupport { private String web; public String getContenido() { return web; } public String execute() throws Exception { web="http://localHost.com"; return SUCCESS; }}

WEB.XML<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> <select-class>org.apache.struts2.views.jsp.ui.InputTransferSelectTag</select-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <error-page> <error-code>404</error-code> <location>/construccion.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/index.jsp</location> </error-page>

Page 8: Practica Struts

A continuación unas impresiones de pantalla de la realización de este TAGS.

Fig. 1 Implementación del INCLUDESTRUTS

INDEX.JSP

8

Page 9: Practica Struts

TAGS.JSP

CLASE JAVA

Fig. 2 configuraciones del strutx.xml, index.jsp, tags.jsp y la clase.jav

9

Page 10: Practica Struts

STRUTS DEL LABEL

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts>

<constant name="struts.enable.DynamicMethodInvocation" value="false" />

<constant name="struts.devMode" value="true" /><constant name="struts.custom.i18n.resources"

value="ApplicationResources" /><package name="default" namespace="/" extends="struts-

default"><action name="Label" class="MARIO ARTURO.LabelTag">

<result name="success">index.jsp</result></action>

LABEL.

Función:

Sirve para crear etiquetas como el HTML pero a diferencia que se puede implementar dentro de un formulario.

Sintaxis:

10

INDEX DEL LABEL

<%@ 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 prefix="s" uri="/struts-tags"%><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> label1:<s:label value="NOMBRE" />

Page 11: Practica Struts

Fig. 3 configuracion de index.jsp y struts.xml

Fig. 4 Label generado de la configuración anterior.

Action (Acciones)

<action name="Nombre_Accion" class="Paquete.Nombre_Clase"> <result name="error">/pagina_error.jsp</result> <result name="success">/pagina_exito.jsp</result></action>

Las acciones son las encargadas de definir cual será la clase que se encargará de procesar la petición solicitada y cual será la respuesta dependiendo del resultado. Estas acciones se registran dentro de struts.xml.

La estructura básica de una acción es la siguiente:

11

Page 12: Practica Struts

Fig. 5 configuracion de los 3 componentes(.xml, .jsp y .java)

En ejecución:

Fig. 6 Ejecución con éxito del ACTION

ACTIONERROR Muestra los errores que se produjeron en las acciones, si es que existen. Podemos añadir errores utilizando el método addActionError(String error) de la interfaz ValidationAware, que ActionSupport implementa. Los métodos y propiedades de ValidationAware también estarán disponibles en la vista, por lo que es posible en su lugar comprobar si existen errores con el método hasActionErrors() e iterar directamente sobre la colección actionErrors.

xxxx.java

12

1.2. import com.opensymphony.xwork2.ActionSupport;3.4. @SuppressWarnings("serial")5. public class Accion extends ActionSupport {6.     public String execute() {7.         addActionError("Oh dios mío, ¡un error!");8.         return ERROR;9.     }

10. }

Page 13: Practica Struts

xxxx.jsp

1. <%@ taglib uri="/struts-tags" prefix="s"%>  2.   3. <html>  4. <body>  5. <s:actionerror />  6. </body>  7. </html> 

Fig. 7 configuración de los 3 elementos principales para el ACTIONERROR

En ejecución (no terminado)

Fig. 8 ACTIONERROR (no concluido)

13

Page 14: Practica Struts

ACTIONMESSAGESimilar a actionerror, pero en lugar de errores en la acción sirve para

mostrar mensajes de la acción, los cuales añadimos utilizando el métodoaddActionMessage(String mensaje) de la interfaz ValidationAware. Como el anterior, también podríamos utilizar el método hasActionMessages() para comprobar la existencia de mensajes e iterar sobre la colección de strings actionMessages.org.apache.struts2.views.jsp.ui.ActionMessageTag

Accion.java

1. import com.opensymphony.xwork2.ActionSupport;  2.   3. @SuppressWarnings("serial")  4. public class Accion extends ActionSupport {  5.     public String execute() {  6.         addActionMessage("Tengo un mensaje para usted.");  7.         return SUCCESS;  8.     }  9. }  

resultado.jsp

1. <%@ taglib uri="/struts-tags" prefix="s"%>  2.   3. <html>  4. <body>  5. <s:actionmessage/>  6. </body>  7. </html>  

14

Page 15: Practica Struts

Fig. 9 Configuracion final de los elementos del ACTIONMESAGE

En ejecución (no terminado)

Fig. 10 ACTIONMESSAGE en ejecucion (no concluido)

FILE

Muestra un campo file de HTML. Para facilitarnos la vida podemos aprovechar el interceptor fileUpload que se encuentra en la selección de interceptores por defecto (defaultStack) y que funciona de forma parecida al interceptor param. Basta crear setters y getters en la acción para las nuevas propiedades nombre (el archivo en si), nombreContentType (el tipo MIME del archivo subido) o nombreFileName (el nombre del archivo subido) para tener acceso a estos valores en la acción.org.apache.struts2.views.jsp.ui.FileTagaccept: atributo del mismo nombre de HTML que permite indicar los tipos MIME que acepta el campo.

Index.jsp

15

Page 16: Practica Struts

Accion.java

16

Page 17: Practica Struts

Resultado.jsp

17

Page 18: Practica Struts

Fig. 11 Configuracion de los componentes y ejecución del tag FIELD

FORM Crea un elemento form de HTML.org.apache.struts2.views.jsp.ui.FormTagaction: Acción a la que se enviará la petición con los datos del formulario. También se puede enlazar otras páginas o servlets. Si no utilizamos el atributo para especificar el destino se utiliza la misma página del formulario.namespace: Espacio de nombres al que pertenece la acción a la que se enviará la petición. Por defecto se utiliza el espacio de nombres actual.validate: Si queremos validar los campos del formulario antes de enviarlos.

COMPONENTUtilizado para crear nuestras propias etiquetas sin tener que recurrir a la API de etiquetas de JSP.org.apache.struts2.views.jsp.ui.ComponentTag

HEADEtiqueta auxiliar que se coloca dentro de la etiqueta head de HTML y se encarga de generar distintos elementos necesarios para otras etiquetas, como las etiquetas para la carga de hojas de estilo o scripts.org.apache.struts2.views.jsp.ui.HeadTag

18

Page 19: Practica Struts

Fig. 12 Estructura e implementación del HEAD

HIDDENCrea un campo oculto.org.apache.struts2.views.jsp.ui.HiddenTag

Fig. 13 Estructura del HIDDEN

I18NCarga un archivo de recursos adicional con la traducción de nuestros mensajes y los coloca en ValueStack de forma que puedan ser accedidos fácilmente por el código que se encuentre dentro de la etiqueta.

org.apache.struts2.views.jsp.I18nTag

name (requerido): Nombre del ResourceBundle a cargar.

19

Page 20: Practica Struts

Fig. 14 i18n

IF-ELSEIF-ELSELa típica sentencia condicional.org.apache.struts2.views.jsp.IfTagorg.apache.struts2.views.jsp.ElseIfTagorg.apache.struts2.views.jsp.ElseTag

test (requerido para if y elseif): la expresión a comprobar

Optiontransferselect

Crea un componente consistente en dos selects cuyos elementos pueden traspasarse de uno a otro.Ejemplo: index

20

Page 21: Practica Struts

Optiontransfer.jsp

Optiontransfer.java

21

Page 22: Practica Struts

Struts

Fig. 15 Configuracion de los componentes del Optiontransferselect

Password

Crea un elemento password de HTML.

Ejemplo:resultado.jsp

PropertyMuestra una propiedad de ValueStack u otro objeto de ActionContext.Ejemplo:

22

Page 23: Practica Struts

Accion.java

resultado.jsp

Fig. 16 Accion.java y resultado.jsp para el tag PROPERTY

PushAñade el valor especificado a lo alto de la pila.Ejemplo:

23

Page 24: Practica Struts

RadioTag.jsp

Strust

Param

Utilizada para añadir parámetros a otras etiquetas.

RadioCrea un conjunto de radio buttons HTML.

24

Page 25: Practica Struts

Accion.java

1. import com.opensymphony.xwork2.ActionSupport;  2. import java.util.List;  3. import java.util.ArrayList;  4.   5. @SuppressWarnings("serial")  6. public class Accion extends ActionSupport {  7.     private List<String> lenguajes;  8.   9.     public List<String> getLenguajes() {  10.        return lenguajes;  11.    }  12.  13.    public String execute() {  14.        lenguajes = new ArrayList<String>();  15.        lenguajes.add("Python");  16.        lenguajes.add("Java");  17.        lenguajes.add("Ruby");  18.        lenguajes.add("C#");  19.        lenguajes.add("C++");  20.        lenguajes.add("Lisp");  21.        return SUCCESS;  22.    }  23.}  

Resultado.jsp

1. <%@ taglib uri="/struts-tags" prefix="s"%>  2.   3. <html>  4. <body>  5. <s:form>  6.     <s:radio label="Selecciona tu lenguaje preferido" list="lenguajes" />  7.     <s:submit value="Enviar" />  8. </s:form>  9. </body>  10.</html>  

Reset

Crea un botón que borra los datos introducidos en el formulario.

resultado.jsp

1. <%@ taglib uri="/struts-tags" prefix="s"%>  2.   3. <html>  4. <body>  5.   

25

Page 26: Practica Struts

6. <s:form action="Otro">  7.     <s:textfield label="Nombre" />  8.     <s:password label="Contraseña" />  9.     <s:reset value="Borrar" />  10.    <s:submit value="Enviar" />  11.</s:form>  12.  13.</body>  14.</html>  

Fig. 17 Estructura del RESET

CHECKBOXLISTCrea una lista de checkboxes relacionados (todos con el mismo atributo

name). Esto implica que el valor del elemento no será un booleano indicando si está marcado o no, como en el caso de checkbox, sino una lista con los valores marcados.SINTAXIS

checklist.jsp

Struts.xml

26

Page 27: Practica Struts

Hola.java

27

Page 28: Practica Struts

Código en ejecución:

Fig. 18 CHECKBOXLIST en ejecucion

COMBOBOXCrea una combinación de select y caja de texto. El valor de la caja de texto

se auto rellena según el elemento seleccionado en el select.emptyOption: Indica si queremos añadir una opción vacía.

combobox.jsp

Struts.xml

28

Page 29: Practica Struts

Hola.java

Código en ejecución:

29

Page 30: Practica Struts

Fig. 18 COMBOBOX en ejecución

DOUBLESELECTCrea dos elementos select HTML, con el segundo de ellos modificando sus valores dependiendo del valor seleccionado en el primero.doubleList (requerido): Lista con los valores que tendrá el segundo select.doubleMultiple: Determina si en el segundo select se pueden seleccionar varios valores o solo uno.doubleName (requerido): Nombre del elemento.list (requerido): Lista con los valores que tendrá el primer select.

Resultado.jsp

30

Page 31: Practica Struts

Artista.java

Acción.java

DATEPermite mostrar una fecha almacenada en una cierta variable indicando opcionalmente el formato a utilizar.

31

Page 32: Practica Struts

format: Formato a utilizar para mostrar la fecha. Si queremos usar siempre el mismo formato podemos crear un archivo properties con una entrada struts.date.format. Por defecto se utiliza el formato DateFormat.MEDIUM.Date.jsp

Acción.java

32

Page 33: Practica Struts

SelectEsta función nos sirve para seleccionar datos por medio de un listado desplegable que al darle click sobre algún campo este selecciona y envía la información seleccionada.

Sintaxis: <s:select label="What's your favor search engine"headerKey="-1" headerValue="Select Search Engines"list="searchEngine"name="yourSearchEngine" />

33

Page 34: Practica Struts

Código del select

Función Select en funcionamiento

Fig. 19 SELECT en ejecución.

SetLa función set nos sirve para colocar un dato mediante nosotros lo definamos dentro del código de la aplicación.

Código de la función set

Funcionamiento de set

34

Page 35: Practica Struts

Fig. 20 función SET en ejecución.

SubmitEsta función nos sirve para borrar todos los datos ingresados en un cuadro

de texto o bien enviar los datos de un formulario.

Código de la función

Funcionamiento de Submit

35

Page 36: Practica Struts

Fig. 21 Ejecución del elemento SUBMIT

TextEsta función sirve para imprimir datos en forma de texto sin formato o bien

predefiniéndole un formato mediante el código.

Código de la función Text

Funcionamiento del Text

36

Page 37: Practica Struts

TextAreaEsta función nos sirve para imprimir datos en forma de texto pero en un

campo de texto de varias columnas y filas que nosotros podamos definir el ancho y largo del cuadro de texto que se verá en pantalla.

Código de la función TextArea

Funcionamiento del TextArea

37

Page 38: Practica Struts

TextFieldEsta función permite ingresar datos de longitud que se le puede definir y lo

que se le ingrese poder guardarlo y enviarlo, esto se utiliza a la hora de hacer un registro de datos mediante un formulario.

Código de la función TextField

Funcionamiento del TextField

38

Page 39: Practica Struts

Struts Tag GeneratorEsta librería sirve para ordenar una serie de palabras, declaradas en la instrucción Generator, como se logra apreciar en la primera imagen

Código de cómo funciona la Librería Generator en Struts2

39

Page 40: Practica Struts

Struts Tag Url

Código de cómo funciona la Librería Url en Struts2

Esta librería sirve para crear un link, o redireccionar de una manera diferente el acceso a una página.

40

Page 41: Practica Struts

INPUTTRANSFERSELECT:Crea un componente consistente en un select de selección múltiple, un

campo de texto y distintos botones que permiten añadir, eliminar y ordenar los valores.

INDEX.

Struts.

41

Page 42: Practica Struts

Lib2.java.

ITERATOR:Para iterar sobre colecciones. En cada iteración el objeto recuperado se coloca en ValueStack para poder acceder a sus propiedades fácilmente.

org.apache.struts2.views.jsp.IteratorTag

Status: Crea una instancia de IteratorStatus con el nombre indicado. Este objeto expone algunas propiedades muy útiles como index (índice del elemento actual), first (booleano que indica si es el primero elemento), even (booleano que indica si es impar), last (booleano que indica si es el último elemento) u odd (booleano que indica si es par).

42

Page 43: Practica Struts

Index

.xml

.java

43

Page 44: Practica Struts

MERGE:Crea un nuevo iterador unión de los distintos iteradores pasados como

parámetro mediante etiquetas param.

Index.jsp

struts.xml

44

Page 45: Practica Struts

Merge.java

45

Page 46: Practica Struts

OPTGROUP:Crea un nuevo elemento HTML optgroup (un grupo de opciones para un elemento select).

Index.jsp

Struts.xml

46

Page 47: Practica Struts

.java

47

Page 48: Practica Struts

CONCLUSION

Como conclusión a la que llego al haber realizado este [practica es que usar struts2 y sus componentes resultan al parecer mucho más sencillo claro hay algunas excepciones, pero la mayor parte struts2 nos brinda más facilidad en la elaboración del aplicaciones web, sin tener que esforzarse demasiado además de que hoy en día usar este framework resulta estar a la vanguardia pues como mencione en el resumen hace uso del Modelo Vista Controlador(MVC) que como mencione nos proporciona una mayor agilidad en cuanto al manejo de los datos separando cada elemento que lo conforma, es decir los XML, los struts y las clases, en donde se puede trabajar separadamente prestando principal atención en el struts.xml pues es ahí donde se realiza la mayor parte de las instrucciones.

Para finalizar no debemos de dejar fuera cada elemento que forma parte este framework pues todos son de gran importancia y es necesario aprender a usarlos pues parte de muchos ellos se emplean en las aplicaciones web’s.

48

Page 49: Practica Struts

ReferenciasAlex. (Junio de 2011). Tutoriales de Programacion Java. Obtenido de Tutoriales de Programacion

Java: http://www.javatutoriales.com/2011/06/struts-2-parte-1-configuracion.html

Raúl González Duque. (Abril de 2004). Mundo geek. Obtenido de Mundo geek : http://mundogeek.net/archivos/2009/02/13/etiquetas-struts-2/

49