Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones...

77
ITSON Manuel Domitsu Kono Tema 6 Struts El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC). Un marco es una aplicación semicompleta, reutilizable que puede especializarse para construir aplicaciones. Le proveen al desarrollador de una estructura reutilizable que sirva como cimiento para construir aplicaciones específicas. Un marco provee a los desarrolladores de un conjunto de componentes dorsales que tienen las siguientes características: Se sabe que trabajan bien en otras aplicaciones. Están listas para trabajar en el siguiente projecto. Pueden ser usadas por otros equipos de la organización. El patrón de diseño 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 patrón de diseño MVC. Componente Descripción Modelo Representa los objetos del negocio. El modelo es lo que se manipula y se presenta al usuario. Vista Es la representación en pantalla del modelo. Es el objeto que presenta el estado actual de los objetos del negocio Controlador 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: Confiabilidad: Las capas de presentación y transacción tienen una clara separación, lo que permite cambiar la apariencia de la aplicación sin recompilar el código del modelo o del controlador.

Transcript of Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones...

Page 1: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

ITSON Manuel Domitsu Kono

Tema 6

Struts

El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC). Un marco es una aplicación semicompleta, reutilizable que puede especializarse para construir aplicaciones. Le proveen al desarrollador de una estructura reutilizable que sirva como cimiento para construir aplicaciones específicas. Un marco provee a los desarrolladores de un conjunto de componentes dorsales que tienen las siguientes características:

• Se sabe que trabajan bien en otras aplicaciones. • Están listas para trabajar en el siguiente projecto.

• Pueden ser usadas por otros equipos de la organización.

El patrón de diseño 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 patrón de diseño MVC. Componente Descripción

Modelo Representa los objetos del negocio. El modelo es lo que se manipula y se presenta al usuario.

Vista Es la representación en pantalla del modelo. Es el objeto que presenta el estado actual de los objetos del negocio

Controlador 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:

• Confiabilidad: Las capas de presentación y transacción tienen una clara separación, lo que permite cambiar la apariencia de la aplicación sin recompilar el código del modelo o del controlador.

Page 2: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

206 Struts

ITSON Manuel Domitsu Kono

• Reutilización y Adaptabilidad: El modelo MVC permite el uso de múltiples tipos de vistas, todas accediendo al mismo código en el lado del servidor, desde navegadores Web (HTTP) a navegadores inalámbricos (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 Rápido: El tiempo de desarrollo de la aplicación 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 presentación.

• Mantenibilidad: La separación entre la presentación y la lógica del negocio

permite fácilmente mantener y modificar una aplicación basada en Struts.

La Implementación del Modelo MVC de Struts El marco Struts modela su implementación del lado del servidor del MVC usando Servlets, JSP, Elementos JSP (Etiquetas), JavaBeans y otras clases de Java, figura 6.1.

Figura 6.1 Implementación del Modelo MVC con Struts

La figura 6.1 muestra como los diferentes elementos de Struts interactúan para dar respuesta a una solicitud.

a) El usuario hace una solicitud al servidor Web mediante un navegador (1).

Page 3: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 207

ITSON Manuel Domitsu Kono

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 configuración llamado “struts-config.xml” y determina el nombre de la clase de acción que realizará la lógica de los negocios necesaria para obtener la respuesta (2).

c) La clase de acción, que forma parte del Controlador ejecuta la lógica contenida en los componentes del Modelo (3, 4).

d) Cuando la clase de acción termina su procesamiento le regresa el control al servlet, regresándole 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 presentación.

f) El servlet responde enviando la solicitud a la vista que estaba ligada a la clave regresada por la clase de acción (6). Aquí se genera la respuesta procesando la página JSP.

g) Por último la respuesta generada se envía 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 acción. Un servlet es una componente que interactúa 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 acción que procesará la solicitud. Cuando la clase de acción 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 acción.

ActionServlet El servlet del Controlador de Struts es una instancia de la clase org.apache.struts.action.ActionServlet. La creación de la instancia de esta clase es responsabilidad del contenedor de JSP. La información que requiere este servlet para hacer su trabajo se la suministraremos en un archivo de configuración XML, llamado “web.xml”. Cada aplicación Web debe tener un archivo “web.xml”. Por ejemplo, el archivo “web.xml” de la aplicación 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>

Page 4: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

208 Struts

ITSON Manuel Domitsu Kono

<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 información: <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.

Page 5: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 209

ITSON Manuel Domitsu Kono

<init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> Establece el nombre del archivo de configuración 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 extensión ".do", les quitará la extensión y usará la cadena restante como la ruta, relativa al contexto, de la clase de acción a ejecutar. <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> Establece el nombre de la página inicial de la aplicación.

Clases de Acción Como ya se mencionó antes, las clases de acción son las encargadas de ejecutar la lógica contenida en la componente Modelo de Struts. Una vez ejecutada la lógica del Modelo, las clases de acción le envían a la instancia de la clase ActionServlet una clave para que el servlet seleccione la Vista que desplegará los resultados de la ejecución de la lógica. Aunque hay varias variantes de clases de acción las más 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 acción que requiramos para ejecutar una tarea de la lógica de los negocios debe heredar de la clase Action. El siguiente código muestra el esqueleto de una de clase de acción:

MiAction.java package acciones import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForward; public class MiAction extends Action { // Constantes simbólicas para las páginas JSP a las que se le pasará el // control private final static String EXITO = "exito";

Page 6: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

210 Struts

ITSON Manuel Domitsu Kono

/** * * @param mapping La instancia de ActionMapping, el mapa empleado para * seleccionar esta clase de acción. * @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 código que ejecuta la lógica del Modelo // Pasa el control a la página JSP que mostrará los resultados return mapping.findForward(EXITO); } }

Cada clase hija de la clase Action debe sobrescribir el método execute() de la clase padre. Este método es el encargado de ejecutar una tarea específica invocando la lógica contenida en el Modelo. La sintaxis de éste método es: Cada clase hija debe sobrescribir el método 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 parámetros del método execute().

Tabla 6.2 Parámetros del método execute() de las clases de acción Parámetro Descripción

AccionMapping Contiene toda la información sobre el despliegue de la acción. Esta clase se utilizará para determinar a donde se enviarán los resultados después que la ejecución del método termine.

ActionForm Es un JavaBean que representa el objeto de formulario que contiene los parámetros del formulario de la página que llamó a esta clase de acción. En el caso de que la página llamante no tenga un formulario, este parámetro será null. Nota: El formulario y sus elementos deben declararse con los elementos de la biblioteca de etiquetas html de Struts.

HttpServletRequest Es una referencia al objeto request. HttpServletResponse Es una referencia al objeto response. El método relanza una excepción del tipo java.lang.Exception si en alguna de las sentencias del método ocurre una excepción.

Page 7: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 211

ITSON Manuel Domitsu Kono

La Clase ForwardAction Si sólo se desea transferir el control de una página JSP a otra, esto es, si el método execute() de la clase de acción no ejecuta ninguna lógica del Modelo, podemos utilizar una clase especial de clase de acción llamada ForwardAction. Dado que no hay método execute() que sobrescribir, no se requiere heredar de esta clase. Como las instancias de esta clase son creadas por el contenedor Web, sólo es necesario configurar estas instancias en el archivo de configuración struts-config.xml.

Configuración de una Clase de Acción Cada una de las instancias de una clase de acción: Action o ForwardAction, es creada por el contenedor Web. Para hacerlo, el contenedor extrae la información necesaria para cada instancia de un elemento <action> del archivo struts-config.xml. Los elementos <action> se encuentran en la sección <action-mappings> de éste archivo. El siguiente recuadro muestra un listado parcial del archivo de configuración 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>

Page 8: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

212 Struts

ITSON Manuel Domitsu Kono

Cada elemento <action> describe una instancia de una clase de acción. 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 Descripción

path 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.

type Nombre completamente calificado de la clase de acción descrita pr este elemento. Este atributo sólo es usado si no especifica un atributo include o forward. Este atributo es opcional.

name Nombre del objeto de formulario (form bean o action form) asociado con esta acción. Este atributo es opcional.

scope Ámbito del objeto del objeto del formulario asociado con esta acción. Este atributo es opcional. El valor por omisión es de session.

input Representa la ruta relativa al contexto de la página con el formulario a la que se regresará el control en caso de que haya un error de validación. Este atributo es opcional.

forward Representa la ruta relativa al contexto de la página a la que se le pasará el control si no se desea llamar a una clase de acción. Este atributo sólo es usado si no especifica un atributo include o type. Este atributo es opcional.

incluye Representa la ruta relativa al contexto de la página cuya respuesta será incluida si no se desea llamar a una clase de acción. Este atributo sólo es usado si no especifica un atributo forward o type. Este atributo es opcional.

validate Valor booleano que indica si se invocará al método validate() del objeto de formulario (form bean o action form) asociado con esta acción. Debe llamarse a este método antes de la llamada al método execute() de esta acción. Este atributo es opcional su valor por omisión es true.

La Clase ActionForward Al terminar su ejecución, el método execute()de una clase de acción, regresa el objeto obtenido al invocar al método findForward() sobre su parámetro mapping. El objeto que regresan los métodos findForward() y execute(), es una instancia de la clase org.apache.struts.action.ActionForward que representa la ruta relativa de la página JSP que constituye la vista en la que el servlet presentará los resultados obtenidos por la clase de acción.

Elemento forward El parámetro del método findForward() es una cadena que es el nombre lógico con el que se conocerá a la ruta relativa al contexto de la pagina JSP. El mapeo entre el nombre lógico y la ruta a la página está dado por un elemento <forward> en el el archivo de configuración struts-config.xml. Los elementos <forward> pueden ir dentro del cuerpo de un elemento <action> para indicar a que página o páginas les puede pasar el control esa clase de acción. También puede formar parte del elemento <global-forwards> que denotan las páginas destinos a las que pueden pasarle el control cualquier clase de acción. En el código del segmento anterior se muestran ambos casos de elementos <forward>.

Page 9: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 213

ITSON Manuel Domitsu Kono

La tabla 6.4 describe cada uno de los atributos que puede tener el elemento <forward>.

Tabla 6.4. Atributos del elemento <forward>. Atributo Descripción

name Nombre único empleado para referenciar a la página destino en la aplicación. Este atributo es obligatorio.

path 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.

redirect Valor booleano que indica si el ActionSerlet debe realizar un forward o un redirect para invocar a la página. Este atributo es opcional su valor por omisión es false.

La Vista La componente Vista del modelo MVC nos permite visualizar el estado del modelo en la interfaz de usuario de la aplicación Web. Por lo general, cada una de las vistas en el marco Struts se crea usando páginas JSP. Adicionalmente o en conjunción con las páginas JSP podemos usar las siguientes componentes:

• Documentos HTML: Si una de las vistas de la aplicación Web contiene sólo contenido estático se puede utilizar una página HTML, sin embargo al hacerlo no se podrían emplear muchos de los mecanismos automáticos del marco Struts.

• Bibliotecas de Etiquetas JSP: Podemos emplear los elementos de acción

(etiquetas) de JSTL en las páginas JSP de Struts así como elementos de acción de otros desarrolladores. Adicionalmente, el marco Struts nos provee de una biblioteca de etiquetas que podemos emplear en la construcción de las páginas JSP.

• JavaScript: JavaScript es un lenguaje de propósito general. En las páginas

JSP se emplea para incrustar código como parte de los elementos de JSP que es ejecutado del lado del cliente y permite realizar ciertas tareas como animaciones, verificación, 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 páginas HTML. • Archivos multimedia: En una aplicación Web usando el marco Struts,

podemos incluir imágenes, audio, video., etc. • Archivos de recursos de mensajes: También llamados simplemente

archivos de recursos, son archivos texto que asocian identificadores (normbres) a mensajes. El uso de estos archivos permite la “localización” de la aplicación así como a reducir el tiempo de mantenimiento y la redundancia del código en la aplicación.

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:

Page 10: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

214 Struts

ITSON Manuel Domitsu Kono

• Capturan los datos de un formulario HTML de una página JSP. • Validan los datos. • Si no hay errores de validación, transfieren los datos a una clase de acción. • En caso contrario, transfieren los datos a la página 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 aplicación, por ejemplo si un formulario sólo contiene botones “Enviar”. Por otro lado podemos compartir el mismo objeto de formulario con varios formularios HTML, por ejemplo si utilizamos varias páginas para capturar datos que se van a procesar juntos como en el caso de un asistente que ocupa varias páginas.

Ámbitos de los Objetos de Formularios Los objetos de formulario pueden tener dos diferentes tipos de ámbito: De solicitud (request) y de sesión (session). Si se utiliza el ámbito de solicitud, el objeto de formulario estará disponible hasta que se envíe 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 sesión, por ejemplo si utilizamos varias páginas para capturar datos que se van a procesar juntos como en el caso de un asistente que ocupa varias páginas. 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 sesión.

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 parámetro name para asociarle un objeto de formulario a una clase de acción, entonces se crea el objeto de formulario si no existe o se reutiliza el existente.

2. Se invoca al método 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 método validate() del objeto de formulario para validar los

datos. este método sólo es invocado si el atributo validate del elemento <action> tiene el valor de true.

6. Si no hubo errores de validación, se invoca al método execute() de la clase de acción de la solicitud.

7. Después de ejecutar el método execute() se pasa el control a la página establecida en el objeto ActionForward.

8. Si hubo errores de validación, se pasa el control a la página establecida por el atributo input del elemento <action>, que normalmente es la página con el formulario.

Page 11: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 215

ITSON Manuel Domitsu Kono

Creación 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 vacío.

• Métodos de acceso para cada uno de los atributos.

• Un método reset() que restablezca los valores de las entradas del formulario a

su valor inicial. La firma de éste método es:

public void reset(org.apache.struts.action.ActionMapping mapping, javax.servlet.HttpServletRequest request);

• Un método validate() que valide los valores de las entradas del formulario

HTML que deseemos validar. La firma de éste método es:

public org.apache.struts.action.ActionErrors reset( org.apache.struts.action.ActionMapping mapping, javax.servlet.HttpServletRequest request);

Declaración 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 configuración struts-config.xml. Para ello se utiliza el elemento <form-bean> en la sección <form-beans> de éste archivo. Para usar el objeto de formulario dentro de una clase de acción debemos agregarle al elemento <action> que configura la clase de acción los atributos name, scope y validate. El siguiente recuadro muestra un listado parcial del archivo de configuración struts-config.xml. con los elementos <form-bean> y <action> configurados para el uso de un objeto de formulario en una clase de acción.

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>

Page 12: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

216 Struts

ITSON Manuel Domitsu Kono

<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 <form-bean>.

Tabla 6.5. Atributos del elemento <form-bean>. Atributo Descripción

name Nombre del objeto de formulario (form bean o action form) asociado con esta acción. Este atributo es obligatorio y debe ser único en toda la aplicación.

type Nombre completamente calificado de la clase del objeto de formulario. Este atributo es obligatorio.

La Clases ActionErrors y ActionMessage El método validate() de un objeto de formulario regresa un objeto del tipo org.apache.struts.action.ActionErrors que encapsula uno o más errores que han ocurrido en la aplicación. 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 método 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 parámetro 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 línea. La sintaxis para cada mensaje es:

Page 13: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 217

ITSON Manuel Domitsu Kono

identificador=mensaje donde identificador consta de uno o más caracteres y puntos, empezando y terminando en caracteres y mensaje es una frase que puede contener espacios pero no caracteres de salto de línea, ni está delimitado por comillas. Por ejemplo:

errors.agregarCancion=Error al agregar la canción. El nombre y ubicación del archivo de recursos de mensaje se configura en el archivo struts-config.xml, con el elemento <message-resources>. Por ejemplo, la siguiente declaración:

<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 página JSP en que se desplegará ese mensaje de error al ocurrir una excepción. 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 página se desplegará el mensaje de error si ocurre una excepción dada en una clase de acción. Los elementos <exception> también pueden formar parte del elemento <global-exceptions>. Cada uno de estos elementos <exception> indica en que página se desplegará el mensaje de error si ocurre una excepción en forma global. Si la misma excepción se configura en el elemento <global-exceptions> y en un elemento <action>, la del elemento <action> tiene precedencia. En el código 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" />

Page 14: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

218 Struts

ITSON Manuel Domitsu Kono

<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 Descripción

Type Nombre completamente calificado de la clase de la excepción a ser manejada. Este atributo es obligatorio.

Path Representa la ruta relativa al contexto de la página JSP en la que se desplegará el mensaje de error. Este atributo es obligatorio.

Key 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 acción (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 excepción 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 Descripción Prefijo

Sugerido URI

HTML

Elementos que se utilizan para páginas JSP que se usan como interfaces de usuario e incluir formularios.

html /WEB-INF/struts-html.tld

Bean Elementos empleados para definir beans en cualquier ámbito y de diferentes fuentes.

bean /WEB-INF/struts-bean.tld

Logic Elementos para manipular la lógica de presentación sin recurrir a scriplets de Java.

logic /WEB-INF/struts-logic.tld

Template Elementos para crear plantillas JSP que comparten un formato común.

template /WEB-INF/struts-template.tld

Tiles Provee un mecanismo más poderoso para crear plantillas. tiles /WEB-INF/struts-tiles.tld

Nested Elementos empleados para extender los elementos de Struts para permitir anidamiento.

nested /WEB-INF/struts-nested.tld

Page 15: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 219

ITSON Manuel Domitsu Kono

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

Tabla 6.8 Elementos de la biblioteca de struts html Elemento Descripción

base Elemento HTML <base> button Campo de entrada de tipo Botón cancel Botón Cancelar. checkbox Campo de entrada de tipo casilla de verificación errors Despliega condicionalmente un conjunto de mensajes de error file Campo de entrada de selección de archivoform Define un formulario hidden Define un campo oculto html Elemento HTML <html> image Campo de entrada de tipo imagen img Elemento HTML <img> link Elemento HTML <a>messages Despliega condicionalmente un conjunto de mensajes multibox Campo de entrada de tipo casilla de verificación option Elemento opción de un elemento de menú selección options Colección de opciones de un elemento de menú de selección optionsCollection Colección de opciones de un elemento de menú deselección password Campo de entrada de tipo passordradio Campo de entrada de tipo botones de radio reset Campo de entrada de tipo botón restablecer rewrite Produce un URI select Elemento menú de selección submit Botón enviar text Campo de entrada de tipo textotextarea Campo de entrada de tipo área de texto

Ejemplo de una Aplicación Web Usando Struts A continuación se muestra la versión de la aplicación desarrollada en el Tema 4: Páginas JSP utilizando Struts. En las figuras 6.2 a 6.4 se muestra el diagrama de secuencia del caso de uso Agregar Canción para la aplicación Web sobre el amante de la música. Al igual que con la versión de la aplicación desarrollada en el Tema 4: Páginas JSP, la página JSP index.jsp que es la página de entrada de la aplicación contiene un menú formado por una lista de hipervínculos, mediante la cual el usuario selecciona cuál de las funcionalidades de la aplicación 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.

Page 16: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

220 Struts

ITSON Manuel Domitsu Kono

Figura 6.2 Diagrama de Secuencia. Caso de Uso Agrega Canción

Figura 6.3 Diagrama de Secuencia. Caso de Uso Agrega Canción (Cont.)

Page 17: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 221

ITSON Manuel Domitsu Kono

Figura 6.4 Diagrama de Secuencia. Caso de Uso Agrega Canción (Cont.)

Figura 6.5 index.jsp en un navegador

index.jsp

<%-- index.jsp Esta página JSP es la página inicial de la aplicación Web AmanteMusicaStruts Despliega el menú de opciones. --%> <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%>

Page 18: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

222 Struts

ITSON Manuel Domitsu Kono

<%@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: Versión Struts</title> </head> <body> <%-- Incluye la barra de título --%> <%@include file="jspf/titulo.jspf"%> <%-- Incluye el menú --%> <%@include file="jspf/menuPpal.jspf"%> </body> </html:html>

La barra de título y el menú principal son fragmentos de página JSP y son incluidos en la página index.jsp. El código del´título, titulo.jspf se vió en el Tema 4 JSP. El código del menú principal es el siguiente:

menu.jspf <%-- Este fragmento de página JSP es el menú principal de la aplicación AmanteMusica versión JSP --%> <div id="menuppal"> <ul id="menu"> <li> <html:link href="canciones.jsp"> Catálogo de canciones </html:link> </li> <li> <html:link href="peliculas.jsp"> Catálogo de películas </html:link> </li> <li> <html:link href="generos.jsp"> Catálogo de géneros </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 página JSP. Si se selecciona la opción: Catálogo de canciones, se invoca a la página canciones.jsp que despliega un menú, figura 6.6, con las opciones que permiten administrar y consultar el catálogo de canciones. El menú se encuentra en el fragmento de página JSP menuCanciones.jspf.

Page 19: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 223

ITSON Manuel Domitsu Kono

Figura 6.6 canciones.jsp en un navegador

canciones.jsp

<%-- canciones.jsp Esta página JSP es la página con el menú canciones de la aplicación Web AmanteMusica versión 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 Música - Versión Struts: Menú Canciones</title> </head> <body> <%-- Incluye la barra de título --%> <%@include file="jspf/titulo.jspf"%> <%-- Incluye el menú --%> <%@include file="jspf/menuCanciones.jspf"%> </body>

Page 20: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

224 Struts

ITSON Manuel Domitsu Kono

</html>

menuCanciones.jspf

<%-- Este fragmento de página JSP es el menú principal de la aplicación AmanteMusica versión JSTL --%> <div id="menuppal"> <ul id="menu"> <li> <html:link action="/Control.do?tarea=agregarCancion"> Agrega Canción </html:link> </li> <li> <html:link action="/Control.do?tarea=actualizarCancion"> Actualizar canción </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 género </html:link> </li> <li> <html:link action="/Control.do?tarea=listarCancionesPeriodo"> Listar canciones por periodo </html:link> </li> <li> <html:link href="index.jsp"> Página Inicial </html:link> </li> </ul> </div>

Todas las opciones del menú Canciones hacen la solicitud de la misma clase de acción ControlAction.jsp pero pasándole un diferente parámetro 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;

Page 21: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 225

ITSON Manuel Domitsu Kono

import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForward; /** * Esta clase de Acción selecciona la página JSP o acción que inicializa * el caso de uso del programa AmanteMusica versión JSP * * @author mdomitsu * @version */ public class ControlAction extends Action { /* Llaves para acceder al mapa con la información de la página JSP o acción a la que se pasará el control */ private final static String CAPTURA_CLAVE = "capturaClave"; private final static String OBTEN_CANCIONES = "obtenCanciones"; private final static String CAPTURA_GENERO = "capturaGenero"; private final static String CAPTURA_PERIODO = "capturaPeriodo"; private final static String INICIO = "inicio"; /** * Este método implementa la acción de seleccionar la página JSP o * acción que inicializa el caso de uso del programa AmanteMusica * versión JSP. * @param mapping La instancia de ActionMapping, el mapa empleado para * seleccionar esta clase de acción. * @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 información * de la página JSP o acción 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 implícita session con las variables de sesion HttpSession session = request.getSession(); // Guarda la tarea seleccionada como el atributo tareaSel en la // variable sesión que es la que contiene a todas las variables con // ámbito de sesión session.setAttribute("tareaSel", tareaSel); if(tareaSel.equals("agregarCancion")) { // Carga la página capturaClave.jsp para capturar la // clave de la canción a agregar return mapping.findForward(CAPTURA_CLAVE); } if(tareaSel.equals("actualizarCancion")) {

Page 22: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

226 Struts

ITSON Manuel Domitsu Kono

// invoca a la acción ObtenCancionesAction para obtener la lista // de todas las canciones return mapping.findForward(OBTEN_CANCIONES); } if(tareaSel.equals("eliminarCanciones")) { // invoca a la acción ObtenCancionesAction para obtener la lista // de todas las canciones return mapping.findForward(OBTEN_CANCIONES); } if(tareaSel.equals("listarCanciones")) { // invoca a la acción ObtenCancionesAction para obtener la lista // de todas las canciones return mapping.findForward(OBTEN_CANCIONES); } if(tareaSel.equals("listarCancionesGenero")) { // invoca a la acción ObtenCancionesAction para obtener la lista // de todas las canciones return mapping.findForward(CAPTURA_GENERO); } if(tareaSel.equals("listarCancionesPeriodo")) { // invoca a la acción ObtenCancionesAction para obtener la lista // de todas las canciones return mapping.findForward(CAPTURA_PERIODO); } // Le pasa el control a la página JSP "index.jsp" return mapping.findForward(INICIO); } } Dependiendo de la opción seleccionada el método execute() de la clase de acción ControlAction.java regresa un objeto del tipo ActionForward que contiene la información de la página o clase de acción a la que se le pasará el control. El método execute() obtiene esa información del parámetro ActionMapping mapping invocando al método findForward(). El servlet ActionServlet toma la información que le pasa a la clase de acción en el parámetro mapping del archivo de configuración struts-config.xml. Para cada clase de acción hay una entrada en ese archivo de configuración.

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"

Page 23: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 227

ITSON Manuel Domitsu Kono

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 acción. El atributo path de éste elemento es el URI relativo al contexto de la aplicación que identifica a la clase de acción a la que se le pasará el control; el atributo type es el nombre de la clase de acción; y los elementos <forward> anidados en el elemento <action> especifican, cada uno, la página o clase de acción a la que se le pasará el control. En el elemento <forward> el atributo name es el mismo valor que se le pasó al método findForward() y el atributo path es el nombre de la página JSP o clase de acción a la que se le pasará el control. Podemos ver que si la opción seleccionada es Agregar Canción la clase de acción ControlAction.java carga la página JSP capturaClave.jsp para capturar la clave de la canción a agregar, tal como se ve en la figura 6.7.

Figura 6.7 capturaClave.jsp en un navegador

Page 24: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

228 Struts

ITSON Manuel Domitsu Kono

Como veremos más adelante, sí una página JSP tiene un formulario, el servlet ActionServlet puede almacenar en un Java Bean los valores capturados en el formulario para pasárselos al método execute() de la clase de acción en el objeto de formulario dado por el parámetro 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 página. En este caso en la misma página 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 página JSP permite capturar la clave de una canción a agregar al catálogo de canciones. Forma parte de la aplicación AmanteMusica versión 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>

Page 25: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 229

ITSON Manuel Domitsu Kono

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" type="text/css" href="estilos.css" /> <title>Amante Musica: Versión Struts - Captura Clave</title> </head> <body> <%-- Incluye la barra de título --%> <%@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 página para obtener la canción --%> <html:form action="ObtenCancion.do" method="post"> <table class="centrada"> <%-- Despliega el encabezado en la página --%> <caption>Canción 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> <%-- Botón enviar --%> <td><html:submit property="boton" value="Continuar" /></td> <%-- Botón cancelar. Dejar el valor por omisión para el atributo property para que el mecanismo de detección de cancelar en la clase de acción funcione. --%> <td><html:cancel value="Cancelar" /></td> <%-- Botón restaurar --%> <td><html:reset value="Restaurar" /></td> </tr> </table> </html:form> <%-- Guarda en la variable origen, el nombre de esta página. El objeto de formulario CancionForm requiere saber de que página se envía el formulario para validar los datos del formulario --%> <c:set value="capturaClave" var="origen" scope="session" /> </div> </div> </body> </html:html>

En la página 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

Page 26: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

230 Struts

ITSON Manuel Domitsu Kono

último emplea el elemento <html: errors> para escribir un mensaje de error en la salida de la página. Cuando el usuario hace clic en el botón <html:submit> de la página JSP capturaClave.jsp, los datos capturados en el formulario le son pasados al método execute() de la clase de acción, obtenCanciónAction.java, invocada por la página, en el parámetro ActionForm form. Esto se indica en el elemento <action> de la clase de acción en archivo de configuración struts-config.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 sesión (session), el atributo valídate si tiene el valor true indica que se desea la validación de los datos, false en caso contrario y por último, el atributo input establece el nombre de la página en la que se desplegarán los mensajes de error generados en la validación 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

Page 27: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 231

ITSON Manuel Domitsu Kono

String y tienen el mismo nombre que el valor del atributo name de los campos del formulario. Adicionalmente tiene dos métodos: 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 botón 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 java.awt.Menu; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionMessage; import utils.Validador; /** * Esta objeto de formulario permite la transferencia de la clave de una * canción de la página capturaClave.jsp a la clase de acción * ObtenCancion.java y de una canción de la página capturaCancion.jsp a la * clase de acción AgregarCancionAction.java de la aplicación Web * AmanteMusica versión 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 vacío */ public CancionForm() { super(); } /** * Regresa la clave de la canción * @return La clave de la canción */

Page 28: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

232 Struts

ITSON Manuel Domitsu Kono

public String getClave() { return clave; } /** * Establece la clave de la canción * @param clave La clave de la canción */ public void setClave(String clave) { this.clave = clave; } /** * Regresa el título de la canción * @return El título de la canción */ public String getTitulo() { return titulo; } /** * Establece el título de la canción * @param titulo El título de la canción */ public void setTitulo(String titulo) { this.titulo = titulo; } /** * Regresa el intérprete de la canción * @return El intérprete de la canción */ public String getInterprete() { return interprete; } /** * Establece el intérprete de la canción * @param interprete El intérprete de la canción */ public void setInterprete(String interprete) { this.interprete = interprete; } /** * Regresa el autor de la letra de la canción * @return El autor de la letra de la canción */ public String getAutorLetra() { return autorLetra; } /** * Establece el autor de la letra de la canción * @param autorLetra El autor de la letra de la canción */ public void setAutorLetra(String autorLetra) { this.autorLetra = autorLetra; } /**

Page 29: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 233

ITSON Manuel Domitsu Kono

* Regresa el autor de la música de la canción * @return El autor de la música de la canción */ public String getAutorMusica() { return autorMusica; } /** * Establece el autor de la música de la canción * @param autorMusica El autor de la música de la canción */ public void setAutorMusica(String autorMusica) { this.autorMusica = autorMusica; } /** * Regresa el género de la canción * @return El género de la canción */ public String getGenero() { return genero; } /** * Establece el género de la canción * @param genero El género de la canción */ public void setGenero(String genero) { this.genero = genero; } /** * Regresa el álbum de la canción * @return El álbum de la canción */ public String getAlbum() { return album; } /** * Establece el álbum de la canción * @param album El álbum de la canción */ public void setAlbum(String album) { this.album = album; } /** * Regresa la disquera de la canción * @return La disquera de la canción */ public String getDisquera() { return disquera; } /** * Establece la disquera de la canción * @param disquera La disquera de la canción */ public void setDisquera(String disquera) { this.disquera = disquera;

Page 30: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

234 Struts

ITSON Manuel Domitsu Kono

} /** * Regresa la duración de la canción, como una cadena * @return La duración de la canción, como una cadena */ public String getDuracion() { return duracion; } /** * Establece la duración de la canción, como una cadena * @param duracion La duración de la canción, como una cadena */ public void setDuracion(String duracion) { this.duracion = duracion; } /** * Regresa la fecha de la canción, como una cadena * @return La fecha de la canción, como una cadena */ public String getFecha() { return fecha; } /** * Establece la fecha de la canción, como una cadena * @param fecha La fecha de la canción, como una cadena */ public void setFecha(String fecha) { this.fecha = fecha; } /** * Restablece los valores de los atributos de la clase de la canción a * sus valores iniciales. * @param mapping La instancia de ActionMapping, el mapa empleado para * seleccionar esta clase de acción. * @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 método permite validar los parámetros del formulario HTML de las * páginas capturaClave.jsp y capturaCancion.jsp * @param mapping La instancia de ActionMapping, el mapa empleado para * seleccionar esta clase de acción. * @param request La solicitud HTTP que se está procesando. * @return Regresa la lista de los errores de validaciones

Page 31: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 235

ITSON Manuel Domitsu Kono

*/ public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errores = new ActionErrors(); Validador validador = new Validador(); // Obtiene la variable implícita 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 página 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 título 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 intérprete 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 música 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 duración if(!validador.validaString(getDuracion())) // Agrega el mensaje de error a la lista de errores errores.add("duracion", new ActionMessage("errors.no.duracion")); // Si la duración no es un entero

Page 32: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

236 Struts

ITSON Manuel Domitsu Kono

else if(!validador.validaInt(getDuracion())) // Agrégalo 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())) // Agrégalo 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())) // Agrégalo el mensaje de error a la lista de errores errores.add("fecha", new ActionMessage("errors.noFecha.fecha")); return errores; } }

El método validate()regresa un objeto del tipo ActionErrors que contiene la lista de mensajes de error de los errores encontrados por el método validate(). Cada mensaje se encapsula en un objeto del tipo ActionMessage. El constructor de la clase ActionMessage recibe como parámetro 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 método add(String property, ActionMessage error)de la clase ActionErrors. El parámetro property es el nombre del atributo (o campo del formulario) con el dato erróneo. Para validar los diferentes campos del formulario se tienen un conjunto de funciones para validar cadenas, enteros, fechas, etc. Estos métodos 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 provée de métodos para validar que las cadenas de sus * parámetros representan a datos de los tipos especificados por el método */ public class Validador { /** * Valida si su parámetro es una cadena no vacía. * @param s Cadena a verificar * @return True si la cadena no es vacía o nula, false en caso * contrario. */ public boolean validaString(String s) {

Page 33: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 237

ITSON Manuel Domitsu Kono

return s != null && s.length() > 0; } /** * Valida si su parámetro 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 parámetro 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 código.

Fecha.java (Fragmento de código) /* * 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 { ...

Page 34: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

238 Struts

ITSON Manuel Domitsu Kono

/** * Construye un objeto de tipo fecha y lo inicializa a la fecha dada por * sus parámetros * @param dia Día del mes * @param mes Mes del año * @param anho Año * @throws java.lang.IllegalArgumentException Si alguno de los * parámetros no está en el rango válido */ public Fecha(int dia, int mes, int anho) throws IllegalArgumentException { // Activa la verificación de los rangos de la fecha setLenient(false); // Establece los valores de año, mes y día 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 válido. */ public Fecha(String s) throws IllegalArgumentException { String ss; if(s == null || s.equals("")) throw new IllegalArgumentException(); // Posición del separador de día y mes int posDiag1 = s.indexOf('/'); // Si no hay el separador if(posDiag1 < 0 )throw new IllegalArgumentException(); // Posición del separador de mes y año int posDiag2 = s.indexOf('/', posDiag1+1); // Si no hay el separador if(posDiag2 < 0 )throw new IllegalArgumentException(); // Obtiene una subcadena con el día 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 año ss = s.substring(posDiag2+1); // Convierte la subcadena a entero int anho = Integer.parseInt(ss); // Activa la verificación de los rangos de la fecha setLenient(false); // Establece los valores de año, mes y día del objeto Fecha. // Internamente el mes se guarda en base 0, es decir enero vale 0.

Page 35: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 239

ITSON Manuel Domitsu Kono

set(anho, mes-1, dia); } } Si el usuario hizo clic en el botón <html:cancel> de la página JSP capturaClave.jsp, no se hace validación de los datos. En el método execute() de la clase de acción ObtenCancionAction.java se checa si el usuario hizo clic en ese botón invocando al método iscancelled() y de ser así se pasa el control a la página de inicio index.jsp. Por otro lado si el usuario hizo clic en el botón <html:submit> de la página JSP capturaClave.jsp, el método execute() de la clase de acción ObtenCancionAction.java invoca al método obten() de la clase Fachada.java para buscar en la tabla canciones de la base de datos música, la canción con la clave capturada en la página 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 org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionErrors; import objetosFormularios.CancionForm; import interfaces.IFachada; import fachadas.FachadaBD; import objetosNegocio.Cancion; /** * Esta clase de Acción permite obtener una canción del catálogo de canciones * del programa AmanteMusica * * @author mdomitsu * @version */ public class ObtenCancionAction extends Action { /* Llaves para accede al mapa con la información de la página JSP o acción 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";

Page 36: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

240 Struts

ITSON Manuel Domitsu Kono

/** * Este método implementa la acción de obtener una canción del * catálogo de canciones. * @param mapping La instancia de ActionMapping, el mapa empleado para * seleccionar esta clase de acción. * @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 canción * @return Un objeto del tipo ActionForward que encapsula la información * de la página JSP o acción 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 botón Cancelar en la página // "capturaClave.jsp" if(isCancelled(request)) { // Restablece las propiedades del objeto de formulario CancionForm // a cadenas vacías para que no muestren nada en la página // capturaClave.jsp ((CancionForm)form).reset(mapping, request); // pasa el control a la página "index.jsp" return mapping.findForward(CANCELAR); } // Obten la clave de la canción enviada por la página // "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 canción obtenida Cancion cancionObtenida; // Obten la canción del catálogo de canciones cancionObtenida = fachada.obten(new Cancion(clave)); // Si la canción 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 sesión. // El nombre de la variable es cancion y está disponible para las // páginas jsp usando la acción <jsp:useBean>

Page 37: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 241

ITSON Manuel Domitsu Kono

session.setAttribute("cancion", cancion); // Restablece las propiedades del objeto de formulario. ((CancionForm)form).reset(mapping, request); // Pasa el control a la página "despliegaCancion.jsp" return mapping.findForward(CANCION_EXISTENTE); } // Si la canción no existe pasa el control a la clase de acción // "obtenGenerosCancionesAction" return mapping.findForward(OBTENER_GENEROS_CANCIONES); } }

Si en la clase de acción ocurre un error se lanza una excepción. Esa excepción es capturada por el contenedor Web y se invoca a la página de error establecida en el elemento <exception> dentro del elemento <action> en el archivo de configuración struts-config.xml.

Error.jsp <%-- error.jsp Esta página JSP permite desplegar los mensajes de error de la aplicación AmanteMusica versión 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 Música - Página de Error</title> </head> <body> <h1 align="center">Página de Error</h1> <br /> <br /> <%-- Despliega el mensaje de error --%> <h3 class="msjError"> <html:errors /> </h3> <%-- Formulario con un sólo botón empleado para regresar a la página con el menú de tareas --%> <form action="Inicio.do" method="post"> <table class="centrada"> <tr> <td> <%-- Botón Enviar --%>

Page 38: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

242 Struts

ITSON Manuel Domitsu Kono

<input type="submit" name="boton" value="Continuar" /> </td> </tr> </table> </form> </body> </html:html> Si la canción no existe en la tabla de la base de datos, la clase de acción ObtenCancionAction.java invoca a la clase de acción ObtenGenerosCancionesAction.java para que obtenga un vector con la lista de los géneros de las canciones, lo convierta a un arreglo y lo almacene en la variable de ámbito de sesión arregloGeneros.

ObtenGenerosCancionesAction.java /* * ObtenGenerosCanciones.java * * Creada el 10 de noviembre de 2008, 11:44 PM */ package acciones; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForward; import interfaces.IFachada; import fachadas.FachadaBD; import java.util.Vector; import objetosTransferencia.ListaGeneros; /** * Esta clase de Acción permite obtener los géneros de las canciones del * catálogo de géneros del programa AmanteMusica * * @author mdomitsu * @version */ public class ObtenGenerosCancionesAction extends Action { /* Llaves para accede al mapa con la información de la página JSP o acción 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 método implementa la acción de obtener la lista de géneros * de las canciones del catálogo de géneros. * @param mapping La instancia de ActionMapping, el mapa empleado para * seleccionar esta clase de acción. * @param form El objeto de formulario (opcional) para esta solicitud. * @param request La solicitud HTTP que se está procesando.

Page 39: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 243

ITSON Manuel Domitsu Kono

* @param response La respuesta HTTP que se está procesando. * @throws java.lang.Exception Si no se pudo obtener la lista de géneros * @return Un objeto del tipo ActionForward que encapsula la información * de la página JSP o acción 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 implícita session con las variables de sesion HttpSession session = request.getSession(); // Obtiene la tarea seleccionada del menú que se encuentra en la // variable donde están las variables con ámbito de sesión String tareaSel = (String) session.getAttribute("tareaSel"); // Crea el objeto para acceder a la base de datos IFachada fachada = new FachadaBD(); // Obten la lista de géneros de las canciones del catálogo de géneros lista = fachada.consultaGenerosCanciones(); // Convierte el vector con la lista de géneros a un arreglo listaGeneros.setLista(lista); arregloGeneros = listaGeneros.getArreglo(); // Almacena el bean listaGeneros como una variable de ámbito de // sesión. session.setAttribute("arregloGeneros", arregloGeneros); // Si la tarea es "actualizarCancion" if(tareaSel.equals("actualizarCancion")) // Pasa el control a la página JSP "editaCancion.jsp" return mapping.findForward(EDITA_CANCION); // Si no, pasa el control a la página "capturaCancion.jsp" return mapping.findForward(CAPTURA_CANCION); } }

El elemento <action> de la clase de acción ObtenGenerosCancionesAction.java en archivo de configuración struts-config.xml se muestra en el siguiente fragmento de código.

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">

Page 40: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

244 Struts

ITSON Manuel Domitsu Kono

<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 acción ObtenGenerosCancionesAction.java en archivo de configuración struts-config.xml, La clase de acción ObtenGenerosCancionesAction.java invoca a la página JSP capturaCancion.jsp para capturar los datos de la canción, 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 página JSP capturaClave.jsp si alguno de los datos capturados en el formulario de la página JSP capturaCancion.jsp no es válido, se depliegan mensajes de error por cada dato inválido, como se muestra en la figura 6.10.

Page 41: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 245

ITSON Manuel Domitsu Kono

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

capturaCancion.jsp

<%-- capturaCancion.jsp Esta página JSP permite capturar los datos de una canción. Forma parte de la aplicación AmanteMusica versión 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: Versión Struts - Captura Canción</title> </head> <body> <%-- Incluye la barra de título --%> <%@include file="jspf/titulo.jspf"%> <%-- Incluye el menú --%> <%@include file="jspf/menuCanciones.jspf"%> <div class="principal">

Page 42: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

246 Struts

ITSON Manuel Domitsu Kono

<div class="contenido"> <%-- Formulario para capturar los atributos de una canción. Los valores capturados se envían a la página agregarCancion.jsp --%> <html:form action="AgregarCancion.do" method="post"> <table class="centrada"> <%-- Despliega el encabezado en la página --%> <caption>Captura Canción</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">Intérprete</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 Música</td> <td><html:text property="autorMusica" size="35" /></td> <td class="msjError"> <html:errors property="autorMusica" /> </td> </tr> <tr> <td class="derecha">Género</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>

Page 43: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 247

ITSON Manuel Domitsu Kono

<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">Duración</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> <%-- Botón enviar --%> <td><html:submit property="boton" value="Continuar" /></td> <%-- Botón cancelar. Dejar el valor por omisión para el atributo property para que el mecanismo de detección de cancelar en la clase de acción funcione. --%> <td><html:cancel value="Cancelar" /></td> <%-- Botón restaurar --%> <td><html:reset value="Restaurar" /></td> </tr> </table> </html:form> <%-- Guarda en la variable origen, el nombre de esta página. El objeto de formulario CancionForm requiere saber de que página se envía el formulario para validar los datos del formulario --%> <c:set value="capturaCancion" var="origen" scope="session" /> </div> </div> </body> </html:html>

El método execute() de la clase de acción AgregarCancionAction.java checa si el usuario hizo clic en ese botón invocando al método iscancelled() y de ser así se pasa el control a la página canciones.jsp. Si no, el método execute()invoca al método agrega() de la clase Fachada.java para almacenar la canción en la tabla canciones de la base de datos musica. Por último le pasa el contol a la clase de acción ObtenCancionesAction para obtener la lista de canciones y desplegarlas.

Page 44: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

248 Struts

ITSON Manuel Domitsu Kono

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 org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForward; import objetosFormularios.CancionForm; import interfaces.IFachada; import fachadas.FachadaBD; import java.util.Vector; import objetosNegocio.Cancion; import objetosNegocio.Genero; import objetosServicio.Fecha; /** * Esta clase de Acción permite agregar una canción al catálogo de * canciones del programa AmanteMusica versión Struts * * @author mdomitsu * @version */ public class AgregarCancionAction extends Action { // Constantes simbólicas para las páginas JSP a las que se le pasará el // control private final static String CANCELAR = "cancelar"; private final static String EXITO = "exito"; /** * Este método implementa la acción de agregar una canción al catálogo * de canciones. * @param mapping La instancia de ActionMapping, el mapa empleado para * seleccionar esta clase de acción. * @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 canción * @return Un objeto del tipo ActionForward que encapsula la información * de la página JSP o acción 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 botón Cancelar en la página // "capturaCancion.jsp" if(isCancelled(request)) { // Restablece las propiedades del objeto de formulario CancionForm // a cadenas vacías para que no muestren nada en la página // capturaClave.jsp

Page 45: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 249

ITSON Manuel Domitsu Kono

((CancionForm)form).reset(mapping, request); // Pasa el control a la página "canciones.jsp" return mapping.findForward(CANCELAR); } // Crea el objeto para acceder a la base de datos IFachada fachada = new FachadaBD(); // Obten la lista de géneros de las canciones del catálogo de // géneros Vector lista = fachada.consultaGenerosCanciones(); // Crea un objeto de tipo canción a partir de los atributos del // objeto de formulario del parámetro form CancionForm cancionForm = (CancionForm)form; // Obten el género de la canción a actualizar Genero genero = fachada.obten(new Genero(cancionForm.getGenero())); // Crea un objeto del tipo canción con los atributos capturados // en la páguna 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 canción del catálogo fachada.agrega(cancion); // Restablece las propiedades del objeto de formulario. ((CancionForm)form).reset(mapping, request); // Obtiene la variable implícita session con las variables de sesion HttpSession session = request.getSession(); // Guarda la opción seleccionada como el atributo tareaSel en la // variable sesión que es la que contiene a todas las variables con // ámbito de sesión session.setAttribute("tareaSel", "listarCanciones"); // Le pasa el control a la clase de acción ObtenCancionesAction return mapping.findForward(EXITO); } } El elemento <action> de la clase de acción AgregarCancionAction.java en archivo de configuración struts-config.xml se muestra en el siguiente fragmento de código.

Page 46: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

250 Struts

ITSON Manuel Domitsu Kono

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 acción AgregarCancionAction.java en archivo de configuración struts-config.xml si hay éxito al guardar la canción en la tabla canciones, se invoca a la clase de acción ObtenCancionesAction.java para que obtenga la lista de las canciones en la tabla canciones y las guarde en la variable de ámbito de sesión listaCanciones.

ObtenCancionesAction.java /* * ObtenCancionesAction.java * * Creada el 2 de noviembre de 2006, 11:31 AM */ package acciones;

Page 47: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 251

ITSON Manuel Domitsu Kono

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForward; import java.util.Vector; import menus.Menu; import interfaces.IFachada; import fachadas.FachadaBD; import objetosTransferencia.Lista; /** * Esta clase de Acción permite obtener la lista del catálogo de canciones * del programa AmanteMusica. * * @author mdomitsu * @version */ public class ObtenCancionesAction extends Action { // Constante simbólica para la página 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 método implementa la acción de obtener todas las canciones del * catálogo de canciones. * @param mapping La instancia de ActionMapping, el mapa empleado para * seleccionar esta clase de acción. * @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 información * de la página JSP o acción 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 implícita session con las variables de sesion HttpSession session = request.getSession(); // Obtiene la tarea seleccionada del menú que se encuentra en la // variable donde están las variables con ámbito de sesión String tareaSel = (String) session.getAttribute("tareaSel"); // Crea el objeto para acceder a la base de datos IFachada fachada = new FachadaBD();

Page 48: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

252 Struts

ITSON Manuel Domitsu Kono

// 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 título 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 // sesión. El nombre de la variable es listacanciones y está // disponible para las páginas jsp usando la acción <jsp:useBean> session.setAttribute("listaCanciones", listaCanciones); // Si la tarea es "actualizarCancion" if(tareaSel.equals("actualizarCancion")) // Pasa el control a la página JSP "seleccionaCancionActualizar.jsp" return mapping.findForward(SEL_CANCION_ACTUALIZAR); // Si la tarea es "eliminarCanciones" if(tareaSel.equals("eliminarCanciones")) // Pasa el control a la página JSP // "seleccionarCancionesEliminar.jsp" return mapping.findForward(SEL_CANCIONES_ELIMINAR); // Pasa el control a la página JSP "despliegaCanciones.jsp"" return mapping.findForward(DESPLIEGA_CANCIONES); } }

La clase de acción ObtenCancionesAction.java almacena la lista de canciones en la variable listaCanciones es del tipo Lista.java y luego le pasa el control a la página JSP seleccionaCancionActualizar.jsp, seleccionaCancionesEliminar.jsp o a despliegaCanciones.jsp dependiendo si el caso de uso es Actualizar Canción, Eliminar Canciones o Listar Canciones, respectivamente, como se muestra en el fragmento del archivo de configuración 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" />

Page 49: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 253

ITSON Manuel Domitsu Kono

<forward name="despliegaCanciones" path="/despliegaCanciones.jsp" /> <exception type="java.lang.Exception" key="errors.obtenCanciones" path="/error.jsp" /> </action> ... </action-mappings> ... </struts-config> La página 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 página JSP despliega una tabla con la lista de canciones del catálogo de canciones. Forma parte de la aplicación AmanteMusica versión 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" %>

Page 50: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

254 Struts

ITSON Manuel Domitsu Kono

<%@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 Música: Versión Struts - Despliega Canciones</title> </head> <body> <%-- En este bean de tipo ArregloCanciones, se almacena la lista de canciones leídas de la tabla canciones de la base de datos musica, convertida de un vector a un arreglo. Estos datos están disponibles para otros JSPs en la misma sesión --%> <jsp:useBean id="listaCanciones" scope="session" class="objetosTransferencia.Lista" /> <%-- Incluye la barra de título --%> <%@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"> <%-- Título de la tabla --%> <caption>${listaCanciones.tituloTabla}</caption> <tr> <%-- Títulos de las columnas --%> <th align="center">Clave</th> <th align="center">Título</th> <th align="center">Intérprete</th> <th align="center">Autor Letra</th> <th align="center">Autor Música</th> <th align="center">Género</th> <th align="center">Album</th> <th align="center">Disquera</th> <th align="center">Duración</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 canción --%> <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>

Page 51: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 255

ITSON Manuel Domitsu Kono

<td>${cancion.disquera}</td> <td>${cancion.duracion}</td> <td>${cancion.fecha}</td> </tr> </c:forEach> </table> </div> </div> </body> </html> Si la canción existe en la tabla de la base de datos la clase de acción ObtenCancionAction.java invoca a la página JSP despliegaCancion.jsp para desplegar los datos de la canción 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 página JSP despliega los datos de una canción. Forma parte de la aplicación AmanteMusica versión 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"%>

Page 52: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

256 Struts

ITSON Manuel Domitsu Kono

<!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 Música: Versión Struts - Despliega Canción</title> <link rel="stylesheet" type="text/css" href="estilos.css" /> </head> <body> <%-- En este bean de tipo Canción, están almacenados los atributos de una canción leída de la tabla canciones de la base de datos musica por obtenCancion.jsp. Estos datos están disponibles para otras JSPs en la misma sesión --%> <jsp:useBean id="cancion" scope="session" class="objetosNegocio.Cancion" /> <%-- Incluye la barra de título --%> <%@include file="jspf/titulo.jspf"%> <%-- Incluye el menú --%> <%@include file="jspf/menuCanciones.jspf"%> <div class="principal"> <div class="contenido"> <%-- Despliega los datos de la canción Se obtiene cada uno de los atributos del bean cancion y se despliegan en la tabla. Una canción por renglón--%> <table class="centrada"> <%-- Despliega el encabezado en la página --%> <caption>Canción Existente</caption> <tr> <td class="derecha">Clave</td> <td class="gris">${cancion.clave}</td> <tr> <td class="derecha">Título</td> <td class="gris">${cancion.titulo}</td> </tr> <tr> <td class="derecha">Intérprete</td> <td class="gris">${cancion.interprete}</td> </tr> <tr> <td class="derecha">Autor Letra</td> <td class="gris">${cancion.autorLetra}</td> </tr> <tr> <td class="derecha">Autor Música</td> <td class="gris">${cancion.autorMusica}</td> </tr> <tr> <td class="derecha">Género</td> <td class="gris">${cancion.genero.nombre}</td> </tr> <tr> <td class="derecha">Album</td> <td class="gris">${cancion.album}</td>

Page 53: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 257

ITSON Manuel Domitsu Kono

</tr> <tr> <td class="derecha">Disquera</td> <td class="gris">${cancion.disquera}</td> </tr> <tr> <td class="derecha">Duración</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 Canción para la aplicación Web sobre el amante de la música.

Figura 6.13 Diagrama de Secuencia. Caso de Uso Actualizar Canción

En el caso de uso Actualizar Canción, la clase de acción ControlAction.java le pasa el control a la clase de acción ObtenCancionesAction.java para que obtenga la lista de canciones en la tabla canciones de la base de datos musica, invocando al método consultaCanciones de la clase Fachada.java y la almacene en la variable listaCanciones. La clase de acción ObtenCancionesAction.java luego le pasa el control a la página JSP seleccionaCancionActualizar.jsp que despliega una tabla con la lista de las canciones para que el usuario seleccione la canción a editar, figura 6.15.

Page 54: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

258 Struts

ITSON Manuel Domitsu Kono

Figura 6.14 Diagrama de Secuencia. Caso de Uso Actualizar Canción (Cont).

Figura 6.15 seleccionaCancionActualizar.jsp en un navegador web

Para seleccionar la canción a editar, el usuario hace clic en el botón de radio correspondiente a la canción deseada. Cada botón de radio de la página se establece mediante el elemento <html:radio> de la bibioteca html de Struts. El parámetro property del elemento <html:radio> es el nombre del atributo del

Page 55: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 259

ITSON Manuel Domitsu Kono

objeto de formulario usado para pasarle el valor del formulario a la clase de acción y el parámetro value es el valor que se le asignará al atributo y corresponde al índice de la canción en la tabla.

seleccionaCancionActualizar.jsp <%-- seleccionaCancionActualizar.jsp Esta página JSP despliega una tabla con la lista de canciones del Catálogo de canciones y permite seleccionar la canción a actualizar. Forma parte de la aplicación AmanteMusica versión 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 Música - Versión Struts: Seleciona Canción a Actualizar </title> </head> <body> <%-- En este bean de tipo Lista, se almacena la lista de canciones leídas de la tabla canciones de la base de datos musica. Estos datos están disponibles para otros JSPs en la misma sesión --%> <jsp:useBean id="listaCanciones" scope="session" class="objetosTransferencia.Lista" /> <%-- Incluye la barra de título --%> <%@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"> <%-- Título de la tabla --%> <caption>Selecciona la canción a actualizar</caption> <tr> <%-- Títulos de las columnas --%>

Page 56: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

260 Struts

ITSON Manuel Domitsu Kono

<th>&nbsp;</th> <th>Clave</th> <th>Título</th> <th>Intérprete</th> <th>Autor Letra</th> <th>Autor Música</th> <th>Género</th> <th>Album</th> <th>Disquera</th> <th>Duración</th> <th>Fecha</th> </tr> <%-- Define la variable i para guardar el valor que se enviará con el parámeto sel del botón de radio seleccionado --%> <c:set value="${0}" var="i" scope="page" /> <%-- Para cada canción 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 canción --%> <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> <%-- Botón enviar --%> <td><html:submit property="boton" value="Continuar" /></td> <%-- Botón cancelar. Dejar el valor por omisión para el atributo property para que el mecanismo de detección de cancelar en la clase de acción funcione. --%> <td><html:cancel value="Cancelar" /></td> <%-- Botón restaurar --%> <td><html:reset value="Restaurar" /></td> </tr> </table> </html:form> </div> </div> </body> </html:html>

Page 57: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 261

ITSON Manuel Domitsu Kono

La página le pasa el control a la clase de acción ObtenCancionEditarAction.java guardando en el atributo seleccion del Javabean SeleccionForm.java el índice de la canción seleccionada mediante un botón de radio en la página.

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 opción * seleccionada en un botón de radio o de las opciones seleccionadas * casillas de verificación * * @author mdomitsu * @version */ public class SeleccionForm extends org.apache.struts.action.ActionForm { private String seleccion; private String selecciones[]; /** * Constructor vacío */ public SeleccionForm() { super(); } /** * Este método regresa la opción seleccionada en un botón de radio * @return La opción seleccionada en un botón de radio */ public String getSeleccion() { return seleccion; } /** * Este método establece la opción seleccionada en un botón de radio * @param seleccion La opción seleccionada en un botón de radio */ public void setSeleccion(String seleccion) { this.seleccion = seleccion; } /** * Este método regresa las opciones seleccionadas en las casillas * de verificación * @return Las opciones seleccionadas en las casillas * de verificación */ public String[] getSelecciones() {

Page 58: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

262 Struts

ITSON Manuel Domitsu Kono

return selecciones; } /** * Este método establece las opciones seleccionadas en las casillas * de verificación * @param selecciones Las opciones seleccionadas en las casillas * de verificación */ public void setSelecciones(String[] selecciones) { this.selecciones = selecciones; } /** * Este método no hace nada pues no se necesita hacer validación */ public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = null; return errors; } } La clase de acción ObtenCancionEditarAction.java obtiene del objeto de formulario SeleccionForm.java el índice de la canción seleccionada de la lista de canciones y lo utiliza para obtener la canción. Toma los valores de los atributos de la canción y los copia a los atributos del objeto de formulario CancionForm.java para que sean desplegados en la página editaCanción.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 org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForward; import objetosFormularios.SeleccionForm; import objetosFormularios.CancionForm; import objetosNegocio.Cancion; import interfaces.IFachada; import fachadas.FachadaBD; import objetosNegocio.Cancion; import objetosTransferencia.Lista; /** * Esta clase obtiene de la lista de canciones almacenada en la variable * listaCanciones en el ámbito de sesión la canción seleccionada para

Page 59: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 263

ITSON Manuel Domitsu Kono

* editar. El índice de la canción 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 información de la página JSP o acción 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 método implementa la acción de obtener la canción seleccionada * de la lista de canciones. * @param mapping La instancia de ActionMapping, el mapa empleado para * seleccionar esta clase de acción. * @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 canción * @return Un objeto del tipo ActionForward que encapsula la información * de la página JSP o acción 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 botón Cancelar en la página // "seleccionaCancionActualizar.jsp" if(isCancelled(request)) { // pasa el control a la página "canciones.jsp" return mapping.findForward(CANCELAR); } HttpSession session = request.getSession(); // Obten la lista de las canciones de la variable de sesión // listaCanciones Lista listaCanciones= (Lista) session.getAttribute("listaCanciones"); // Obtén el índice de la canción a actualizar int nSel = Integer.parseInt(((SeleccionForm)form).getSeleccion()); // Obtén la canción a actualizar de la lista de canciones Cancion cancionActualizar = (Cancion)listaCanciones.getLista() .elementAt(nSel); // Si la canción existe en la base de datos if(cancionActualizar != null) { // Crea un objeto de formulario CancionForm CancionForm cancionForm = new CancionForm(); // Copia los atributos de la canción a actualizar al objeto // de formulario cancionForm para que sean desplegados en la // página editaCancion.jsp cancionForm.setClave(cancionActualizar.getClave());

Page 60: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

264 Struts

ITSON Manuel Domitsu Kono

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 sesión con el // nombre de "cancionForm" session.setAttribute("cancionForm", cancionForm); // Pasa el control a la página "obtenGenerosCancionesAction" return mapping.findForward(OBTENER_GENEROS_CANCIONES); } // Si la canción no existe pasa el control a la página "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>

Page 61: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 265

ITSON Manuel Domitsu Kono

En la página 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 acción ActualizarCancionAction.jsp en el objeto de formulario CancionForm.java.

Figura 6.16 editaCancion.jsp en un navegador web

editaCancion.jsp

<%-- editaCancion.jsp Esta página JSP permite editar los datos de una canción. Forma parte de la aplicación AmanteMusica versión 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" />

Page 62: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

266 Struts

ITSON Manuel Domitsu Kono

<link rel="stylesheet" type="text/css" href="estilos.css" /> <title>Amante Musica: Versión Struts - Actualiza Canción</title> </head> <body> <%-- Incluye la barra de título --%> <%@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 canción. Los valores capturados se envían a la clase de acción ActualizarCancionAction --%> <html:form action="ActualizarCancion.do" method="post"> <%-- Despliega los datos de la canción 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 página --%> <caption>Actualiza Canción</caption> <%-- Los campos de texto despliegan los valores de los atributos almacenadados en el objeto de formulario CancionActionForm, que a se llenó de la canción seleccionada en la clase de acción 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">Intérprete</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 Música</td> <td><html:text property="autorMusica" size="35" /></td> <td class="msjError">

Page 63: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 267

ITSON Manuel Domitsu Kono

<html:errors property="autorMusica" /> </td> </tr> <tr> <td class="derecha">Género</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">Duración</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> <%-- Botón enviar --%> <td><html:submit property="boton" value="Continuar" /></td> <%-- Botón cancelar. Dejar el valor por omisión para el atributo property para que el mecanismo de detección de cancelar en la clase de acción funcione. --%> <td><html:cancel value="Cancelar" /> <%-- Botón restaurar --%> <td><html:reset value="Restaurar" /></td> </tr> </table> </html:form> <%-- Guarda en la variable origen, el nombre de esta página. El objeto de formulario CancionForm requiere saber de que página se envía el formulario para validar los datos del formulario --%>

Page 64: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

268 Struts

ITSON Manuel Domitsu Kono

<c:set value="editaCancion" var="origen" scope="session" /> </div> </div> </body> </html:html> La clase de acción 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 método actualiza() de la fachada para actualizar la canción 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 org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForward; import objetosFormularios.CancionForm; import interfaces.IFachada; import fachadas.FachadaBD; import objetosNegocio.Cancion; import objetosNegocio.Genero; import objetosServicio.Fecha; /** * Esta clase de Acción permite actualizar una canción al catálogo de * canciones del programa AmanteMusica versión Struts * * @author mdomitsu * @version */ public class ActualizarCancionAction extends Action { // Constantes simbólicas para las páginas JSP a las que se le pasará el // control private final static String CANCELAR = "cancelar"; private final static String EXITO = "exito"; /** * Este método implementa la acción de actualizar una canción al * catálogo de * canciones. * @param mapping La instancia de ActionMapping, el mapa empleado para * seleccionar esta clase de acción. * @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 canción

Page 65: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 269

ITSON Manuel Domitsu Kono

* @return Un objeto del tipo ActionForward que encapsula la información * de la página JSP o acción 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 botón Cancelar en la página // "editaCancion.jsp" if(isCancelled(request)) { // Restablece las propiedades del objeto de formulario CancionForm // a cadenas vacías para que no muestren nada en la página // capturaClave.jsp ((CancionForm)form).reset(mapping, request); // Pasa el control a la página "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 canción a partir de los atributos del // objeto de formulario del parámetro form CancionForm cancionForm = (CancionForm)form; // Obten el género de la canción a actualizar Genero genero = fachada.obten(new Genero(cancionForm.getGenero())); // Crea un objeto del tipo canción con los atributos capturados // en la páguna 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 canción del catálogo fachada.actualiza(cancion); // Restablece las propiedades del objeto de formulario. ((CancionForm)form).reset(mapping, request); // Obtiene la variable implícita session con las variables de sesion HttpSession session = request.getSession(); // Guarda la opción seleccionada como el atributo tareaSel en la // variable sesión que es la que contiene a todas las variables con // ámbito de sesión session.setAttribute("tareaSel", "listarCanciones"); // Le pasa el control a la clase de acción obtenCancionesAction return mapping.findForward(EXITO); } }

Page 66: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

270 Struts

ITSON Manuel Domitsu Kono

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 Canción, si hay éxito al actualizar la canción en la tabla canciones, se invoca a la clase de acción ObtenCancionesAction.java para que obtenga la lista de las canciones en la tabla canciones y las guarde en la variable de ámbito de sesión listaCanciones. Luego le pasa el control a la página JSP despliegaCanciones.jsp para que despliegue la lista de canciones una vez actualizados los datos de una canción, 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 aplicación Web sobre el amante de la música. En el caso de uso Eliminar Canciones, la clase de acción ControlAction.java le pasa el control a la clase de acción ObtenCancionesAction.java para que obtenga la lista de canciones en la tabla canciones de la base de datos música, almacene la lista de canciones en el JavaBean ListaCanciones.java y luego le pasa el control a la página JSP seleccionaCancionesEliminar.jsp. En la página seleccionaCancionesEliminar.jsp, se despliega una tabla con la lista de las canciones. La página le pasa el control a la clase de acción ObtenCancionesEliminarAction.java guardando en el atributo selecciones del Javabean SeleccionForm.java los índices de las canciones seleccionadas mediante las casillas de verificación en la página. Cada casilla de verificación de la página se establece mediante el elemento <html:checkbox> de la bibioteca html de Struts. El parámetro property del elemento <html:checkbox> es el nombre del atributo del objeto de formulario usado para

Page 67: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 271

ITSON Manuel Domitsu Kono

pasarle los valores del formulario a la clase de acción y el parámetro 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

Page 68: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

272 Struts

ITSON Manuel Domitsu Kono

seleccionaCancionesEliminar.jsp <%-- seleccionaCancionesEliminar.jsp Esta página JSP despliega una tabla con la lista de canciones del catálogo de canciones y permite seleccionar las canciones a eliminar. Forma parte de la aplicación AmanteMusica versión 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 Música - Versión Struts: Seleciona Canciones a Eliminar </title> </head> <body> <%-- En este bean de tipo ListaCanciones, se almacena la lista de canciones leídas de la tabla canciones de la base de datos musica. Estos datos están disponibles para otros JSPs en la misma sesión --%> <jsp:useBean id="listaCanciones" scope="session" class="objetosTransferencia.Lista" /> <%-- En este bean de tipo Menu, se almacenan los valores que se le asignarán a los parámetros class de los elementos div que forman las opciones del menú. también almacena la opción del menú seleccionada --%> <jsp:useBean id="menu" scope="session" class="menus.Menu" /> <%-- Incluye la barra de título --%> <%@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"> <%-- Título de la tabla --%> <caption>Selecciona las canciones a eliminar</caption>

Page 69: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 273

ITSON Manuel Domitsu Kono

<%-- Títulos de las columnas --%> <th>&nbsp;</th> <th>Clave</th> <th>Título</th> <th>Intérprete</th> <th>Autor Letra</th> <th>Autor Música</th> <th>Género</th> <th>Album</th> <th>Disquera</th> <th>Duración</th> <th>Fecha</th> <%-- Define la variable i para guardar el valor que se enviará con el parámeto sel del botón de radio seleccionado --%> <c:set value="${0}" var="i" scope="page" /> <%-- Para cada canción 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 canción --%> <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> <%-- Botón enviar --%> <td><html:submit property="boton" value="Continuar" /></td> <%-- Botón cancelar. Dejar el valor por omisión para el atributo property para que el mecanismo de detección de cancelar en la clase de acción funcione. --%> <td><html:cancel value="Cancelar" /></td> <%-- Botón restaurar --%> <td><html:reset value="Restaurar" /></td> </tr> </table> </html:form> </div> </div> </body>

Page 70: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

274 Struts

ITSON Manuel Domitsu Kono

</html:html> La clase de acción 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 canción invoca al método elimina() de la fachada para eliminar la canción 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 excepciones.FachadaException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForward; import interfaces.IFachada; import fachadas.FachadaBD; import objetosFormularios.SeleccionForm; import objetosNegocio.Cancion; import objetosTransferencia.Lista; /** * Esta clase de Acción permite eliminar canciones del catálogo de * canciones del programa AmanteMusica version Struts * * @author mdomitsu * @version */ public class EliminarCancionesAction extends Action { // Constantes simbólicas para las páginas JSP a las que se le pasará el // control private final static String CANCELAR = "cancelar"; private final static String EXITO = "exito"; /** * Este método implementa la acción de eliminar canciones del catálogo * de canciones. * @param mapping La instancia de ActionMapping, el mapa empleado para * seleccionar esta clase de acción. * @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 información * de la página JSP o acción a la que se pasará el control */

Page 71: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 275

ITSON Manuel Domitsu Kono

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { HttpSession session = request.getSession(); // Si el usuario presionó el botón Cancelar en la página // "seleccionaCancionesEliminar" if(isCancelled(request)) { // Pasa el control a la página " canciones.jsp" return mapping.findForward(CANCELAR); } Lista listaCanciones= (Lista) session.getAttribute("listaCanciones"); // Obtén los índices de las canciones a eliminar String sels[] = ((SeleccionForm)form).getSelecciones(); // Obten el número 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 canción a eliminar for(int i = 0; i < nCanciones; i++) { // Obtén el índice de la canción a eliminar int nSel = Integer.parseInt(sels[i]); // Obtén la canción a eliminar de la lista de canciones Cancion cancion = (Cancion)listaCanciones.getLista() .elementAt(nSel); // Elimina la canción del catálogo fachada.elimina(cancion); } } catch (FachadaException fe) { // Si ocurrió un error al eliminar una canción del catálogo de // canciones, arroja una excepción que será cachada y desplegada en // la página de error throw new javax.servlet .ServletException("Error al eliminar la canción", fe); } // Guarda la opción seleccionada como el atributo tareaSel en la // variable sesión que es la que contiene a todas las variables con // ámbito de sesión session.setAttribute("tareaSel", "listarCanciones"); // Le pasa el control a la clase de acción obtenCancionesAction return mapping.findForward(EXITO); } }

Page 72: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

276 Struts

ITSON Manuel Domitsu Kono

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 Canción y Actualizar Canción, si hay éxito al eliminar las canciones de la tabla canciones, se invoca a la clase de acción ObtenCancionesAction.java para que obtenga la lista de las canciones en la tabla canciones y las guarde en la variable de ámbito de sesión listaCanciones. Luego le pasa el control a la página 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 aplicación Web sobre el amante de la música. En el caso de uso Listar Canciones, la clase de acción ControlAction.java le pasa el control a la clase de acción ObtenCancionesAction.java para que obtenga la lista de canciones en la tabla canciones de la base de datos música, almacena la lista de canciones en el JavaBean ListaCanciones.java y luego le pasa el control a la página JSP despliegaCanciones.jsp para que despliegue la lista de canciones en una tabla.

Page 73: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 277

ITSON Manuel Domitsu Kono

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 aplicación, este archivo es:

ApplicationResource.properties errors.header=<UL> errors.prefix=<LI> errors.suffix=</LI> errors.footer=</UL> errors.invalid={0} es inválido. 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 número de crédito válido. errors.email={0} no es una dirección e-mail válido. errors.cancel=Operación cancelada.

Page 74: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

278 Struts

ITSON Manuel Domitsu Kono

errors.detail={0} errors.general=El proceso no se completo. Los detalles son. errors.token=La solicitud no se completó. La operación no está en la secuencia. error.global=Error!. errors.obtenCanciones=Error al leer el catálogo de canciones. errors.agregarCancion=Error al agregar la canción. errors.obtenCancion=Error al leer el catálogo de canciones. errors.eliminarCancion=Error al eliminar la canción. errors.cancionInexistente=Error, la canción no existe errors.no.titulo=Faltó el título errors.no.interprete=Faltó el intérprete errors.no.autorLetra=Faltó el autor de la letra errors.no.autorMusica=Faltó el autor de la música errors.no.genero=Faltó el género errors.no.album=Faltó el álbum errors.no.disquera=Faltó la disquera errors.no.duracion=Faltó la duración errors.noInt.duracion=La duración 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 configuración struts-config.xml completo para esta aplicación.

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"

Page 75: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 279

ITSON Manuel Domitsu Kono

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"

Page 76: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

280 Struts

ITSON Manuel Domitsu Kono

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

Page 77: Tema 6 - Struts · El Patrón de Diseño MVC Struts es un marco (framework) para crear aplicaciones Web que implementa el patrón de diseño Modelo – Vista – Controlador (MVC).

Tema 6 Struts 281

ITSON Manuel Domitsu Kono

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