Struts
El Patrn de Diseo MVC
Struts es un marco (framework) para crear aplicaciones Web que implementa el
patrn de diseo Modelo Vista Controlador (MVC).
Un marco es una aplicacin semicompleta, reutilizable que puede especializarse
para construir aplicaciones. Le proveen al desarrollador de una estructura reutilizable
que sirva como cimiento para construir aplicaciones especficas. Un marco provee a
los desarrolladores de un conjunto de componentes dorsales que tienen las
siguientes caractersticas:
Modelo
Vista
Controlador
Descripcin
ITSON
206
Struts
ITSON
Tema 6
Struts
207
El Controlador
El Controlador del marco Struts es la componente medular de todas las aplicaciones
Web que usan Struts. Se implementa usando un servlet y un conjunto de instancias
de clases llamadas clases de accin. Un servlet es una componente que interacta
con los clientes Web mediante el modelo solicitud - respuesta. En el caso del servlet
ActionServlet, su trabajo es recibir las solicitudes de los clientes y seleccionar la
clase de accin que procesar la solicitud. Cuando la clase de accin termina su
procesamiento le regresa al servlet una clave que el servlet utiliza para determinar la
vista que presentar los resultados obtenidos por la clase de accin.
ActionServlet
El servlet del Controlador de Struts es una instancia de la clase
org.apache.struts.action.ActionServlet. La creacin de la instancia de
esta clase es responsabilidad del contenedor de JSP. La informacin que requiere
este servlet para hacer su trabajo se la suministraremos en un archivo de
configuracin XML, llamado web.xml. Cada aplicacin Web debe tener un archivo
web.xml. Por ejemplo, el archivo web.xml de la aplicacin Web
AmanteMusicaWeb es el siguiente:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns=http://java.sun.com/xml/ns/j2ee
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
ITSON
208
Struts
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<jsp-config>
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-nested.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
ITSON
Tema 6
Struts
209
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
Establece que el servlet interceptar todos las solicitudes cuya URL tenga la
extensin ".do", les quitar la extensin y usar la cadena restante como la ruta,
relativa al contexto, de la clase de accin a ejecutar.
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
Clases de Accin
Como ya se mencion antes, las clases de accin son las encargadas de ejecutar la
lgica contenida en la componente Modelo de Struts. Una vez ejecutada la lgica del
Modelo, las clases de accin le envan a la instancia de la clase ActionServlet una
clave para que el servlet seleccione la Vista que desplegar los resultados de la
ejecucin de la lgica. Aunque hay varias variantes de clases de accin las ms
empleadas son las clases Action y ForwardAction que se encuentran en el
paquete org.apache.struts.action.
La Clase Action
Cada una de las clases de accin que requiramos para ejecutar una tarea de la
lgica de los negocios debe heredar de la clase Action. El siguiente cdigo
muestra el esqueleto de una de clase de accin:
MiAction.java
package acciones
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import
import
import
import
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionMapping;
org.apache.struts.action.ActionForward;
ITSON
210
Struts
/**
*
* @param mapping La instancia de ActionMapping, el mapa empleado para
* seleccionar esta clase de accin.
* @param form El objeto de formulario (opcional) para esta solicitud.
* @param request La solicitud HTTP que se est procesando.
* @param response La respuesta HTTP que se est procesando.
* @throws java.lang.Exception
* @return
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// Aqu va el cdigo que ejecuta la lgica del Modelo
// Pasa el control a la pgina JSP que mostrar los resultados
return mapping.findForward(EXITO);
}
}
La tabla 6.2 describe cada uno de los parmetros del mtodo execute().
Tabla 6.2 Parmetros del mtodo execute() de las clases de accin
Parmetro
AccionMapping
ActionForm
HttpServletRequest
HttpServletResponse
Descripcin
Contiene toda la informacin sobre el despliegue de la accin. Esta
clase se utilizar para determinar a donde se enviarn los resultados
despus que la ejecucin del mtodo termine.
Es un JavaBean que representa el objeto de formulario que contiene
los parmetros del formulario de la pgina que llam a esta clase de
accin. En el caso de que la pgina llamante no tenga un formulario,
este parmetro ser null. Nota: El formulario y sus elementos deben
declararse con los elementos de la biblioteca de etiquetas html de
Struts.
Es una referencia al objeto request.
Es una referencia al objeto response.
ITSON
Tema 6
Struts
211
La Clase ForwardAction
Si slo se desea transferir el control de una pgina JSP a otra, esto es, si el mtodo
execute() de la clase de accin no ejecuta ninguna lgica del Modelo, podemos
utilizar una clase especial de clase de accin llamada ForwardAction. Dado que
no hay mtodo execute() que sobrescribir, no se requiere heredar de esta clase.
Como las instancias de esta clase son creadas por el contenedor Web, slo es
necesario configurar estas instancias en el archivo de configuracin strutsconfig.xml.
<action path="/Ruta"
type="acciones.MiAction">
name="miActionForm"
input="/captura.jsp"
validate="true"
<forward name="exito" path="/despliega.jsp" />
</action>
...
<action path="/Ruta" forward="/destino.jsp"/>
...
</action-mappings>
...
</struts-config>
ITSON
212
Struts
Cada elemento <action> describe una instancia de una clase de accin. Podemos
tener tantos elementos como instancias de clases de acciones se requieran, incluso
puede haber varias instancias de la misma clase siempre y cuando cada una tenga
su propia ruta. La tabla 6.3 describe cada uno de los atributos que puede tener el
elemento <action>.
Tabla 6.3. Atributos del elemento <action>.
Atributo
path
type
name
scope
input
forward
incluye
validate
Descripcin
Representa la ruta relativa al contexto de la accion que atendera la solicitud. Esta
ruta debe ser nica y empezar con una "/". Este atributo es obligatorio.
Nombre completamente calificado de la clase de accin descrita pr este elemento.
Este atributo slo es usado si no especifica un atributo include o forward. Este
atributo es opcional.
Nombre del objeto de formulario (form bean o action form) asociado con esta accin.
Este atributo es opcional.
mbito del objeto del objeto del formulario asociado con esta accin. Este atributo es
opcional. El valor por omisin es de session.
Representa la ruta relativa al contexto de la pgina con el formulario a la que se
regresar el control en caso de que haya un error de validacin. Este atributo es
opcional.
Representa la ruta relativa al contexto de la pgina a la que se le pasar el control si
no se desea llamar a una clase de accin. Este atributo slo es usado si no
especifica un atributo include o type. Este atributo es opcional.
Representa la ruta relativa al contexto de la pgina cuya respuesta ser incluida si
no se desea llamar a una clase de accin. Este atributo slo es usado si no
especifica un atributo forward o type. Este atributo es opcional.
Valor booleano que indica si se invocar al mtodo validate() del objeto de formulario
(form bean o action form) asociado con esta accin. Debe llamarse a este mtodo
antes de la llamada al mtodo execute() de esta accin. Este atributo es opcional
su valor por omisin es true.
La Clase ActionForward
Al terminar su ejecucin, el mtodo execute()de una clase de accin, regresa el
objeto obtenido al invocar al mtodo findForward() sobre su parmetro
mapping. El objeto que regresan los mtodos findForward() y execute(), es
una instancia de la clase org.apache.struts.action.ActionForward que
representa la ruta relativa de la pgina JSP que constituye la vista en la que el
servlet presentar los resultados obtenidos por la clase de accin.
Elemento forward
El parmetro del mtodo findForward() es una cadena que es el nombre lgico
con el que se conocer a la ruta relativa al contexto de la pagina JSP. El mapeo
entre el nombre lgico y la ruta a la pgina est dado por un elemento <forward>
en el el archivo de configuracin struts-config.xml. Los elementos <forward>
pueden ir dentro del cuerpo de un elemento <action> para indicar a que pgina o
pginas les puede pasar el control esa clase de accin. Tambin puede formar parte
del elemento <global-forwards> que denotan las pginas destinos a las que
pueden pasarle el control cualquier clase de accin. En el cdigo del segmento
anterior se muestran ambos casos de elementos <forward>.
ITSON
Tema 6
Struts
213
La tabla 6.4 describe cada uno de los atributos que puede tener el elemento
<forward>.
Tabla 6.4. Atributos del elemento <forward>.
Atributo
name
path
redirect
Descripcin
Nombre nico empleado para referenciar a la pgina destino en la aplicacin. Este
atributo es obligatorio.
Representa la ruta relativa al contexto de la accion que atendera la solicitud. Esta
ruta debe ser nica y empezar con una "/". Este atributo es obligatorio.
Valor booleano que indica si el ActionSerlet debe realizar un forward o un redirect
para invocar a la pgina. Este atributo es opcional su valor por omisin es false.
La Vista
La componente Vista del modelo MVC nos permite visualizar el estado del modelo
en la interfaz de usuario de la aplicacin Web. Por lo general, cada una de las vistas
en el marco Struts se crea usando pginas JSP. Adicionalmente o en conjuncin con
las pginas JSP podemos usar las siguientes componentes:
ITSON
214
Struts
Tema 6
Struts
215
Un atributo de tipo cadena para cada entrada del formulario HTML que se
dese capturar.
Un constructor vaco.
Un mtodo reset() que restablezca los valores de las entradas del formulario a
su valor inicial. La firma de ste mtodo es:
public void reset(org.apache.struts.action.ActionMapping mapping,
javax.servlet.HttpServletRequest request);
Un mtodo validate() que valide los valores de las entradas del formulario
HTML que deseemos validar. La firma de ste mtodo es:
public org.apache.struts.action.ActionErrors reset(
org.apache.struts.action.ActionMapping mapping,
javax.servlet.HttpServletRequest request);
ITSON
216
Struts
<action-mappings>
<action path="/Ruta"
type="acciones.MiAction">
name="miFormAction"
input="/captura.jsp"
validate="true"
<forward name="exito" path="/despliega.jsp" />
</action>
...
</action-mappings>
...
</struts-config>
La tabla 6.5 describe cada uno de los atributos que puede tener el elemento <formbean>.
Tabla 6.5. Atributos del elemento <form-bean>.
Atributo
name
type
Descripcin
Nombre del objeto de formulario (form bean o action form) asociado con esta accin.
Este atributo es obligatorio y debe ser nico en toda la aplicacin.
Nombre completamente calificado de la clase del objeto de formulario. Este atributo
es obligatorio.
que agrega un mensaje de error dado por error para la propiedad (atributo) del
objeto de formulario siendo validado, dada por el parmetro property.
ITSON
Tema 6
Struts
217
identificador=mensaje
ITSON
218
Struts
<exception type="java.lang.Exception"
key="errors.obtenCancionesTodas"
path="/error.jsp" />
</action>
...
</action-mappings>
</struts-config>
La tabla 6.6 describe cada uno de los atributos que puede tener el elemento
<exception>.
Tabla 6.6. Atributos del elemento <exception>.
Atributo
Type
Path
Key
Descripcin
Nombre completamente calificado de la clase de la excepcin a ser manejada. Este
atributo es obligatorio.
Representa la ruta relativa al contexto de la pgina JSP en la que se desplegar el
mensaje de error. Este atributo es obligatorio.
Identificador asociado con el mensaje de error a desplegarse y que se encuentra en
el archivo de recursos de mensajes.
HTML
Bean
Logic
Template
Tiles
Nested
ITSON
Descripcin
Elementos que se utilizan para
pginas JSP que se usan como
interfaces de usuario e incluir
formularios.
Elementos empleados para
definir beans en cualquier mbito
y de diferentes fuentes.
Elementos para manipular la
lgica de presentacin sin recurrir
a scriplets de Java.
Elementos para crear plantillas
JSP que comparten un formato
comn.
Provee un mecanismo ms
poderoso para crear plantillas.
Elementos empleados para
extender los elementos de Struts
para permitir anidamiento.
Prefijo
Sugerido
URI
html
/WEB-INF/struts-html.tld
bean
/WEB-INF/struts-bean.tld
logic
/WEB-INF/struts-logic.tld
template
/WEB-INF/struts-template.tld
tiles
/WEB-INF/struts-tiles.tld
nested
/WEB-INF/struts-nested.tld
Tema 6
Struts
219
Descripcin
Elemento HTML <base>
Campo de entrada de tipo Botn
Botn Cancelar.
Campo de entrada de tipo casilla de verificacin
Despliega condicionalmente un conjunto de mensajes de error
Campo de entrada de seleccin de archivo
Define un formulario
Define un campo oculto
Elemento HTML <html>
Campo de entrada de tipo imagen
Elemento HTML <img>
Elemento HTML <a>
Despliega condicionalmente un conjunto de mensajes
Campo de entrada de tipo casilla de verificacin
Elemento opcin de un elemento de men seleccin
Coleccin de opciones de un elemento de men de seleccin
Coleccin de opciones de un elemento de men deseleccin
Campo de entrada de tipo passord
Campo de entrada de tipo botones de radio
Campo de entrada de tipo botn restablecer
Produce un URI
Elemento men de seleccin
Botn enviar
Campo de entrada de tipo texto
Campo de entrada de tipo rea de texto
ITSON
220
Struts
ITSON
Tema 6
Struts
221
ITSON
222
Struts
La barra de ttulo y el men principal son fragmentos de pgina JSP y son incluidos
en la pgina index.jsp. El cdigo delttulo, titulo.jspf se vi en el Tema 4
JSP. El cdigo del men principal es el siguiente:
menu.jspf
<%-- Este fragmento de pgina JSP es el men principal de la aplicacin
AmanteMusica versin JSP
--%>
<div id="menuppal">
<ul id="menu">
<li>
<html:link href="canciones.jsp">
Catlogo de canciones
</html:link>
</li>
<li>
<html:link href="peliculas.jsp">
Catlogo de pelculas
</html:link>
</li>
<li>
<html:link href="generos.jsp">
Catlogo de gneros
</html:link>
</li>
</ul>
</div>
ITSON
Tema 6
Struts
223
ITSON
224
Struts
</html>
menuCanciones.jspf
<%-- Este fragmento de pgina JSP es el men principal de la aplicacin
AmanteMusica versin JSTL
--%>
<div id="menuppal">
<ul id="menu">
<li>
<html:link action="/Control.do?tarea=agregarCancion">
Agrega Cancin
</html:link>
</li>
<li>
<html:link action="/Control.do?tarea=actualizarCancion">
Actualizar cancin
</html:link>
</li>
<li>
<html:link action="/Control.do?tarea=eliminarCanciones">
Eliminar canciones
</html:link></li>
<li>
<html:link action="/Control.do?tarea=listarCanciones">
Listar canciones
</html:link>
</li>
<li>
<html:link action="/Control.do?tarea=listarCancionesGenero">
Listar canciones por gnero
</html:link>
</li>
<li>
<html:link action="/Control.do?tarea=listarCancionesPeriodo">
Listar canciones por periodo
</html:link>
</li>
<li>
<html:link href="index.jsp">
Pgina Inicial
</html:link>
</li>
</ul>
</div>
Todas las opciones del men Canciones hacen la solicitud de la misma clase de
accin ControlAction.jsp pero pasndole un diferente parmetro en el objeto
request.
ControlAction.java
/*
* ControlAction.java
*
* Creada el 7 de abril de 2008, 12:02 PM
*/
package acciones;
import javax.servlet.http.HttpServletRequest;
ITSON
Tema 6
Struts
225
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import
import
import
import
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionMapping;
org.apache.struts.action.ActionForward;
/**
* Esta clase de Accin selecciona la pgina JSP o accin que inicializa
* el caso de uso del programa AmanteMusica versin JSP
*
* @author mdomitsu
* @version
*/
public class ControlAction extends Action {
/* Llaves para
accin a la
private final
private final
private final
private final
private final
/**
* Este mtodo implementa la accin de seleccionar la pgina JSP o
* accin que inicializa el caso de uso del programa AmanteMusica
* versin JSP.
* @param mapping La instancia de ActionMapping, el mapa empleado para
* seleccionar esta clase de accin.
* @param form El objeto de formulario (opcional) para esta solicitud.
* @param request La solicitud HTTP que se est procesando.
* @param response La respuesta HTTP que se est procesando.
* @throws java.lang.Exception Si no se pudo obtener la lista de
* canciones
* @return Un objeto del tipo ActionForward que encapsula la informacin
* de la pgina JSP o accin a la que se pasar el control
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// Obtiene la tarea seleccionada del men
String tareaSel = (String) request.getParameter("tarea");
// Obtiene la variable implcita session con las variables de sesion
HttpSession session = request.getSession();
// Guarda la tarea seleccionada como el atributo tareaSel en la
// variable sesin que es la que contiene a todas las variables con
// mbito de sesin
session.setAttribute("tareaSel", tareaSel);
if(tareaSel.equals("agregarCancion")) {
// Carga la pgina capturaClave.jsp para capturar la
// clave de la cancin a agregar
return mapping.findForward(CAPTURA_CLAVE);
}
if(tareaSel.equals("actualizarCancion")) {
ITSON
226
Struts
ITSON
Tema 6
Struts
227
path="/ObtenCanciones.do" />
<forward name="capturaGenero"
path="/capturaGenero.jsp" />
<forward name="capturaPeriodo"
path="/capturaPeriodo.jsp" />
</action>
...
</action-mappings>
...
</struts-config>
ITSON
228
Struts
ITSON
Tema 6
Struts
229
ITSON
230
Struts
ITSON
Tema 6
Struts
231
String y tienen el mismo nombre que el valor del atributo name de los campos del
formulario. Adicionalmente tiene dos mtodos: public void
reset(ActionMapping mapping, HttpServletRequest request)que se
emplea para establecer los valores de los campos del formulario cuando se hace clic
en el botn dado por el elemento de la biblioteca de etiquetas de Struts
<html:reset> y public ActionErrors validate(ActionMapping
mapping, HttpServletRequest request)que permite validar los valores de
los campos del formulario.
CancionForm.java
/*
* CancionForm.java
*
* Creada el 2 de noviembre de 2006, 07:38 PM
*/
package objetosFormularios;
import
import
import
import
import
import
import
java.awt.Menu;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpSession;
org.apache.struts.action.ActionErrors;
org.apache.struts.action.ActionMapping;
org.apache.struts.action.ActionMessage;
utils.Validador;
/**
* Esta objeto de formulario permite la transferencia de la clave de una
* cancin de la pgina capturaClave.jsp a la clase de accin
* ObtenCancion.java y de una cancin de la pgina capturaCancion.jsp a la
* clase de accin AgregarCancionAction.java de la aplicacin Web
* AmanteMusica versin Struts
*
* @author mdomitsu
* @version
*/
public class CancionForm extends org.apache.struts.action.ActionForm {
private String clave;
private String titulo;
private String interprete;
private String autorLetra;
private String autorMusica;
private String genero;
private String album;
private String disquera;
private String duracion;
private String fecha;
/**
* Constructor vaco
*/
public CancionForm() {
super();
}
/**
* Regresa la clave de la cancin
* @return La clave de la cancin
*/
ITSON
232
Struts
ITSON
Tema 6
Struts
233
ITSON
234
Struts
}
/**
* Regresa la duracin de la cancin, como una cadena
* @return La duracin de la cancin, como una cadena
*/
public String getDuracion() {
return duracion;
}
/**
* Establece la duracin de la cancin, como una cadena
* @param duracion La duracin de la cancin, como una cadena
*/
public void setDuracion(String duracion) {
this.duracion = duracion;
}
/**
* Regresa la fecha de la cancin, como una cadena
* @return La fecha de la cancin, como una cadena
*/
public String getFecha() {
return fecha;
}
/**
* Establece la fecha de la cancin, como una cadena
* @param fecha La fecha de la cancin, como una cadena
*/
public void setFecha(String fecha) {
this.fecha = fecha;
}
/**
* Restablece los valores de los atributos de la clase de la cancin a
* sus valores iniciales.
* @param mapping La instancia de ActionMapping, el mapa empleado para
* seleccionar esta clase de accin.
* @param request La solicitud HTTP que se est procesando.
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
clave = "";
titulo = "";
interprete = "";
autorLetra = "";
autorMusica = "";
genero = "";
album = "";
disquera = "";
duracion = "";
fecha = "";
}
/**
* Este mtodo permite validar los parmetros del formulario HTML de las
* pginas capturaClave.jsp y capturaCancion.jsp
* @param mapping La instancia de ActionMapping, el mapa empleado para
* seleccionar esta clase de accin.
* @param request La solicitud HTTP que se est procesando.
* @return Regresa la lista de los errores de validaciones
ITSON
Tema 6
Struts
235
*/
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errores = new ActionErrors();
Validador validador = new Validador();
// Obtiene la variable implcita session con las variables de sesion
HttpSession session = request.getSession();
// Obtiene la variable origen
String origen = (String)session.getAttribute("origen");
// Si el formulario es el de la pgina JSP capturaClave.jsp
if(origen.equals("capturaClave")) {
// Si no hay clave
if(!validador.validaString(getClave())) {
// Agrega el mensaje de error a la lista de errores
errores.add("clave", new ActionMessage("errors.no.clave"));
}
return errores;
}
// Si no hay ttulo
if(!validador.validaString(getTitulo()))
// Agrega el mensaje de error a la lista de errores
errores.add("titulo", new ActionMessage("errors.no.titulo"));
// Si no hay intrprete
if(!validador.validaString(getInterprete()))
// Agrega el mensaje de error a la lista de errores
errores.add("interprete",
new ActionMessage("errors.no.interprete"));
// Si no hay autor de la letra
if(!validador.validaString(getAutorLetra()))
// Agrega el mensaje de error a la lista de errores
errores.add("autorLetra",
new ActionMessage("errors.no.autorLetra"));
// Si no hay autor de la msica
if(!validador.validaString(getAutorMusica()))
// Agrega el mensaje de error a la lista de errores
errores.add("autorMusica",
new ActionMessage("errors.no.autorMusica"));
// Si no hay lbum
if(!validador.validaString(getAlbum()))
// Agrega el mensaje de error a la lista de errores
errores.add("album", new ActionMessage("errors.no.album"));
// Si no hay disquera
if(!validador.validaString(getDisquera()))
// Agrega el mensaje de error a la lista de errores
errores.add("disquera", new ActionMessage("errors.no.disquera"));
// Si no hay duracin
if(!validador.validaString(getDuracion()))
// Agrega el mensaje de error a la lista de errores
errores.add("duracion", new ActionMessage("errors.no.duracion"));
// Si la duracin no es un entero
ITSON
236
Struts
else if(!validador.validaInt(getDuracion()))
// Agrgalo el mensaje de error a la lista de errores
errores.add("duracion", new ActionMessage("errors.noInt.duracion"));
// Si no hay fecha
if(!validador.validaString(getFecha()))
// Agrgalo el mensaje de error a la lista de errores
errores.add("fecha", new ActionMessage("errors.no.fecha"));
// Si la fecha no es una Fecha
else if(!validador.validaFecha(getFecha()))
// Agrgalo el mensaje de error a la lista de errores
errores.add("fecha", new ActionMessage("errors.noFecha.fecha"));
return errores;
}
}
ITSON
Tema 6
Struts
237
Para validar una fecha, se require modificar algunos de los constructores de la clase
Fecha, como se muestra en el siguiente fragmento de cdigo.
Fecha.java (Fragmento de cdigo)
/*
* Fecha.java
*
* Created on 8 de septiembre de 2006, 05:19 PM
*
* @author mdomitsu
*/
package objetosServicio;
import java.util.GregorianCalendar;
import java.sql.Date;
/**
* Esta clase que hereda de la clase GregorianCalendar permite el manejo
* simplificado de las fechas
*/
public class Fecha extends GregorianCalendar {
...
ITSON
238
Struts
/**
* Construye un objeto de tipo fecha y lo inicializa a la fecha dada por
* sus parmetros
* @param dia Da del mes
* @param mes Mes del ao
* @param anho Ao
* @throws java.lang.IllegalArgumentException Si alguno de los
* parmetros no est en el rango vlido
*/
public Fecha(int dia, int mes, int anho)
throws IllegalArgumentException {
// Activa la verificacin de los rangos de la fecha
setLenient(false);
// Establece los valores de ao, mes y da del objeto Fecha.
// Internamente el mes se guarda en base 0, es decir enero vale 0.
set(anho, mes-1, dia);
}
...
/**
* Crea un objeto del tipo Fecha a partir de una cadena que contiene una
* fecha en el formato dd/mm/aaaa
* @param s Cadena con la fecha
* @throws java.lang.IllegalArgumentException Si la cadena no representa
* una fecha en el formato dd/mm/aaa o alguno de los valores de dd, mm o
* aaaa no est en el rango vlido.
*/
public Fecha(String s) throws IllegalArgumentException {
String ss;
if(s == null || s.equals("")) throw new IllegalArgumentException();
// Posicin del separador de da y mes
int posDiag1 = s.indexOf('/');
// Si no hay el separador
if(posDiag1 < 0 )throw new IllegalArgumentException();
// Posicin del separador de mes y ao
int posDiag2 = s.indexOf('/', posDiag1+1);
// Si no hay el separador
if(posDiag2 < 0 )throw new IllegalArgumentException();
// Obtiene una subcadena con el da
ss = s.substring(0, posDiag1);
// Convierte la subcadena a entero
int dia = Integer.parseInt(ss);
// Obtiene una subcadena con el mes
ss = s.substring(posDiag1+1, posDiag2);
// Convierte la subcadena a entero
int mes = Integer.parseInt(ss);
// Obtiene una subcadena con el ao
ss = s.substring(posDiag2+1);
// Convierte la subcadena a entero
int anho = Integer.parseInt(ss);
// Activa la verificacin de los rangos de la fecha
setLenient(false);
// Establece los valores de ao, mes y da del objeto Fecha.
// Internamente el mes se guarda en base 0, es decir enero vale 0.
ITSON
Tema 6
Struts
239
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionMapping;
org.apache.struts.action.ActionForward;
org.apache.struts.action.ActionMessage;
org.apache.struts.action.ActionErrors;
import
import
import
import
objetosFormularios.CancionForm;
interfaces.IFachada;
fachadas.FachadaBD;
objetosNegocio.Cancion;
/**
* Esta clase de Accin permite obtener una cancin del catlogo de
canciones
* del programa AmanteMusica
*
* @author mdomitsu
* @version
*/
public class ObtenCancionAction extends Action {
/* Llaves para accede al mapa con la informacin de la pgina JSP o
accin a la que se pasar el control */
private final static String CANCELAR = "cancelar";
private final static String CANCION_EXISTENTE = "cancionExistente";
private final static String OBTENER_GENEROS_CANCIONES =
"obtenGenerosCanciones";
ITSON
240
Struts
/**
* Este mtodo implementa la accin de obtener una cancin del
* catlogo de canciones.
* @param mapping La instancia de ActionMapping, el mapa empleado para
* seleccionar esta clase de accin.
* @param form El objeto de formulario (opcional) para esta solicitud.
* @param request La solicitud HTTP que se est procesando.
* @param response La respuesta HTTP que se est procesando.
* @throws java.lang.Exception Si no se pudo obtener la cancin
* @return Un objeto del tipo ActionForward que encapsula la informacin
* de la pgina JSP o accin a la que se pasar el control
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
HttpSession session = request.getSession();
Cancion cancion = new Cancion();
// Si el usuario presion el botn Cancelar en la pgina
// "capturaClave.jsp"
if(isCancelled(request)) {
// Restablece las propiedades del objeto de formulario CancionForm
// a cadenas vacas para que no muestren nada en la pgina
// capturaClave.jsp
((CancionForm)form).reset(mapping, request);
// pasa el control a la pgina "index.jsp"
return mapping.findForward(CANCELAR);
}
// Obten la clave de la cancin enviada por la pgina
// "capturaClave.jsp"
String clave = ((CancionForm)form).getClave();
// Crea el objeto para acceder a la base de datos
IFachada fachada = new FachadaBD();
// Objeto para recibir la cancin obtenida
Cancion cancionObtenida;
// Obten la cancin del catlogo de canciones
cancionObtenida = fachada.obten(new Cancion(clave));
// Si la cancin existe en la base de datos
if(cancionObtenida != null) {
// Copia sus atributos al bean cancion
cancion.setClave(cancionObtenida.getClave());
cancion.setTitulo(cancionObtenida.getTitulo());
cancion.setInterprete(cancionObtenida.getInterprete());
cancion.setAutorLetra(cancionObtenida.getAutorLetra());
cancion.setAutorMusica(cancionObtenida.getAutorMusica());
cancion.setGenero(cancionObtenida.getGenero());
cancion.setAlbum(cancionObtenida.getAlbum());
cancion.setDisquera(cancionObtenida.getDisquera());
cancion.setDuracion(cancionObtenida.getDuracion());
cancion.setFecha(cancionObtenida.getFecha());
// Almacena el bean cancion como una variable de mbito de sesin.
// El nombre de la variable es cancion y est disponible para las
// pginas jsp usando la accin <jsp:useBean>
ITSON
Tema 6
Struts
241
session.setAttribute("cancion", cancion);
// Restablece las propiedades del objeto de formulario.
((CancionForm)form).reset(mapping, request);
// Pasa el control a la pgina "despliegaCancion.jsp"
return mapping.findForward(CANCION_EXISTENTE);
}
// Si la cancin no existe pasa el control a la clase de accin
// "obtenGenerosCancionesAction"
return mapping.findForward(OBTENER_GENEROS_CANCIONES);
}
}
ITSON
242
Struts
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
javax.servlet.http.HttpSession;
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionMapping;
org.apache.struts.action.ActionForward;
import
import
import
import
interfaces.IFachada;
fachadas.FachadaBD;
java.util.Vector;
objetosTransferencia.ListaGeneros;
/**
* Esta clase de Accin permite obtener los gneros de las canciones del
* catlogo de gneros del programa AmanteMusica
*
* @author mdomitsu
* @version
*/
public class ObtenGenerosCancionesAction extends Action {
/* Llaves para accede al mapa con la informacin de la pgina JSP o
accin a la que se pasar el control */
private final static String CANCELAR = "cancelar";
private final static String EDITA_CANCION = "editaCancion";
private final static String CAPTURA_CANCION = "capturaCancion";
/**
* Este mtodo implementa la accin de obtener la lista de gneros
* de las canciones del catlogo de gneros.
* @param mapping La instancia de ActionMapping, el mapa empleado para
* seleccionar esta clase de accin.
* @param form El objeto de formulario (opcional) para esta solicitud.
* @param request La solicitud HTTP que se est procesando.
ITSON
Tema 6
Struts
243
ITSON
244
Struts
<forward name="capturaCancion"
path="/capturaCancion.jsp" />
<forward name="editaCancion"
path="/editaCancion.jsp" />
<exception type="java.lang.Exception"
key="errors.obtenGeneros"
path="/error.jsp" />
</action>
...
</action-mappings>
...
</struts-config>
ITSON
Tema 6
Struts
245
ITSON
246
Struts
<div class="contenido">
<%-- Formulario para capturar los atributos de una cancin.
Los valores capturados se envan a la pgina
agregarCancion.jsp --%>
<html:form action="AgregarCancion.do" method="post">
<table class="centrada">
<%-- Despliega el encabezado en la pgina --%>
<caption>Captura Cancin</caption>
<tr>
<td class="derecha">Clave</td>
<td>
<%-- Este campo de texto despliega el valor de la clave
Almacenada en el objeto de formulario
CancionActionForm, que a su vez se llen del objeto
request --%>
<html:text property="clave" size="35" readonly="true" />
</td>
<td> </td>
</tr>
<tr>
<td class="derecha">Titulo</td>
<td><html:text property="titulo" size="35" /></td>
<td class="msjError"><html:errors property="titulo" /></td>
</tr>
<tr>
<td class="derecha">Intrprete</td>
<td><html:text property="interprete" size="35" /></td>
<td class="msjError">
<html:errors property="interprete" />
</td>
</tr>
<tr>
<td class="derecha">Autor Letra</td>
<td><html:text property="autorLetra" size="35" /></td>
<td class="msjError">
<html:errors property="autorLetra" />
</td>
</tr>
<tr>
<td class="derecha">Autor Msica</td>
<td><html:text property="autorMusica" size="35" /></td>
<td class="msjError">
<html:errors property="autorMusica" />
</td>
</tr>
<tr>
<td class="derecha">Gnero</td>
<td>
<td>
<html:select property="genero" >
<html:options collection="arregloGeneros"
property="cveGenero"
labelProperty="nombre" />
</html:select>
</td>
<td> </td>
</tr>
<tr>
<td class="derecha">Album</td>
<td><html:text property="album" size="35" /></td>
ITSON
Tema 6
Struts
247
ITSON
248
Struts
AgregarCancionAction.java
/*
* AgregarCancionAction.java
*
* Creada el 5 de noviembre de 2006, 12:20 AM
*/
package acciones;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import
import
import
import
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionMapping;
org.apache.struts.action.ActionForward;
import
import
import
import
import
import
import
objetosFormularios.CancionForm;
interfaces.IFachada;
fachadas.FachadaBD;
java.util.Vector;
objetosNegocio.Cancion;
objetosNegocio.Genero;
objetosServicio.Fecha;
/**
* Esta clase de Accin permite agregar una cancin al catlogo de
* canciones del programa AmanteMusica versin Struts
*
* @author mdomitsu
* @version
*/
public class AgregarCancionAction extends Action {
// Constantes simblicas para las pginas JSP a las que se le pasar el
// control
private final static String CANCELAR = "cancelar";
private final static String EXITO = "exito";
/**
* Este mtodo implementa la accin de agregar una cancin al catlogo
* de canciones.
* @param mapping La instancia de ActionMapping, el mapa empleado para
* seleccionar esta clase de accin.
* @param form El objeto de formulario (opcional) para esta solicitud.
* @param request La solicitud HTTP que se est procesando.
* @param response La respuesta HTTP que se est procesando.
* @throws java.lang.Exception Si no se pudo agregar la cancin
* @return Un objeto del tipo ActionForward que encapsula la informacin
* de la pgina JSP o accin a la que se pasar el control
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// Si el usuario presion el botn Cancelar en la pgina
// "capturaCancion.jsp"
if(isCancelled(request)) {
// Restablece las propiedades del objeto de formulario CancionForm
// a cadenas vacas para que no muestren nada en la pgina
// capturaClave.jsp
ITSON
Tema 6
Struts
249
((CancionForm)form).reset(mapping, request);
// Pasa el control a la pgina "canciones.jsp"
return mapping.findForward(CANCELAR);
}
// Crea el objeto para acceder a la base de datos
IFachada fachada = new FachadaBD();
// Obten la lista de gneros de las canciones del catlogo de
// gneros
Vector lista = fachada.consultaGenerosCanciones();
// Crea un objeto de tipo cancin a partir de los atributos del
// objeto de formulario del parmetro form
CancionForm cancionForm = (CancionForm)form;
// Obten el gnero de la cancin a actualizar
Genero genero = fachada.obten(new Genero(cancionForm.getGenero()));
// Crea un objeto del tipo cancin con los atributos capturados
// en la pguna capturaCancion.jsp
Cancion cancion = new Cancion(cancionForm.getClave(),
cancionForm.getTitulo(),
genero,
cancionForm.getInterprete(),
cancionForm.getAutorLetra(),
cancionForm.getAutorMusica(),
cancionForm.getAlbum(),
cancionForm.getDisquera(),
Integer.parseInt(cancionForm
.getDuracion()),
new Fecha(cancionForm.getFecha()));
// Agrega la cancin del catlogo
fachada.agrega(cancion);
// Restablece las propiedades del objeto de formulario.
((CancionForm)form).reset(mapping, request);
// Obtiene la variable implcita session con las variables de sesion
HttpSession session = request.getSession();
// Guarda la opcin seleccionada como el atributo tareaSel en la
// variable sesin que es la que contiene a todas las variables con
// mbito de sesin
session.setAttribute("tareaSel", "listarCanciones");
// Le pasa el control a la clase de accin ObtenCancionesAction
return mapping.findForward(EXITO);
}
}
ITSON
250
Struts
struts-config.xml (fragmento)
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
...
<action-mappings>
...
<action path="/AgregarCancion"
type="acciones.AgregarCancionAction"
name="cancionForm"
scope="session"
validate="true"
input="/capturaCancion.jsp">
<forward name="exito"
path="/ObtenCanciones.do" />
<forward name="cancelar"
path="/canciones.jsp" />
<exception type="java.lang.Exception"
key="errors.agregarCancion"
path="/error.jsp" />
</action>
<action path="/ObtenCanciones"
type="acciones.ObtenCancionesAction">
<forward name="selCancionActualizar"
path="/seleccionaCancionActualizar.jsp" />
<forward name="selCancionesEliminar"
path="/seleccionaCancionesEliminar.jsp" />
<forward name="despliegaCanciones"
path="/despliegaCanciones.jsp" />
<exception type="java.lang.Exception"
key="errors.obtenCanciones"
path="/error.jsp" />
</action>
...
</action-mappings>
...
</struts-config>
ITSON
Tema 6
Struts
251
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import
import
import
import
import
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionMapping;
org.apache.struts.action.ActionForward;
java.util.Vector;
import
import
import
import
menus.Menu;
interfaces.IFachada;
fachadas.FachadaBD;
objetosTransferencia.Lista;
/**
* Esta clase de Accin permite obtener la lista del catlogo de canciones
* del programa AmanteMusica.
*
* @author mdomitsu
* @version
*/
public class ObtenCancionesAction extends Action {
// Constante simblica para la pgina JSP a las que se le pasar el
// control
private final static String SEL_CANCION_ACTUALIZAR =
"selCancionActualizar";
private final static String SEL_CANCIONES_ELIMINAR =
"selCancionesEliminar";
private final static String DESPLIEGA_CANCIONES = "despliegaCanciones";
/**
* Este mtodo implementa la accin de obtener todas las canciones del
* catlogo de canciones.
* @param mapping La instancia de ActionMapping, el mapa empleado para
* seleccionar esta clase de accin.
* @param form El objeto de formulario (opcional) para esta solicitud.
* @param request La solicitud HTTP que se est procesando.
* @param response La respuesta HTTP que se est procesando.
* @throws java.lang.Exception Si no se pudo obtener la lista de
* canciones
* @return Un objeto del tipo ActionForward que encapsula la informacin
* de la pgina JSP o accin a la que se pasar el control
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
Vector lista = null;
// Bean en que se almacenar la lista de canciones
Lista listaCanciones = new Lista();
// Obtiene la variable implcita session con las variables de sesion
HttpSession session = request.getSession();
// Obtiene la tarea seleccionada del men que se encuentra en la
// variable donde estn las variables con mbito de sesin
String tareaSel = (String) session.getAttribute("tareaSel");
// Crea el objeto para acceder a la base de datos
IFachada fachada = new FachadaBD();
ITSON
252
Struts
ITSON
Tema 6
Struts
253
<forward name="despliegaCanciones"
path="/despliegaCanciones.jsp" />
<exception type="java.lang.Exception"
key="errors.obtenCanciones"
path="/error.jsp" />
</action>
...
</action-mappings>
...
</struts-config>
ITSON
254
Struts
ITSON
Tema 6
Struts
255
<td>${cancion.disquera}</td>
<td>${cancion.duracion}</td>
<td>${cancion.fecha}</td>
</tr>
</c:forEach>
</table>
</div>
</div>
</body>
</html>
ITSON
256
Struts
ITSON
class="derecha">Clave</td>
class="gris">${cancion.clave}</td>
class="derecha">Ttulo</td>
class="gris">${cancion.titulo}</td>
class="derecha">Intrprete</td>
class="gris">${cancion.interprete}</td>
class="derecha">Autor Letra</td>
class="gris">${cancion.autorLetra}</td>
class="derecha">Autor Msica</td>
class="gris">${cancion.autorMusica}</td>
class="derecha">Gnero</td>
class="gris">${cancion.genero.nombre}</td>
class="derecha">Album</td>
class="gris">${cancion.album}</td>
Tema 6
Struts
257
</tr>
<tr>
<td class="derecha">Disquera</td>
<td class="gris">${cancion.disquera}</td>
</tr>
<tr>
<td class="derecha">Duracin</td>
<td class="gris">${cancion.duracion}</td>
</tr>
<tr>
<td class="derecha">Fecha</td>
<td class="gris">${cancion.fecha}</td>
</tr>
</table>
</div>
</div>
</body>
</html>
En la figuras 6.2, 6.13, 6.14 y 6.4 se muestra el diagrama de secuencia del caso de
uso Actualizar Cancin para la aplicacin Web sobre el amante de la msica.
ITSON
258
Struts
ITSON
Tema 6
Struts
259
objeto de formulario usado para pasarle el valor del formulario a la clase de accin y
el parmetro value es el valor que se le asignar al atributo y corresponde al ndice
de la cancin en la tabla.
seleccionaCancionActualizar.jsp
<%-seleccionaCancionActualizar.jsp
Esta pgina JSP despliega una tabla con la lista de canciones del
Catlogo de canciones y permite seleccionar la cancin a actualizar.
Forma parte de la aplicacin AmanteMusica versin Struts.
--%>
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="java.util.Vector" %>
<%@ page import="objetosNegocio.*" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://jakarta.apache.org/struts/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" />
<link rel="stylesheet" type="text/css" href="estilos.css" />
<title>
Amante Msica - Versin Struts: Seleciona Cancin a Actualizar
</title>
</head>
<body>
<%-- En este bean de tipo Lista, se almacena la lista de
canciones ledas de la tabla canciones de la base de datos
musica.
Estos datos estn disponibles para otros JSPs en la misma sesin
--%>
<jsp:useBean id="listaCanciones" scope="session"
class="objetosTransferencia.Lista" />
<%-- Incluye la barra de ttulo --%>
<%@include file="jspf/titulo.jspf"%>
<%-- Incluye el men --%>
<%@include file="jspf/menuCanciones.jspf"%>
<div class="principal">
<div class="contenido">
<html:form action="ObtenCancionEditar.do" method="post">
<%-- Tabla donde se muestran los datos de las canciones --%>
<table class="centrada" border="1" cellpadding="2">
<%-- Ttulo de la tabla --%>
<caption>Selecciona la cancin a actualizar</caption>
<tr>
<%-- Ttulos de las columnas --%>
ITSON
260
Struts
<th> </th>
<th>Clave</th>
<th>Ttulo</th>
<th>Intrprete</th>
<th>Autor Letra</th>
<th>Autor Msica</th>
<th>Gnero</th>
<th>Album</th>
<th>Disquera</th>
<th>Duracin</th>
<th>Fecha</th>
</tr>
<%-- Define la variable i para guardar el valor que se enviar
con el parmeto sel del botn de radio seleccionado --%>
<c:set value="${0}" var="i" scope="page" />
<%-- Para cada cancin de la lista de canciones --%>
<c:forEach items="${listaCanciones.arreglo}"
var="cancion" >
<%-- Inserta en cada celda de una fila de la tabla
uno de los atributos de la cancin --%>
<tr>
<td><html:radio property="seleccion" value="${i}" /></td>
<td>${cancion.clave}</td>
<td>${cancion.titulo}</td>
<td>${cancion.interprete}</td>
<td>${cancion.autorLetra}</td>
<td>${cancion.autorMusica}</td>
<td>${cancion.genero}</td>
<td>${cancion.album}</td>
<td>${cancion.disquera}</td>
<td>${cancion.duracion}</td>
<td>${cancion.fecha}</td>
</tr>
<%-- Incrementa la variable i --%>
<c:set value="${i+1}" var="i" scope="page" />
</c:forEach>
</table>
<br />
<table class="centrada" width="50%">
<tr>
<%-- Botn enviar --%>
<td><html:submit property="boton" value="Continuar" /></td>
<%-- Botn cancelar. Dejar el valor por omisin para el
atributo property para que el mecanismo de deteccin de
cancelar en la clase de accin funcione. --%>
<td><html:cancel value="Cancelar" /></td>
<%-- Botn restaurar --%>
<td><html:reset value="Restaurar" /></td>
</tr>
</table>
</html:form>
</div>
</div>
</body>
</html:html>
ITSON
Tema 6
Struts
261
ITSON
262
Struts
return selecciones;
}
/**
* Este mtodo establece las opciones seleccionadas en las casillas
* de verificacin
* @param selecciones Las opciones seleccionadas en las casillas
* de verificacin
*/
public void setSelecciones(String[] selecciones) {
this.selecciones = selecciones;
}
/**
* Este mtodo no hace nada pues no se necesita hacer validacin
*/
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = null;
return errors;
}
}
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionMapping;
org.apache.struts.action.ActionForward;
import
import
import
import
import
import
import
objetosFormularios.SeleccionForm;
objetosFormularios.CancionForm;
objetosNegocio.Cancion;
interfaces.IFachada;
fachadas.FachadaBD;
objetosNegocio.Cancion;
objetosTransferencia.Lista;
/**
* Esta clase obtiene de la lista de canciones almacenada en la variable
* listaCanciones en el mbito de sesin la cancin seleccionada para
ITSON
Tema 6
Struts
263
ITSON
264
Struts
cancionForm.setTitulo(cancionActualizar.getTitulo());
cancionForm.setInterprete(cancionActualizar.getInterprete());
cancionForm.setAutorLetra(cancionActualizar.getAutorLetra());
cancionForm.setAutorMusica(cancionActualizar.getAutorMusica());
cancionForm.setGenero(cancionActualizar.getGenero().getCveGenero());
cancionForm.setAlbum(cancionActualizar.getAlbum());
cancionForm.setDisquera(cancionActualizar.getDisquera());
cancionForm.setDuracion(new Integer(cancionActualizar.getDuracion())
.toString());
cancionForm.setFecha(cancionActualizar.getFecha().toString());
// Guarda el objeto de formulario en la sesin con el
// nombre de "cancionForm"
session.setAttribute("cancionForm", cancionForm);
// Pasa el control a la pgina "obtenGenerosCancionesAction"
return mapping.findForward(OBTENER_GENEROS_CANCIONES);
}
// Si la cancin no existe pasa el control a la pgina "canciones.jsp"
return mapping.findForward(CANCELAR);
}
}
struts-config.xml (fragmento)
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
...
<form-bean name="seleccionForm"
type="objetosFormularios.SeleccionForm"/>
...
</form-beans>
...
<action-mappings>
...
<action path="/ObtenCancionEditar"
type="acciones.ObtenCancionEditarAction"
name="seleccionForm"
scope="session"
validate="false"
input="/">
<forward name="inicio"
path="/index.jsp" />
<forward name="editaCancion"
path="/editaCancion.jsp" />
<exception type="java.lang.Exception"
key="errors.agregarCancion"
path="/error.jsp" />
</action>
...
</action-mappings>
...
</struts-config>
ITSON
Tema 6
Struts
265
ITSON
266
Struts
ITSON
Tema 6
Struts
267
ITSON
268
Struts
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionMapping;
org.apache.struts.action.ActionForward;
import
import
import
import
import
import
objetosFormularios.CancionForm;
interfaces.IFachada;
fachadas.FachadaBD;
objetosNegocio.Cancion;
objetosNegocio.Genero;
objetosServicio.Fecha;
/**
* Esta clase de Accin permite actualizar una cancin al catlogo de
* canciones del programa AmanteMusica versin Struts
*
* @author mdomitsu
* @version
*/
public class ActualizarCancionAction extends Action {
// Constantes simblicas para las pginas JSP a las que se le pasar el
// control
private final static String CANCELAR = "cancelar";
private final static String EXITO = "exito";
/**
* Este mtodo implementa la accin de actualizar una cancin al
* catlogo de
* canciones.
* @param mapping La instancia de ActionMapping, el mapa empleado para
* seleccionar esta clase de accin.
* @param form El objeto de formulario (opcional) para esta solicitud.
* @param request La solicitud HTTP que se est procesando.
* @param response La respuesta HTTP que se est procesando.
* @throws java.lang.Exception Si no se pudo actualizar la cancin
ITSON
Tema 6
Struts
269
ITSON
270
Struts
struts-config.xml (fragmento)
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
...
<action-mappings>
...
<action path="/ActualizarCancion"
type="acciones.ActualizarCancionAction"
name="CancionForm"
scope="session"
validate="true"
input="/editaCancion.jsp">
<forward name="exito"
path"/ObtenCanciones.do" />
<forward name="cancelar"
path="/canciones.jsp" />
<exception type="java.lang.Exception"
key="errors.actualizarCancion"
path="/error.jsp" />
</action>
...
</action-mappings>
...
</struts-config>
Al igual que en el caso de uso Agregar Cancin, si hay xito al actualizar la cancin
en la tabla canciones, se invoca a la clase de accin
ObtenCancionesAction.java para que obtenga la lista de las canciones en la
tabla canciones y las guarde en la variable de mbito de sesin listaCanciones.
Luego le pasa el control a la pgina JSP despliegaCanciones.jsp para que
despliegue la lista de canciones una vez actualizados los datos de una cancin,
Figura 11.
En las figuras 6.2, 6.17 y 6.4 se muestra el diagrama de secuencia del caso de uso
Eliminar Canciones para la aplicacin Web sobre el amante de la msica. En el
caso de uso Eliminar Canciones, la clase de accin ControlAction.java le
pasa el control a la clase de accin ObtenCancionesAction.java para que
obtenga la lista de canciones en la tabla canciones de la base de datos msica,
almacene la lista de canciones en el JavaBean ListaCanciones.java y luego le
pasa el control a la pgina JSP seleccionaCancionesEliminar.jsp.
En la pgina seleccionaCancionesEliminar.jsp, se despliega una tabla con
la lista de las canciones. La pgina le pasa el control a la clase de accin
ObtenCancionesEliminarAction.java guardando en el atributo
selecciones del Javabean SeleccionForm.java los ndices de las canciones
seleccionadas mediante las casillas de verificacin en la pgina. Cada casilla de
verificacin de la pgina se establece mediante el elemento <html:checkbox> de
la bibioteca html de Struts. El parmetro property del elemento
<html:checkbox> es el nombre del atributo del objeto de formulario usado para
ITSON
Tema 6
Struts
271
ITSON
272
Struts
seleccionaCancionesEliminar.jsp
<%-seleccionaCancionesEliminar.jsp
Esta pgina JSP despliega una tabla con la lista de canciones del
catlogo de canciones y permite seleccionar las canciones a eliminar.
Forma parte de la aplicacin AmanteMusica versin Struts.
--%>
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="java.util.Vector" %>
<%@ page import="objetosNegocio.*" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://jakarta.apache.org/struts/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" />
<link rel="stylesheet" type="text/css" href="estilos.css" />
<title>
Amante Msica - Versin Struts: Seleciona Canciones a Eliminar
</title>
</head>
<body>
<%-- En este bean de tipo ListaCanciones, se almacena la lista de
canciones ledas de la tabla canciones de la base de datos
musica.
Estos datos estn disponibles para otros JSPs en la misma sesin
--%>
<jsp:useBean id="listaCanciones" scope="session"
class="objetosTransferencia.Lista" />
<%-- En este bean de tipo Menu, se almacenan los valores que se
le asignarn a los parmetros class de los elementos div que
forman las opciones del men. tambin almacena la opcin del men
seleccionada
--%>
<jsp:useBean id="menu" scope="session" class="menus.Menu" />
<%-- Incluye la barra de ttulo --%>
<%@include file="jspf/titulo.jspf"%>
<%-- Incluye el men --%>
<%@include file="jspf/menuCanciones.jspf"%>
<div class="principal">
<div class="contenido">
<html:form action="EliminarCanciones.do" method="post">
<%-Tabla donde se muestran los datos de todas las canciones
--%>
<table class="centrada" border="1" cellpadding="2">
<%-- Ttulo de la tabla --%>
<caption>Selecciona las canciones a eliminar</caption>
ITSON
Tema 6
Struts
273
ITSON
274
Struts
</html:html>
excepciones.FachadaException;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
javax.servlet.http.HttpSession;
import
import
import
import
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionMapping;
org.apache.struts.action.ActionForward;
import
import
import
import
import
interfaces.IFachada;
fachadas.FachadaBD;
objetosFormularios.SeleccionForm;
objetosNegocio.Cancion;
objetosTransferencia.Lista;
/**
* Esta clase de Accin permite eliminar canciones del catlogo de
* canciones del programa AmanteMusica version Struts
*
* @author mdomitsu
* @version
*/
public class EliminarCancionesAction extends Action {
// Constantes simblicas para las pginas JSP a las que se le pasar el
// control
private final static String CANCELAR = "cancelar";
private final static String EXITO = "exito";
/**
* Este mtodo implementa la accin de eliminar canciones del catlogo
* de canciones.
* @param mapping La instancia de ActionMapping, el mapa empleado para
* seleccionar esta clase de accin.
* @param form El objeto de formulario (opcional) para esta solicitud.
* @param request La solicitud HTTP que se est procesando.
* @param response La respuesta HTTP que se est procesando.
* @throws java.lang.Exception Si no se pudo eliminar las canciones
* @return Un objeto del tipo ActionForward que encapsula la informacin
* de la pgina JSP o accin a la que se pasar el control
*/
ITSON
Tema 6
Struts
275
ITSON
276
Struts
struts-config.xml (fragmento)
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
...
<action-mappings>
...
<action path="/EliminarCanciones"
type="acciones.EliminarCancionesAction"
name="SeleccionForm"
scope="session"
input="/">
<forward name="exito"
path "/ObtenCanciones.do" />
<forward name="cancelar"
path="/canciones.jsp" />
<exception type="java.lang.Exception"
key="errors.eliminarCancion"
path="/error.jsp" />
</action>
...
</action-mappings>
...
</struts-config>
Al igual que en los casos de uso Agregar Cancin y Actualizar Cancin, si hay
xito al eliminar las canciones de la tabla canciones, se invoca a la clase de accin
ObtenCancionesAction.java para que obtenga la lista de las canciones en la
tabla canciones y las guarde en la variable de mbito de sesin listaCanciones.
Luego le pasa el control a la pgina JSP despliegaCanciones.jsp para que
despliegue la lista de canciones una vez eliminadas las canciones, Figura 11.
En las figuras 6.2 y 6.4 se muestra el diagrama de secuencia del caso de uso Listar
Canciones para la aplicacin Web sobre el amante de la msica.
En el caso de uso Listar Canciones, la clase de accin ControlAction.java le
pasa el control a la clase de accin ObtenCancionesAction.java para que
obtenga la lista de canciones en la tabla canciones de la base de datos msica,
almacena la lista de canciones en el JavaBean ListaCanciones.java y luego le
pasa el control a la pgina JSP despliegaCanciones.jsp para que despliegue la
lista de canciones en una tabla.
ITSON
Tema 6
Struts
277
ITSON
278
Struts
errors.detail={0}
errors.general=El proceso no se completo. Los detalles son.
errors.token=La solicitud no se complet. La operacin no est en la
secuencia.
error.global=Error!.
errors.obtenCanciones=Error al leer el catlogo de canciones.
errors.agregarCancion=Error al agregar la cancin.
errors.obtenCancion=Error al leer el catlogo de canciones.
errors.eliminarCancion=Error al eliminar la cancin.
errors.cancionInexistente=Error, la cancin no existe
errors.no.titulo=Falt el ttulo
errors.no.interprete=Falt el intrprete
errors.no.autorLetra=Falt el autor de la letra
errors.no.autorMusica=Falt el autor de la msica
errors.no.genero=Falt el gnero
errors.no.album=Falt el lbum
errors.no.disquera=Falt la disquera
errors.no.duracion=Falt la duracin
errors.noInt.duracion=La duracin debe ser un entero
errors.no.fecha=Falt la fecha
errors.noFecha.fecha=La fecha debe ser dd/mm/aaaa
ITSON
Tema 6
Struts
279
type="acciones.ObtenCancionAction"
name="cancionForm"
scope="session"
validate="true"
input="/capturaClave.jsp">
<forward name="cancelar"
path="/index.jsp" />
<forward name="cancionExistente"
path="/despliegaCancion.jsp" />
<forward name="cancionNueva"
path="/capturaCancion.jsp" />
<exception type="java.lang.Exception"
key="errors.obtenCancion"
path="/error.jsp" />
</action>
<action path="/AgregarCancion"
type="acciones.AgregarCancionAction"
name="cancionForm"
scope="session"
validate="true"
input="/capturaCancion.jsp">
<forward name="exito"
path="/index.jsp" />
<forward name="cancelar"
path="/index.jsp" />
<exception type="java.lang.Exception"
key="errors.agregarCancion"
path="/error.jsp" />
</action>
<action path="/Inicio"
forward="/index.jsp"/>
<action path="/ObtenCanciones"
type="acciones.ObtenCancionesAction">
<forward name="selCancionActualizar"
path="/seleccionaCancionActualizar.jsp" />
<forward name="selCancionesEliminar"
path="/seleccionaCancionesEliminar.jsp" />
<forward name="despliegaCanciones"
path="/despliegaCanciones.jsp" />
<exception type="java.lang.Exception"
key="errors.obtenCanciones"
path="/error.jsp" />
</action>
<action path="/ObtenCancionEditar"
type="acciones.ObtenCancionEditarAction"
name="seleccionForm"
scope="session"
validate="false"
input="/">
<forward name="inicio"
path="/index.jsp" />
<forward name="editaCancion"
path="/editaCancion.jsp" />
<exception type="java.lang.Exception"
key="errors.agregarCancion"
path="/error.jsp" />
</action>
<action path="/ActualizarCancion"
type="acciones.ActualizarCancionAction"
name="cancionForm"
scope="session"
ITSON
280
Struts
validate="true"
input="/editaCancion.jsp">
<forward name="exito"
path="/index.jsp" />
<forward name="cancelar"
path="/index.jsp" />
<exception type="java.lang.Exception"
key="errors.actualizarCancion"
path="/error.jsp" />
</action>
<action path="/EliminarCanciones"
type="acciones.EliminarCancionesAction"
name="seleccionForm"
scope="session"
input="/">
<forward name="exito"
path="/index.jsp" />
<forward name="cancelar"
path="/index.jsp" />
<exception type="java.lang.Exception"
key="errors.eliminarCancion"
path="/error.jsp" />
</action>
</action-mappings>
<controller
processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>
<message-resources
parameter="com/amanteMusicaStruts/struts/ApplicationResource"/>
<!-- ==================== Tiles plugin ============================-->
<!-This plugin initialize Tiles definition factory. This later can takes
some parameters explained here after. The plugin first read parameters
from web.xml, thenoverload them with parameters defined here. All
parameters are optional.
The plugin should be declared in each struts-config file.
- definitions-config: (optional)
Specify configuration file names. There can be several comma
separated file names (default: ?? )
- moduleAware: (optional - struts1.1)
Specify if the Tiles definition factory is module aware. If true
(default), there will be one factory for each Struts module.
If false, there will be one common factory for all module. In this
later case, it is still needed to declare one plugin per module.
The factory will be initialized with parameters found in the first
initialized plugin (generally the one associated with the default
module).
true : One factory per module. (default)
false : one single shared factory for all modules
- definitions-parser-validate: (optional)
Specify if xml parser should validate the Tiles configuration file.
true : validate. DTD should be specified in file header (default)
false : no validation
Paths found in Tiles definitions are relative to the main context.
-->
<plug-in className="org.apache.struts.tiles.TilesPlugin" >
<set-property property="definitions-config"
value="/WEB-INF/tiles-defs.xml" />
ITSON
Tema 6
Struts
281
ITSON