Anda di halaman 1dari 77

Tema 6

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:

Se sabe que trabajan bien en otras aplicaciones.

Estn listas para trabajar en el siguiente projecto.

Pueden ser usadas por otros equipos de la organizacin.

El patrn de diseo MVC consiste de tres componentes: Un modelo, una vista y un


controlador. La tabla 6.1 define cada uno de esos componentes.
Tabla 6.1. Los componentes del patrn de diseo MVC.
Componente

Modelo
Vista
Controlador

Descripcin

Representa los objetos del negocio. El modelo es lo que se


manipula y se presenta al usuario.
Es la representacin en pantalla del modelo. Es el objeto que
presenta el estado actual de los objetos del negocio
Define la forma en la que la interfaz del usuario reacciona a las
entradas del usuario. El controlador es el objeto que manipula al
modelo, u objetos del negocio.

Las ventajas del uso del modelo MVC son:

ITSON

Confiabilidad: Las capas de presentacin y transaccin tienen una clara


separacin, lo que permite cambiar la apariencia de la aplicacin sin
recompilar el cdigo del modelo o del controlador.

Manuel Domitsu Kono

206

Struts

Reutilizacin y Adaptabilidad: El modelo MVC permite el uso de mltiples


tipos de vistas, todas accediendo al mismo cdigo en el lado del servidor,
desde navegadores Web (HTTP) a navegadores inalmbricos (WAP).

Costos de desarrollo y de ciclo de vida muy bajos: El modelo MVC permite el


emplear programadores menos experimentados para desarrollar y mantener
las interfaces de usuario.

Despliegue Rpido: El tiempo de desarrollo de la aplicacin puede reducirse


significativamente porque los programadores del controlador, los
desarrolladores de Java, se enfocan exclusivamente en las transacciones y
los programadores de la vista, los desarrolladores de HTML y JSP, se
enfocan exclusivamente en la presentacin.

Mantenibilidad: La separacin entre la presentacin y la lgica del negocio


permite fcilmente mantener y modificar una aplicacin basada en Struts.

La Implementacin del Modelo MVC de Struts


El marco Struts modela su implementacin del lado del servidor del MVC usando
Servlets, JSP, Elementos JSP (Etiquetas), JavaBeans y otras clases de Java, figura
6.1.

Figura 6.1 Implementacin del Modelo MVC con Struts


La figura 6.1 muestra como los diferentes elementos de Struts interactan para dar
respuesta a una solicitud.
a) El usuario hace una solicitud al servidor Web mediante un navegador (1).

ITSON

Manuel Domitsu Kono

Tema 6

Struts

207

b) El Controlador, que en Struts es un servlet, recibe la solicitud del navegador.


Este servlet busca el URI de la solicitud en un archivo de configuracin
llamado struts-config.xml y determina el nombre de la clase de accin que
realizar la lgica de los negocios necesaria para obtener la respuesta (2).
c) La clase de accin, que forma parte del Controlador ejecuta la lgica
contenida en los componentes del Modelo (3, 4).
d) Cuando la clase de accin termina su procesamiento le regresa el control al
servlet, regresndole una clave que indica el resultado de su procesamiento
(5).
e) El servlet utiliza esta clave para determinar a donde debe enviar los
resultados para la presentacin.
f) El servlet responde enviando la solicitud a la vista que estaba ligada a la clave
regresada por la clase de accin (6). Aqu se genera la respuesta procesando
la pgina JSP.
g) Por ltimo la respuesta generada se enva al navegador Web que se encarga
de presentar los resultados al cliente (7).

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

Manuel Domitsu Kono

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>

En el elemento <servlet> se tienen los siguientes elementos con la siguiente


informacin:
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>

Establecen el nombre de de la instancia del servlet y el nombre de la clase.

ITSON

Manuel Domitsu Kono

Tema 6

Struts

209

<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>

Establece el nombre del archivo de configuracin empleado por Struts.


<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

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>

Establece el nombre de la pgina inicial de la aplicacin.

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;

public class MiAction extends Action {


// Constantes simblicas para las pginas JSP a las que se le pasar el
// control
private final static String EXITO = "exito";

ITSON

Manuel Domitsu Kono

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);
}
}

Cada clase hija de la clase Action debe sobrescribir el mtodo execute() de la


clase padre. Este mtodo es el encargado de ejecutar una tarea especfica
invocando la lgica contenida en el Modelo. La sintaxis de ste mtodo es:
Cada clase hija debe sobrescribir el mtodo execute() de la clase Action.
org.apache.struts.action.ActionForward execute(AccionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws java.lang.Exception;

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.

El mtodo relanza una excepcin del tipo java.lang.Exception si en alguna de


las sentencias del mtodo ocurre una excepcin.

ITSON

Manuel Domitsu Kono

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.

Configuracin de una Clase de Accin


Cada una de las instancias de una clase de accin: Action o ForwardAction, es
creada por el contenedor Web. Para hacerlo, el contenedor extrae la informacin
necesaria para cada instancia de un elemento <action> del archivo strutsconfig.xml. Los elementos <action> se encuentran en la seccin <actionmappings> de ste archivo. El siguiente recuadro muestra un listado parcial del
archivo de configuracin struts-config.xml.
struts-config.xml
?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>
...
<global-forwards>
<forward name="inicio" path="/index.jsp" />
</global-forwards>
...

<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

Manuel Domitsu Kono

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

Manuel Domitsu Kono

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:

Documentos HTML: Si una de las vistas de la aplicacin Web contiene slo


contenido esttico se puede utilizar una pgina HTML, sin embargo al hacerlo
no se podran emplear muchos de los mecanismos automticos del marco
Struts.

Bibliotecas de Etiquetas JSP: Podemos emplear los elementos de accin


(etiquetas) de JSTL en las pginas JSP de Struts as como elementos de
accin de otros desarrolladores. Adicionalmente, el marco Struts nos provee
de una biblioteca de etiquetas que podemos emplear en la construccin de
las pginas JSP.

JavaScript: JavaScript es un lenguaje de propsito general. En las pginas


JSP se emplea para incrustar cdigo como parte de los elementos de JSP
que es ejecutado del lado del cliente y permite realizar ciertas tareas como
animaciones, verificacin, etc.

Hojas de Estilo en Cascada: Struts nos permite usar Hojas de Estilo en


Cascada de la misma forma en que lo hacemos con las pginas HTML.
Archivos multimedia: En una aplicacin Web usando el marco Struts,
podemos incluir imgenes, audio, video., etc.

Archivos de recursos de mensajes: Tambin llamados simplemente


archivos de recursos, son archivos texto que asocian identificadores
(normbres) a mensajes. El uso de estos archivos permite la localizacin de
la aplicacin as como a reducir el tiempo de mantenimiento y la redundancia
del cdigo en la aplicacin.

Objetos de Formularios (AccionForms o BeanForms)


Los objetos de formulario son JavaBeans que heredan de la clase
org.apache.struts.action.ActionForm. Se emplean para lo siguiente:

ITSON

Manuel Domitsu Kono

214

Struts

Capturan los datos de un formulario HTML de una pgina JSP.


Validan los datos.
Si no hay errores de validacin, transfieren los datos a una clase de accin.
En caso contrario, transfieren los datos a la pgina de entrada para que
puedan ser desplegados en el formulario y corregidos.

No se requiere declarar un objeto de formulario para cada formulario HTML en la


aplicacin, por ejemplo si un formulario slo contiene botones Enviar.
Por otro lado podemos compartir el mismo objeto de formulario con varios
formularios HTML, por ejemplo si utilizamos varias pginas para capturar datos que
se van a procesar juntos como en el caso de un asistente que ocupa varias pginas.

mbitos de los Objetos de Formularios


Los objetos de formulario pueden tener dos diferentes tipos de mbito: De solicitud
(request) y de sesin (session). Si se utiliza el mbito de solicitud, el objeto de
formulario estar disponible hasta que se enve la respuesta a la solicitud del cliente.
Si se desea que el tiempo de vida de un objeto de formulario sea mayor que el de
una solicitud se puede emplear el mbito de sesin, por ejemplo si utilizamos varias
pginas para capturar datos que se van a procesar juntos como en el caso de un
asistente que ocupa varias pginas. En este caso el objeto de formulario
permanecer en la variable de mbito session hasta que la eliminemos, la
remplacemos con otro objeto o que expire el tiempo de sesin.

Ciclo de vida de un Objeto de Formulario


Los pasos principales por los que pasa un objeto de formulario son los siguientes:
1. El controlador recibe una solicitud. Si el elemento <action> en el archivo
struts-config.xml para esta URI contiene el parmetro name para asociarle un
objeto de formulario a una clase de accin, entonces se crea el objeto de
formulario si no existe o se reutiliza el existente.
2. Se invoca al mtodo reset() del objeto de formulario.
3. Se almacena el objeto del formulario en el mbito establecido.
4. Se establecen los valores de los atributos de objeto de formulario a partir del
objeto request.
5. Se invoca al mtodo validate() del objeto de formulario para validar los
datos. este mtodo slo es invocado si el atributo validate del elemento
<action> tiene el valor de true.
6. Si no hubo errores de validacin, se invoca al mtodo execute() de la clase
de accin de la solicitud.
7. Despus de ejecutar el mtodo execute() se pasa el control a la pgina
establecida en el objeto ActionForward.
8. Si hubo errores de validacin, se pasa el control a la pgina establecida por el
atributo input del elemento <action>, que normalmente es la pgina con el
formulario.
ITSON

Manuel Domitsu Kono

Tema 6

Struts

215

Creacin de un Objeto de Formulario


Como ya se mencion, para crear un objeto de formulario debe heredar de la clase
org.apache.struts.action.ActionForm, que es una clase abstracta. Este
objeto de formulario deber tener:

Un atributo de tipo cadena para cada entrada del formulario HTML que se
dese capturar.

Un constructor vaco.

Mtodos de acceso para cada uno de los atributos.

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);

Declaracin de un Objeto de Formulario en struts-config.xml.


Cada una de las instancias de un objeto de formulario debe declararse en el archivo
de configuracin struts-config.xml. Para ello se utiliza el elemento <formbean> en la seccin <form-beans> de ste archivo. Para usar el objeto de
formulario dentro de una clase de accin debemos agregarle al elemento <action>
que configura la clase de accin los atributos name, scope y validate.
El siguiente recuadro muestra un listado parcial del archivo de configuracin
struts-config.xml. con los elementos <form-bean> y <action> configurados
para el uso de un objeto de formulario en una clase de accin.
struts-config.xml
<?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="miActionForm"
type="objetosFormularios.MiActionForm"/>
...
</form-beans>

ITSON

Manuel Domitsu Kono

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.

La Clases ActionErrors y ActionMessage


El mtodo validate() de un objeto de formulario regresa un objeto del tipo
org.apache.struts.action.ActionErrors que encapsula uno o ms errores
que han ocurrido en la aplicacin. Cada uno de los errores se representa mediante
una instancia de la clase org.apache.struts.action.ActionMessage. Cada
error o mensaje se crea mediante el constructor de la la clase ActionMessage:
public ActionMessage(String key)

donde key es la llave al mensaje de error que se encuentra en el archivo de de


recursos de mensajes. Para agregar un error a la lista de errores se utiliza el mtodo
add() de la clase ActionErrors:
add(String property, ActionMessage error)

que agrega un mensaje de error dado por error para la propiedad (atributo) del
objeto de formulario siendo validado, dada por el parmetro property.

El Archivo de Recursos de Mensajes


El archivo de recursos de mensajes es un archivo texto que contiene una serie de
mensajes asociados a un identificador, uno por lnea. La sintaxis para cada mensaje
es:

ITSON

Manuel Domitsu Kono

Tema 6

Struts

217

identificador=mensaje

donde identificador consta de uno o ms caracteres y puntos, empezando y


terminando en caracteres y mensaje es una frase que puede contener espacios pero
no caracteres de salto de lnea, ni est delimitado por comillas. Por ejemplo:
errors.agregarCancion=Error al agregar la cancin.

El nombre y ubicacin del archivo de recursos de mensaje se configura en el archivo


struts-config.xml, con el elemento <message-resources>. Por ejemplo, la
siguiente declaracin:
<message-resources parameter="com/myapp/struts/ApplicationResource"/>

establece que el nombre del archivo de recursos de mensajes se llama:


ApplicationResource.properties y est en la carpeta:
"com\myapp\struts, que en un proyecto de NetBeans est en la carpeta:
src\java\ dentro de la carpeta del proyecto.

Manejo de Excepciones en Struts


Struts permite establecer el mensaje de error y la pgina JSP en que se desplegar
ese mensaje de error al ocurrir una excepcin. Para ello se utiliza el elemento
<exception> en el archivo struts-config. Los elementos <exception>
pueden ir dentro del cuerpo del elemento <action>. Cada uno de los elementos
<exception> indica en que pgina se desplegar el mensaje de error si ocurre
una excepcin dada en una clase de accin. Los elementos <exception> tambin
pueden formar parte del elemento <global-exceptions>. Cada uno de estos
elementos <exception> indica en que pgina se desplegar el mensaje de error si
ocurre una excepcin en forma global. Si la misma excepcin se configura en el
elemento <global-exceptions> y en un elemento <action>, la del elemento
<action> tiene precedencia. En el cdigo siguiente se muestran ambos casos de
elementos <exception>.
<?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>
...
<global-exceptions>
...
</global-exceptions>
...
<action-mappings>
<action path="/ObtenCancionesTodas"
type="acciones.ObtenCancionesTodasAction">
<forward name="exito" path="/despliegaCanciones.jsp" />

ITSON

Manuel Domitsu Kono

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.

Bibliotecas de Etiquetas de Struts


Ya se mencion que Struts nos prove de una biblioteca de elementos de accin
(etiquetas) como parte de su marco. De hecho hay un traslape entre la funcionalidad
de muchas de las etiquetas de Struts y JSTL. En estos casos se prefiere el uso de
JSTL en lugar de las de Struts. La excepcin es el caso de las etiquetas html
empleadas para crear formularios.
Al igual que la JSTL, la biblioteca de Struts est dividida en seis bibliotecas, cada
una en un archivo. Las seis bibliotecas que forman la biblioteca de Struts se
muestran en la tabla 6.7:
Tabla 6.7. Bibliotecas de Struts
Biblioteca

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

Manuel Domitsu Kono

Tema 6

Struts

219

Los elementos disponibles en biblioteca html se muestran en la tabla 6.8.


Tabla 6.8 Elementos de la biblioteca de struts html
Elemento
base
button
cancel
checkbox
errors
file
form
hidden
html
image
img
link
messages
multibox
option
options
optionsCollection
password
radio
reset
rewrite
select
submit
text
textarea

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

Ejemplo de una Aplicacin Web


Usando Struts
A continuacin se muestra la versin de la aplicacin desarrollada en el Tema 4:
Pginas JSP utilizando Struts.
En las figuras 6.2 a 6.4 se muestra el diagrama de secuencia del caso de uso
Agregar Cancin para la aplicacin Web sobre el amante de la msica.
Al igual que con la versin de la aplicacin desarrollada en el Tema 4: Pginas JSP,
la pgina JSP index.jsp que es la pgina de entrada de la aplicacin contiene un
men formado por una lista de hipervnculos, mediante la cual el usuario selecciona
cul de las funcionalidades de la aplicacin se desea ejecutar, tal como se muestra
en la figura 6.5.
El elemento <html:html> de la biblioteca de etiquetas de Struts, genera el
elemento <html> de HTML.

ITSON

Manuel Domitsu Kono

220

Struts

Figura 6.2 Diagrama de Secuencia. Caso de Uso Agrega Cancin

Figura 6.3 Diagrama de Secuencia. Caso de Uso Agrega Cancin (Cont.)

ITSON

Manuel Domitsu Kono

Tema 6

Struts

221

Figura 6.4 Diagrama de Secuencia. Caso de Uso Agrega Cancin (Cont.)

Figura 6.5 index.jsp en un navegador


index.jsp
<%-index.jsp
Esta pgina JSP es la pgina inicial de la aplicacin Web
AmanteMusicaStruts
Despliega el men de opciones.
--%>
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

ITSON

Manuel Domitsu Kono

222

Struts

<%@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 Musica: Versin Struts</title>
</head>
<body>
<%-- Incluye la barra de ttulo --%>
<%@include file="jspf/titulo.jspf"%>
<%-- Incluye el men --%>
<%@include file="jspf/menuPpal.jspf"%>
</body>
</html:html>

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>

Los elementos <html:link> de la biblioteca de etiquetas de Struts generan un


elemento <a> de HTML. En cada caso invocan a una pgina JSP. Si se selecciona
la opcin: Catlogo de canciones, se invoca a la pgina canciones.jsp que
despliega un men, figura 6.6, con las opciones que permiten administrar y consultar
el catlogo de canciones. El men se encuentra en el fragmento de pgina JSP
menuCanciones.jspf.

ITSON

Manuel Domitsu Kono

Tema 6

Struts

223

Figura 6.6 canciones.jsp en un navegador


canciones.jsp
<%-canciones.jsp
Esta pgina JSP es la pgina con el men canciones de la aplicacin
Web AmanteMusica versin Struts. Despliega el men de opciones.
--%>
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@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>
<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: Men Canciones</title>
</head>
<body>
<%-- Incluye la barra de ttulo --%>
<%@include file="jspf/titulo.jspf"%>
<%-- Incluye el men --%>
<%@include file="jspf/menuCanciones.jspf"%>
</body>

ITSON

Manuel Domitsu Kono

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

Manuel Domitsu Kono

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

acceder al mapa con la informacin de la pgina JSP o


que se pasar el control */
static String CAPTURA_CLAVE = "capturaClave";
static String OBTEN_CANCIONES = "obtenCanciones";
static String CAPTURA_GENERO = "capturaGenero";
static String CAPTURA_PERIODO = "capturaPeriodo";
static String INICIO = "inicio";

/**
* 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

Manuel Domitsu Kono

226

Struts

// invoca a la accin ObtenCancionesAction para obtener la lista


// de todas las canciones
return mapping.findForward(OBTEN_CANCIONES);
}
if(tareaSel.equals("eliminarCanciones")) {
// invoca a la accin ObtenCancionesAction para obtener la lista
// de todas las canciones
return mapping.findForward(OBTEN_CANCIONES);
}
if(tareaSel.equals("listarCanciones")) {
// invoca a la accin ObtenCancionesAction para obtener la lista
// de todas las canciones
return mapping.findForward(OBTEN_CANCIONES);
}
if(tareaSel.equals("listarCancionesGenero")) {
// invoca a la accin ObtenCancionesAction para obtener la lista
// de todas las canciones
return mapping.findForward(CAPTURA_GENERO);
}
if(tareaSel.equals("listarCancionesPeriodo")) {
// invoca a la accin ObtenCancionesAction para obtener la lista
// de todas las canciones
return mapping.findForward(CAPTURA_PERIODO);
}
// Le pasa el control a la pgina JSP "index.jsp"
return mapping.findForward(INICIO);
}
}

Dependiendo de la opcin seleccionada el mtodo execute() de la clase de accin


ControlAction.java regresa un objeto del tipo ActionForward que contiene la
informacin de la pgina o clase de accin a la que se le pasar el control. El
mtodo execute() obtiene esa informacin del parmetro ActionMapping
mapping invocando al mtodo findForward(). El servlet ActionServlet toma
la informacin que le pasa a la clase de accin en el parmetro mapping del archivo
de configuracin struts-config.xml. Para cada clase de accin hay una entrada
en ese archivo de configuracin.
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="/Control"
type="acciones.ControlAction">
<forward name="capturaClave"
path="/capturaClave.jsp" />
<forward name="obtenCanciones"

ITSON

Manuel Domitsu Kono

Tema 6

Struts

227

path="/ObtenCanciones.do" />
<forward name="capturaGenero"
path="/capturaGenero.jsp" />
<forward name="capturaPeriodo"
path="/capturaPeriodo.jsp" />
</action>
...
</action-mappings>
...
</struts-config>

El elemento <action-mapping> del archivo struts-config.xml, contiene un


elemento <action> para cada clase de accin. El atributo path de ste elemento
es el URI relativo al contexto de la aplicacin que identifica a la clase de accin a la
que se le pasar el control; el atributo type es el nombre de la clase de accin; y los
elementos <forward> anidados en el elemento <action> especifican, cada uno,
la pgina o clase de accin a la que se le pasar el control. En el elemento
<forward> el atributo name es el mismo valor que se le pas al mtodo
findForward() y el atributo path es el nombre de la pgina JSP o clase de
accin a la que se le pasar el control. Podemos ver que si la opcin seleccionada
es Agregar Cancin la clase de accin ControlAction.java carga la pgina
JSP capturaClave.jsp para capturar la clave de la cancin a agregar, tal como
se ve en la figura 6.7.

Figura 6.7 capturaClave.jsp en un navegador

ITSON

Manuel Domitsu Kono

228

Struts

Como veremos ms adelante, s una pgina JSP tiene un formulario, el servlet


ActionServlet puede almacenar en un Java Bean los valores capturados en el
formulario para pasrselos al mtodo execute() de la clase de accin en el objeto
de formulario dado por el parmetro ActionForm form. El objeto de formulario es
un JavaBean. Antes de pasarse los datos, el servlet puede validarlos y si no son
correctos desplegar mesajes de error en una pgina. En este caso en la misma
pgina con el formulario como se muestra en la figura 6.8

Figura 6.8 capturaClave.jsp con con mensaje de error, en un navegador


capturaClave.jsp
<%-capturaClave.jsp
Esta pgina JSP permite capturar la clave de una cancin a agregar
al catlogo de canciones. Forma parte de la aplicacin AmanteMusica
versin Struts
--%>
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html:html>
<head>

ITSON

Manuel Domitsu Kono

Tema 6

Struts

229

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


<link rel="stylesheet" type="text/css" href="estilos.css" />
<title>Amante Musica: Versin Struts - Captura Clave</title>
</head>
<body>
<%-- Incluye la barra de ttulo --%>
<%@include file="jspf/titulo.jspf"%>
<%-- Incluye el men --%>
<%@include file="jspf/menuCanciones.jspf"%>
<div class="principal">
<div class="contenido">
<%-- Formulario para capturar la clave y enviarla a la pgina
para obtener la cancin --%>
<html:form action="ObtenCancion.do" method="post">
<table class="centrada">
<%-- Despliega el encabezado en la pgina --%>
<caption>Cancin a agregar</caption>
<tr>
<td>Clave</td>
<td><html:text property="clave" size="35" /></td>
<td class="msjError"><html:errors property="clave" /></td>
</tr>
</table>
<br />
<br />
<table align="center" 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>
<%-- Guarda en la variable origen, el nombre de esta pgina. El
objeto de formulario CancionForm requiere saber de que pgina
se enva el formulario para validar los datos del formulario
--%>
<c:set value="capturaClave" var="origen" scope="session" />
</div>
</div>
</body>
</html:html>

En la pgina JSP capturaClave.jsp se usa los elementos <html:form>, <html:


submit>, <html:cancel> y <html:reset> para producir un formulario de HTML,
<form> y los botones <input type="submit">, <input type="reset">. Por

ITSON

Manuel Domitsu Kono

230

Struts

ltimo emplea el elemento <html: errors> para escribir un mensaje de error en


la salida de la pgina.
Cuando el usuario hace clic en el botn <html:submit> de la pgina JSP
capturaClave.jsp, los datos capturados en el formulario le son pasados al
mtodo execute() de la clase de accin, obtenCancinAction.java,
invocada por la pgina, en el parmetro ActionForm form. Esto se indica en el
elemento <action> de la clase de accin en archivo de configuracin strutsconfig.xml. En este elemento, el atributo name establece el nombre del objeto de
formulario empleado para pasar los datos; el atributo scope determina el mbito del
objeto de formulario que puede ser de solicitud (request) o de sesin (session),
el atributo valdate si tiene el valor true indica que se desea la validacin de los
datos, false en caso contrario y por ltimo, el atributo input establece el nombre
de la pgina en la que se desplegarn los mensajes de error generados en la
validacin de los datos.
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="cancionForm"
type="objetosFormularios.CancionForm"/>
...
</form-beans>
...
<action-mappings>
...
<action path="/ObtenCancion"
type="acciones.ObtenCancionAction"
name="cancionForm"
scope="session"
validate="true"
input="/capturaClave.jsp">
<forward name="cancelar"
path="/canciones.jsp" />
<forward name="cancionExistente"
path="/despliegaCancion.jsp" />
<forward name="obtenGenerosCanciones"
path="/ObtenGenerosCanciones.do" />
<exception type="java.lang.Exception"
key="errors.obtenCancion"
path="/error.jsp" />
</action>
...
</action-mappings>
...
</struts-config>

El objeto de formulario CancionForm.java es un Javabean en el que los atributos


en que se almacenan los valores capturados en el formulario son todos de tipo

ITSON

Manuel Domitsu Kono

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

Manuel Domitsu Kono

232

Struts

public String getClave() {


return clave;
}
/**
* Establece la clave de la cancin
* @param clave La clave de la cancin
*/
public void setClave(String clave) {
this.clave = clave;
}
/**
* Regresa el ttulo de la cancin
* @return El ttulo de la cancin
*/
public String getTitulo() {
return titulo;
}
/**
* Establece el ttulo de la cancin
* @param titulo El ttulo de la cancin
*/
public void setTitulo(String titulo) {
this.titulo = titulo;
}
/**
* Regresa el intrprete de la cancin
* @return El intrprete de la cancin
*/
public String getInterprete() {
return interprete;
}
/**
* Establece el intrprete de la cancin
* @param interprete El intrprete de la cancin
*/
public void setInterprete(String interprete) {
this.interprete = interprete;
}
/**
* Regresa el autor de la letra de la cancin
* @return El autor de la letra de la cancin
*/
public String getAutorLetra() {
return autorLetra;
}
/**
* Establece el autor de la letra de la cancin
* @param autorLetra El autor de la letra de la cancin
*/
public void setAutorLetra(String autorLetra) {
this.autorLetra = autorLetra;
}
/**

ITSON

Manuel Domitsu Kono

Tema 6

Struts

233

* Regresa el autor de la msica de la cancin


* @return El autor de la msica de la cancin
*/
public String getAutorMusica() {
return autorMusica;
}
/**
* Establece el autor de la msica de la cancin
* @param autorMusica El autor de la msica de la cancin
*/
public void setAutorMusica(String autorMusica) {
this.autorMusica = autorMusica;
}
/**
* Regresa el gnero de la cancin
* @return El gnero de la cancin
*/
public String getGenero() {
return genero;
}
/**
* Establece el gnero de la cancin
* @param genero El gnero de la cancin
*/
public void setGenero(String genero) {
this.genero = genero;
}
/**
* Regresa el lbum de la cancin
* @return El lbum de la cancin
*/
public String getAlbum() {
return album;
}
/**
* Establece el lbum de la cancin
* @param album El lbum de la cancin
*/
public void setAlbum(String album) {
this.album = album;
}
/**
* Regresa la disquera de la cancin
* @return La disquera de la cancin
*/
public String getDisquera() {
return disquera;
}
/**
* Establece la disquera de la cancin
* @param disquera La disquera de la cancin
*/
public void setDisquera(String disquera) {
this.disquera = disquera;

ITSON

Manuel Domitsu Kono

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

Manuel Domitsu Kono

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

Manuel Domitsu Kono

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;
}
}

El mtodo validate()regresa un objeto del tipo ActionErrors que contiene la


lista de mensajes de error de los errores encontrados por el mtodo validate().
Cada mensaje se encapsula en un objeto del tipo ActionMessage. El constructor
de la clase ActionMessage recibe como parmetro una cadena que es la llave
para encontrar el mensaje de error en un archivo de recursos. Para agregar un
mensaje de error se usa el mtodo add(String property, ActionMessage
error)de la clase ActionErrors. El parmetro property es el nombre del
atributo (o campo del formulario) con el dato errneo.
Para validar los diferentes campos del formulario se tienen un conjunto de funciones
para validar cadenas, enteros, fechas, etc. Estos mtodos se encuentran en la clase
Validador.java.
Validador.java
/*
* Validador.java
*
* Created on 14 de noviembre de 2006, 03:25 PM
*
* @author mdomitsu
*/
package utils;
import objetosServicio.Fecha;
/**
* Esta clase prove de mtodos para validar que las cadenas de sus
* parmetros representan a datos de los tipos especificados por el mtodo
*/
public class Validador {
/**
* Valida si su parmetro es una cadena no vaca.
* @param s Cadena a verificar
* @return True si la cadena no es vaca o nula, false en caso
* contrario.
*/
public boolean validaString(String s) {

ITSON

Manuel Domitsu Kono

Tema 6

Struts

237

return s != null && s.length() > 0;


}
/**
* Valida si su parmetro es un entero.
* @param s Cadena a verificar
* @return True si la cadena representa un entero, false en caso
* contrario.
*/
public boolean validaInt(String s) {
try {
int n = Integer.parseInt(s);
}
catch(NumberFormatException nfe) {
return false;
}
return true;
}
/**
* Valida si su parmetro representa una fecha en el formato dd/mm/aaaa.
* @param s Cadena a verificar
* @return True si la cadena representa una fecha en el formato
* dd/mm/aaaa, false en caso contrario.
*/
public boolean validaFecha(String s) {
try {
Fecha f = new Fecha(s);
}
catch(IllegalArgumentException iae) {
return false;
}
return true;
}
}

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

Manuel Domitsu Kono

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

Manuel Domitsu Kono

Tema 6

Struts

239

set(anho, mes-1, dia);


}
}

Si el usuario hizo clic en el botn <html:cancel> de la pgina JSP


capturaClave.jsp, no se hace validacin de los datos. En el mtodo execute()
de la clase de accin ObtenCancionAction.java se checa si el usuario hizo clic
en ese botn invocando al mtodo iscancelled() y de ser as se pasa el control a
la pgina de inicio index.jsp.
Por otro lado si el usuario hizo clic en el botn <html:submit> de la pgina JSP
capturaClave.jsp, el mtodo execute() de la clase de accin
ObtenCancionAction.java invoca al mtodo obten() de la clase
Fachada.java para buscar en la tabla canciones de la base de datos msica, la
cancin con la clave capturada en la pgina JSP capturaClave.jsp.
ObtenCancionAction.java
/*
* ObtenCancionAction.java
*
* Creada el 2 de noviembre de 2006, 09:33 PM
*/
package acciones;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import
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;
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

Manuel Domitsu Kono

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

Manuel Domitsu Kono

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);
}
}

Si en la clase de accin ocurre un error se lanza una excepcin. Esa excepcin es


capturada por el contenedor Web y se invoca a la pgina de error establecida en el
elemento <exception> dentro del elemento <action> en el archivo de
configuracin struts-config.xml.
Error.jsp
<%-error.jsp
Esta pgina JSP permite desplegar los mensajes de error de la
aplicacin AmanteMusica versin Struts.
--%>
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page isErrorPage="true" %>
<%@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 - Pgina de Error</title>
</head>
<body>
<h1 align="center">Pgina de Error</h1>
<br />
<br />
<%-- Despliega el mensaje de error --%>
<h3 class="msjError">
<html:errors />
</h3>
<%-- Formulario con un slo botn empleado para regresar a la pgina
con el men de tareas --%>
<form action="Inicio.do" method="post">
<table class="centrada">
<tr>
<td>
<%-- Botn Enviar --%>

ITSON

Manuel Domitsu Kono

242

Struts

<input type="submit" name="boton" value="Continuar" />


</td>
</tr>
</table>
</form>
</body>
</html:html>

Si la cancin no existe en la tabla de la base de datos, la clase de accin


ObtenCancionAction.java invoca a la clase de accin
ObtenGenerosCancionesAction.java para que obtenga un vector con la lista
de los gneros de las canciones, lo convierta a un arreglo y lo almacene en la
variable de mbito de sesin arregloGeneros.
ObtenGenerosCancionesAction.java
/*
* ObtenGenerosCanciones.java
*
* Creada el 10 de noviembre de 2008, 11:44 PM
*/
package acciones;
import
import
import
import
import
import
import

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

Manuel Domitsu Kono

Tema 6

Struts

243

* @param response La respuesta HTTP que se est procesando.


* @throws java.lang.Exception Si no se pudo obtener la lista de gneros
* @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;
Lista listaGeneros = new Lista();
Object arregloGeneros[];
// 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();
// Obten la lista de gneros de las canciones del catlogo de gneros
lista = fachada.consultaGenerosCanciones();
// Convierte el vector con la lista de gneros a un arreglo
listaGeneros.setLista(lista);
arregloGeneros = listaGeneros.getArreglo();
// Almacena el bean listaGeneros como una variable de mbito de
// sesin.
session.setAttribute("arregloGeneros", arregloGeneros);
// Si la tarea es "actualizarCancion"
if(tareaSel.equals("actualizarCancion"))
// Pasa el control a la pgina JSP "editaCancion.jsp"
return mapping.findForward(EDITA_CANCION);
// Si no, pasa el control a la pgina "capturaCancion.jsp"
return mapping.findForward(CAPTURA_CANCION);
}
}

El elemento <action> de la clase de accin


ObtenGenerosCancionesAction.java en archivo de configuracin strutsconfig.xml se muestra en el siguiente fragmento de cdigo.
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="/ObtenGenerosCanciones"
type="acciones.ObtenGenerosCancionesAction">

ITSON

Manuel Domitsu Kono

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>

Como se muestra en el elemento <action> de la clase de accin


ObtenGenerosCancionesAction.java en archivo de configuracin strutsconfig.xml, La clase de accin ObtenGenerosCancionesAction.java invoca
a la pgina JSP capturaCancion.jsp para capturar los datos de la cancin, tal
como se ve en la figura 6.9.

Figura 6.9 capturaCancion.jsp en un navegador


De igual manera que en el caso de la pgina JSP capturaClave.jsp si alguno de
los datos capturados en el formulario de la pgina JSP capturaCancion.jsp no
es vlido, se depliegan mensajes de error por cada dato invlido, como se muestra
en la figura 6.10.

ITSON

Manuel Domitsu Kono

Tema 6

Struts

245

Figura 6.10 capturaCancion.jsp con mensajes de error, en un navegador


capturaCancion.jsp
<%-capturaCancion.jsp
Esta pgina JSP permite capturar los datos de una cancin. Forma parte
de la aplicacin AmanteMusica versin Struts.
--%>
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@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 Musica: Versin Struts - Captura Cancin</title>
</head>
<body>
<%-- Incluye la barra de ttulo --%>
<%@include file="jspf/titulo.jspf"%>
<%-- Incluye el men --%>
<%@include file="jspf/menuCanciones.jspf"%>
<div class="principal">

ITSON

Manuel Domitsu Kono

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>&nbsp;</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>&nbsp;</td>
</tr>
<tr>
<td class="derecha">Album</td>
<td><html:text property="album" size="35" /></td>

ITSON

Manuel Domitsu Kono

Tema 6

Struts

247

<td class="msjError"><html:errors property="album" /></td>


</tr>
<tr>
<td class="derecha">Disquera</td>
<td><html:text property="disquera" size="35" /></td>
<td class="msjError">
<html:errors property="disquera" />
</td>
</tr>
<tr>
<td class="derecha">Duracin</td>
<td><html:text property="duracion" size="5" /></td>
<td class="msjError">
<html:errors property="duracion" />
</td>
</tr>
<tr>
<td class="derecha">Fecha</td>
<td><html:text property="fecha" size="10" /></td>
<td class="msjError"><html:errors property="fecha" /></td>
</tr>
</table>
<br />
<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>
<%-- Guarda en la variable origen, el nombre de esta pgina. El
objeto de formulario CancionForm requiere saber de que pgina
se enva el formulario para validar los datos del formulario
--%>
<c:set value="capturaCancion" var="origen" scope="session" />
</div>
</div>
</body>
</html:html>

El mtodo execute() de la clase de accin AgregarCancionAction.java


checa si el usuario hizo clic en ese botn invocando al mtodo iscancelled() y
de ser as se pasa el control a la pgina canciones.jsp. Si no, el mtodo
execute()invoca al mtodo agrega() de la clase Fachada.java para
almacenar la cancin en la tabla canciones de la base de datos musica. Por ltimo
le pasa el contol a la clase de accin ObtenCancionesAction para obtener la lista
de canciones y desplegarlas.

ITSON

Manuel Domitsu Kono

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

Manuel Domitsu Kono

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);
}
}

El elemento <action> de la clase de accin AgregarCancionAction.java en


archivo de configuracin struts-config.xml se muestra en el siguiente
fragmento de cdigo.

ITSON

Manuel Domitsu Kono

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>

Como se muestra en el elemento <action> de la clase de accin


AgregarCancionAction.java en archivo de configuracin strutsconfig.xml si hay xito al guardar 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.
ObtenCancionesAction.java
/*
* ObtenCancionesAction.java
*
* Creada el 2 de noviembre de 2006, 11:31 AM
*/
package acciones;

ITSON

Manuel Domitsu Kono

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

Manuel Domitsu Kono

252

Struts

// Obtiene el vector con la lista de canciones


lista = fachada.consultaCanciones();
// Almacena la lista de canciones en el bean listaCanciones
// convertido de un vector a un arreglo
listaCanciones.setLista(lista);
// Almacena el ttulo de la tabla de canciones en el bean
// listaCanciones
listaCanciones.setTituloTabla("Lista de todas las Canciones");
// Almacena el bean listaCanciones como una variable de mbito de
// sesin. El nombre de la variable es listacanciones y est
// disponible para las pginas jsp usando la accin <jsp:useBean>
session.setAttribute("listaCanciones", listaCanciones);
// Si la tarea es "actualizarCancion"
if(tareaSel.equals("actualizarCancion"))
// Pasa el control a la pgina JSP "seleccionaCancionActualizar.jsp"
return mapping.findForward(SEL_CANCION_ACTUALIZAR);
// Si la tarea es "eliminarCanciones"
if(tareaSel.equals("eliminarCanciones"))
// Pasa el control a la pgina JSP
// "seleccionarCancionesEliminar.jsp"
return mapping.findForward(SEL_CANCIONES_ELIMINAR);
// Pasa el control a la pgina JSP "despliegaCanciones.jsp""
return mapping.findForward(DESPLIEGA_CANCIONES);
}
}

La clase de accin ObtenCancionesAction.java almacena la lista de canciones


en la variable listaCanciones es del tipo Lista.java
y luego le pasa el control a la pgina JSP seleccionaCancionActualizar.jsp,
seleccionaCancionesEliminar.jsp o a despliegaCanciones.jsp
dependiendo si el caso de uso es Actualizar Cancin, Eliminar Canciones o Listar
Canciones, respectivamente, como se muestra en el fragmento del archivo de
configuracin struts-config.xml.
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="/ObtenCanciones"
type="acciones.ObtenCancionesAction">
<forward name="selCancionActualizar"
path="/seleccionaCancionActualizar.jsp" />
<forward name="selCancionesEliminar"
path="/seleccionaCancionesEliminar.jsp" />

ITSON

Manuel Domitsu Kono

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>

La pgina JSP despliegaCanciones.jsp toma de la variable listaCanciones la


lista de las canciones y las despliega, como se muestra en la figura 6.11.

Figura 6.11 despliegaCanciones.jsp en un navegador


despliegaCanciones.jsp
<%-despliegaCanciones.jsp
Esta pgina JSP despliega una tabla con la lista de canciones del
catlogo de canciones. Forma parte de la aplicacin AmanteMusica
versin Struts.
--%>
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"
%>

ITSON

Manuel Domitsu Kono

254

Struts

<%@page import="objetosNegocio.*" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<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 - Despliega Canciones</title>
</head>
<body>
<%-- En este bean de tipo ArregloCanciones, se almacena la lista de
canciones ledas de la tabla canciones de la base de datos
musica, convertida de un vector a un arreglo.
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">
<%-- Tabla donde se muestran los datos de todas las canciones --%>
<table class="centrada" border="1">
<%-- Ttulo de la tabla --%>
<caption>${listaCanciones.tituloTabla}</caption>
<tr>
<%-- Ttulos de las columnas --%>
<th align="center">Clave</th>
<th align="center">Ttulo</th>
<th align="center">Intrprete</th>
<th align="center">Autor Letra</th>
<th align="center">Autor Msica</th>
<th align="center">Gnero</th>
<th align="center">Album</th>
<th align="center">Disquera</th>
<th align="center">Duracin</th>
<th align="center">Fecha</th>
</tr>
<c:forEach items="${listaCanciones.arreglo}" var="cancion" >
<%-- Inserta en cada celda de una fila de la tablas
uno de los atributos de la cancin --%>
<tr>
<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>

ITSON

Manuel Domitsu Kono

Tema 6

Struts

255

<td>${cancion.disquera}</td>
<td>${cancion.duracion}</td>
<td>${cancion.fecha}</td>
</tr>
</c:forEach>
</table>
</div>
</div>
</body>
</html>

Si la cancin existe en la tabla de la base de datos la clase de accin


ObtenCancionAction.java invoca a la pgina JSP despliegaCancion.jsp
para desplegar los datos de la cancin existente, como se muestra en la figura 6.12.

Figura 6.12 despliegaCancion.jsp con mensaje de error, en un navegador


despliegaCancion.jsp
<%-despliegaCancion.jsp
Esta pgina JSP despliega los datos de una cancin. Forma parte de
la aplicacin AmanteMusica versin Struts.
--%>
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>

ITSON

Manuel Domitsu Kono

256

Struts

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"


"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Amante Msica: Versin Struts - Despliega Cancin</title>
<link rel="stylesheet" type="text/css" href="estilos.css" />
</head>
<body>
<%-- En este bean de tipo Cancin, estn almacenados los atributos de
una cancin leda de la tabla canciones de la base de datos
musica por obtenCancion.jsp. Estos datos estn disponibles para
otras JSPs en la misma sesin --%>
<jsp:useBean id="cancion" scope="session"
class="objetosNegocio.Cancion" />
<%-- Incluye la barra de ttulo --%>
<%@include file="jspf/titulo.jspf"%>
<%-- Incluye el men --%>
<%@include file="jspf/menuCanciones.jspf"%>
<div class="principal">
<div class="contenido">
<%-- Despliega los datos de la cancin
Se obtiene cada uno de los atributos del bean cancion y
se despliegan en la tabla. Una cancin por rengln--%>
<table class="centrada">
<%-- Despliega el encabezado en la pgina --%>
<caption>Cancin Existente</caption>
<tr>
<td
<td
<tr>
<td
<td
</tr>
<tr>
<td
<td
</tr>
<tr>
<td
<td
</tr>
<tr>
<td
<td
</tr>
<tr>
<td
<td
</tr>
<tr>
<td
<td

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>

Manuel Domitsu Kono

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.

Figura 6.13 Diagrama de Secuencia. Caso de Uso Actualizar Cancin


En el caso de uso Actualizar Cancin, 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 musica,
invocando al mtodo consultaCanciones de la clase Fachada.java y la almacene
en la variable listaCanciones. La clase de accin
ObtenCancionesAction.java luego le pasa el control a la pgina JSP
seleccionaCancionActualizar.jsp que despliega una tabla con la lista de las
canciones para que el usuario seleccione la cancin a editar, figura 6.15.

ITSON

Manuel Domitsu Kono

258

Struts

Figura 6.14 Diagrama de Secuencia. Caso de Uso Actualizar Cancin (Cont).

Figura 6.15 seleccionaCancionActualizar.jsp en un navegador web


Para seleccionar la cancin a editar, el usuario hace clic en el botn de radio
correspondiente a la cancin deseada. Cada botn de radio de la pgina se
establece mediante el elemento <html:radio> de la bibioteca html de Struts. El
parmetro property del elemento <html:radio> es el nombre del atributo del

ITSON

Manuel Domitsu Kono

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

Manuel Domitsu Kono

260

Struts

<th>&nbsp;</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

Manuel Domitsu Kono

Tema 6

Struts

261

La pgina le pasa el control a la clase de accin


ObtenCancionEditarAction.java guardando en el atributo seleccion del
Javabean SeleccionForm.java el ndice de la cancin seleccionada mediante un
botn de radio en la pgina.
SeleccionForm.java
/*
* SeleccionForm.java
*
* Creada el 15 de abril de 2008, 03:58 PM
*/
package objetosFormularios;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
/**
* Este objeto de formulario permite la transferencia de la opcin
* seleccionada en un botn de radio o de las opciones seleccionadas
* casillas de verificacin
*
* @author mdomitsu
* @version
*/
public class SeleccionForm extends org.apache.struts.action.ActionForm {
private String seleccion;
private String selecciones[];
/**
* Constructor vaco
*/
public SeleccionForm() {
super();
}
/**
* Este mtodo regresa la opcin seleccionada en un botn de radio
* @return La opcin seleccionada en un botn de radio
*/
public String getSeleccion() {
return seleccion;
}
/**
* Este mtodo establece la opcin seleccionada en un botn de radio
* @param seleccion La opcin seleccionada en un botn de radio
*/
public void setSeleccion(String seleccion) {
this.seleccion = seleccion;
}
/**
* Este mtodo regresa las opciones seleccionadas en las casillas
* de verificacin
* @return Las opciones seleccionadas en las casillas
* de verificacin
*/
public String[] getSelecciones() {

ITSON

Manuel Domitsu Kono

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;
}
}

La clase de accin ObtenCancionEditarAction.java obtiene del objeto de


formulario SeleccionForm.java el ndice de la cancin seleccionada de la lista de
canciones y lo utiliza para obtener la cancin. Toma los valores de los atributos de la
cancin y los copia a los atributos del objeto de formulario CancionForm.java
para que sean desplegados en la pgina editaCancin.jsp. Por ltimo guarda el
objeto de formulario en el objeto session.
ObtenCancionEditarAction.java
/*
* ObtenCancionEditarAction.java
*
* Creada el 15 de abril de 2008, 04:24 PM
*/
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.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

Manuel Domitsu Kono

Tema 6

Struts

263

* editar. El ndice de la cancin seleccionada est en el atributo


* seleccion del objeto de formulario.
*
* @author mdomitsu
* @version
*/
public class ObtenCancionEditarAction 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 OBTENER_GENEROS_CANCIONES =
"obtenGenerosCanciones";
private final static String EDITA_CANCION = "editaCancion";
/**
* Este mtodo implementa la accin de obtener la cancin seleccionada
* de la lista 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 {
// Si el usuario presion el botn Cancelar en la pgina
// "seleccionaCancionActualizar.jsp"
if(isCancelled(request)) {
// pasa el control a la pgina "canciones.jsp"
return mapping.findForward(CANCELAR);
}
HttpSession session = request.getSession();
// Obten la lista de las canciones de la variable de sesin
// listaCanciones
Lista listaCanciones= (Lista) session.getAttribute("listaCanciones");
// Obtn el ndice de la cancin a actualizar
int nSel = Integer.parseInt(((SeleccionForm)form).getSeleccion());
// Obtn la cancin a actualizar de la lista de canciones
Cancion cancionActualizar = (Cancion)listaCanciones.getLista()
.elementAt(nSel);
// Si la cancin existe en la base de datos
if(cancionActualizar != null) {
// Crea un objeto de formulario CancionForm
CancionForm cancionForm = new CancionForm();
// Copia los atributos de la cancin a actualizar al objeto
// de formulario cancionForm para que sean desplegados en la
// pgina editaCancion.jsp
cancionForm.setClave(cancionActualizar.getClave());

ITSON

Manuel Domitsu Kono

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

Manuel Domitsu Kono

Tema 6

Struts

265

En la pgina editaCancion.jsp, figura 6.16, los elementos <html:text> de la


biblioteca html de Struts despliegan los valores que se encuentran en el objeto de
formulario CancionForm.java y permiten que el usuario los modifique. Los datos
modificados son enviados a la clase de accin ActualizarCancionAction.jsp
en el objeto de formulario CancionForm.java.

Figura 6.16 editaCancion.jsp en un navegador web


editaCancion.jsp
<%-editaCancion.jsp
Esta pgina JSP permite editar los datos de una cancin. Forma parte
de la aplicacin AmanteMusica versin Struts.
--%>
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@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" />

ITSON

Manuel Domitsu Kono

266

Struts

<link rel="stylesheet" type="text/css" href="estilos.css" />


<title>Amante Musica: Versin Struts - Actualiza Cancin</title>
</head>
<body>
<%-- Incluye la barra de ttulo --%>
<%@include file="jspf/titulo.jspf"%>
<%-- Incluye el men --%>
<%@include file="jspf/menuCanciones.jspf"%>
<div class="principal">
<div class="contenido">
<%-- Formulario para actualizar los atributos de una cancin.
Los valores capturados se envan a la clase de accin
ActualizarCancionAction
--%>
<html:form action="ActualizarCancion.do" method="post">
<%-- Despliega los datos de la cancin
Se obtiene cada uno de los atributos del bean cancion y
se despliegan en los campos de texto del formulario --%>
<table class="centrada">
<%-- Despliega el encabezado en la pgina --%>
<caption>Actualiza Cancin</caption>
<%-- Los campos de texto despliegan los valores de los
atributos almacenadados en el objeto de formulario
CancionActionForm, que a se llen de la cancin
seleccionada en la clase de accin
ObtenCancionEditarAction.java
--%>
<tr>
<td class="derecha">Clave</td>
<td>
<html:text property="clave" size="35" readonly="true" />
</td>
<td>&nbsp;</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">

ITSON

Manuel Domitsu Kono

Tema 6

Struts

267

<html:errors property="autorMusica" />


</td>
</tr>
<tr>
<td class="derecha">Gnero</td>
<td>
<html:select property="genero" >
<html:options collection="arregloGeneros"
property="cveGenero"
labelProperty="nombre" />
</html:select>
</td>
<td>&nbsp;</td>
</tr>
<tr>
<td class="derecha">Album</td>
<td><html:text property="album" size="35" /></td>
<td class="msjError"><html:errors property="album" /></td>
</tr>
<tr>
<td class="derecha">Disquera</td>
<td><html:text property="disquera" size="35" /></td>
<td class="msjError">
<html:errors property="disquera" />
</td>
</tr>
<tr>
<td class="derecha">Duracin</td>
<td><html:text property="duracion" size="5" /></td>
<td class="msjError">
<html:errors property="duracion" />
</td>
</tr>
<tr>
<td class="derecha">Fecha</td>
<td><html:text property="fecha" size="10" /></td>
<td class="msjError"><html:errors property="fecha" /></td>
</tr>
</table>
<br />
<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" />
<%-- Botn restaurar --%>
<td><html:reset value="Restaurar" /></td>
</tr>
</table>
</html:form>
<%-- Guarda en la variable origen, el nombre de esta pgina. El
objeto de formulario CancionForm requiere saber de que pgina
se enva el formulario para validar los datos del formulario
--%>

ITSON

Manuel Domitsu Kono

268

Struts

<c:set value="editaCancion" var="origen" scope="session" />


</div>
</div>
</body>
</html:html>

La clase de accin ActualizarCancionAction.jsp crea un objeto de tipo


Cancion usando los valores en los atribulos del objeto de formulario
CancionForm.java y por ltimo invoca al mtodo actualiza() de la fachada
para actualizar la cancin en la tabla de la base de datos.
ActualizarCancionAction.jsp
/*
* ActualizarCancionAction.java
*
* Creada el 21 de agosto de 2007, 09:15 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

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

Manuel Domitsu Kono

Tema 6

Struts

269

* @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
// "editaCancion.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 "canciones.jsp"
return mapping.findForward(CANCELAR);
}
// Crea el objeto para acceder a la base de datos
IFachada fachada = new FachadaBD();
// 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 editaCancion.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()));
// Actualiza la cancin del catlogo
fachada.actualiza(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

Manuel Domitsu Kono

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

Manuel Domitsu Kono

Tema 6

Struts

271

pasarle los valores del formulario a la clase de accin y el parmetro value es el


valor que se le asignar al atributo.

Figura 6.17 Diagrama de Secuencia. Caso de Uso Eliminar Canciones

Figura 6.18 seleccionaCancionesEliminar.jsp en un navegador web

ITSON

Manuel Domitsu Kono

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

Manuel Domitsu Kono

Tema 6

Struts

273

<%-- Ttulos de las columnas --%>


<th>&nbsp;</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>
<%-- 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:checkbox property="selecciones" 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>

ITSON

Manuel Domitsu Kono

274

Struts

</html:html>

La clase de accin EliminarCancionesAction.java obtiene del objeto de


formulario SeleccionForm.java los ndices de las canciones seleccionadas de la
lista de canciones y los utiliza para obtener sus respectivas canciones de la lista de
canciones. Por ltimo con cada cancin invoca al mtodo elimina() de la fachada
para eliminar la cancin en la tabla de la base de datos.
EliminarCancionesAction.java
/*
* EliminarCancionesAction.java
*
* Creada el 15 de abril de 2008, 10:32 PM
*/
package acciones;
import
import
import
import

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

Manuel Domitsu Kono

Tema 6

Struts

275

public ActionForward execute(ActionMapping mapping, ActionForm form,


HttpServletRequest request, HttpServletResponse response)
throws Exception {
HttpSession session = request.getSession();
// Si el usuario presion el botn Cancelar en la pgina
// "seleccionaCancionesEliminar"
if(isCancelled(request)) {
// Pasa el control a la pgina " canciones.jsp"
return mapping.findForward(CANCELAR);
}
Lista listaCanciones= (Lista) session.getAttribute("listaCanciones");
// Obtn los ndices de las canciones a eliminar
String sels[] = ((SeleccionForm)form).getSelecciones();
// Obten el nmero de canciones a eliminar
int nCanciones = sels.length;
// Crea el objeto para acceder a la base de datos
IFachada fachada = new FachadaBD();
try {
// Para cada cancin a eliminar
for(int i = 0; i < nCanciones; i++) {
// Obtn el ndice de la cancin a eliminar
int nSel = Integer.parseInt(sels[i]);
// Obtn la cancin a eliminar de la lista de canciones
Cancion cancion = (Cancion)listaCanciones.getLista()
.elementAt(nSel);
// Elimina la cancin del catlogo
fachada.elimina(cancion);
}
}
catch (FachadaException fe) {
// Si ocurri un error al eliminar una cancin del catlogo de
// canciones, arroja una excepcin que ser cachada y desplegada en
// la pgina de error
throw new javax.servlet
.ServletException("Error al eliminar la cancin",
fe);
}
// 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

Manuel Domitsu Kono

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

Manuel Domitsu Kono

Tema 6

Struts

277

Figura 4.19 despliegaCanciones.jsp en un navegador

En Struts los mensajes de error son instancias de la clase AccionMessage y se


almacenan en la lista de errores dada por la clase ActionErrors. Para construir un
mensaje de error, el constructor de la clase recibe una cadena que es la llave para
obtener el verdadero mensaje de error. Los mensajes de error se encuentran en el
archivo ApplicationResource.properties. Para esta aplicacin, este archivo
es:
ApplicationResource.properties
errors.header=<UL>
errors.prefix=<LI>
errors.suffix=</LI>
errors.footer=</UL>
errors.invalid={0} es invlido.
errors.maxlength={0} no puede ser mayor de {1} caracteres.
errors.minlength={0} no puede ser menor de {1} caracteres.
errors.range={0} no est en el rango {1} a {2}.
errors.required=Falta {0}.
errors.byte={0} debe ser un byte.
errors.date={0} no es una fecha.
errors.double={0} debe ser un doble.
errors.float={0} debe ser un flotante.
errors.integer={0} debe ser un entero.
errors.long={0} debe ser un largo.
errors.short={0} debe ser un corto.
errors.creditcard={0} No es un nmero de crdito vlido.
errors.email={0} no es una direccin e-mail vlido.
errors.cancel=Operacin cancelada.

ITSON

Manuel Domitsu Kono

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

El siguiente listado es el archivo de configuracin struts-config.xml completo para


esta aplicacin.
struts-config.xml
<?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="cancionForm"
type="objetosFormularios.CancionForm"/>
<form-bean name="seleccionForm"
type="objetosFormularios.SeleccionForm"/>
</form-beans>
<global-exceptions>
</global-exceptions>
<global-forwards>
<forward name="inicio" path="/index.jsp" />
</global-forwards>
<action-mappings>
<action path="/Control"
type="acciones.ControlAction">
<forward name="capturaClave"
path="/capturaClave.jsp" />
<forward name="obtenCanciones"
path="/ObtenCanciones.do" />
<forward name="capturaGenero"
path="/capturaGenero.jsp" />
<forward name="capturaPeriodo"
path="/capturaPeriodo.jsp" />
</action>
<action path="/ObtenCancion"

ITSON

Manuel Domitsu Kono

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

Manuel Domitsu Kono

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

Manuel Domitsu Kono

Tema 6

Struts

281

<set-property property="moduleAware" value="true" />


</plug-in>
<!-- ================== Validator plugin ========================= -->
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property
property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
</struts-config>

ITSON

Manuel Domitsu Kono

Anda mungkin juga menyukai