Desarrollo de Aplicaciones Web I

Desarrollo de Aplicaciones Web I 2 CARRERAS PROFESIONALES CIBERTEC DESARROLLO DE APLICACIONES WEB I 3 ÍNDICE Pá

Views 102 Downloads 1 File size 5MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Desarrollo de Aplicaciones Web I

2

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

3

ÍNDICE

Página

Presentación

5

Red de contenidos

6

Unidad de aprendizaje 1: Modelo Vista Controlador – Patrón MVC 1.1 Tema 1

: Fundamentos de Struts 2

9

1.1.1. : Arquitectura y Configuración de aplicaciones

9

1.1.2. : La clase Action

13

1.1.3. : Librerías de etiquetas de Struts 2

29

1.1.4. : Internacionalización – I18N

51

1.2 Tema 2

: Acceso optimizado a base de datos y otras

63

características Struts 2 1.2.1. : Uso de un pool de conexiones para acceso a la fuente

63

de datos 1.2.2. : Librería de Etiquetas de Struts 2 – Principales

72

componentes 1.2.3. : Patrón Composite View – Struts 2 Tiles

87

Unidad de aprendizaje 2: Persistencia de datos – Framework IBATIS 2.1 Tema 3

: Introducción a IBATIS

101

2.1.1. : IBATIS – Introducción

101

2.1.2. : Operaciones básicas de acceso a base de datos con

110

IBATIS 2.2 Tema 4

: Otras operaciones con IBATIS

119

2.2.1. : Otras operaciones y características de IBATIS

119

2.2.2. : Tópicos avanzados de IBATIS e Integración con

128

Struts 2

Unidad de aprendizaje 3: Reportes en Sistemas empresariales 3.1 Tema 5

CIBERTEC

: Reportes con JasperReport

139

CARRERAS PROFESIONALES

4

3.1.1. : Diseño e implementación de reportes con la

141

herramienta Ireport 3.2 Tema 6

: Struts 2 y JasperReport

3.2.1. : Integración de Struts 2 y JasperReport

142 142

Anexo 1

157

Anexo 2

167

Anexo 3

172

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

5

PRESENTACIÓN Desarrollo de Aplicaciones Web I pertenece a la línea de Programación y Desarrollo de Aplicaciones. Es un curso de especialidad sólo en la carrera de Computación e Informática. Permite al estudiante concretizar proyectos informáticos web, aplicando conocimientos previos aprendidos en diferentes cursos y poniendo en práctica la teoría adquirida. De esta manera, consolida conocimientos de diversos cursos de especialidad. Es práctico y desarrollado en laboratorio. Se implementarán soluciones web que utilizarán los Frameworks Struts 2 e IBATIS en forma combinada.

El manual para el curso ha sido diseñado bajo la modalidad de unidades de aprendizaje, las que se desarrollan durante semanas determinadas. En cada una de ellas, hallará los logros, que debe alcanzar al final de la unidad; el tema tratado, el cual será ampliamente desarrollado; y los contenidos, que debe desarrollar, es decir, los subtemas. Por último, encontrará las actividades que deberá desarrollar en cada sesión, que le permitirán reforzar lo aprendido en la clase.

El curso es eminentemente práctico y se desarrolla íntegramente en laboratorio. En primer lugar, se inicia con el reconocimiento de los principales patrones de arquitectura de software, destacándose el patrón Model View Controller (MVC). Luego, continúa con la presentación del Framework MVC Struts 2. Se profundiza en sus principales características y componentes. Después, se desarrollan conceptos de persistencia de datos utilizando para ello el Framework IBATIS. Por último, se concluye con la elaboración de reportes empresariales, utilizando la herramienta IReport, el lenguaje jasperReport e integrándolos a aplicaciones web creadas con Struts 2.

CIBERTEC

CARRERAS PROFESIONALES

6

RED DE CONTENIDOS

Desarrollo de Aplicaciones Web 1

Modelo Vista Controlador – Patrón MVC

Fundame ntos de Struts 2

Otras Características Struts 2

CARRERAS PROFESIONALES

Persistencia de datos – Framework IBATIS

Introducción a IBATIS

Otras operaciones IBATIS

Reportes en sistemas empresariales

Tema 5 JasperReport

CIBERTEC

Tema 6 Struts 2 y Jasper

DESARROLLO DE APLICACIONES WEB I

7

UNIDAD DE APRENDIZAJE

1

MODELO VISTA CONTROLADOR – PATRÓN MVC LOGRO DE LA UNIDAD DE APRENDIZAJE •

Al finalizar la unidad, el alumno, utilizando el framework MVC STRUTS 2, implementa una aplicación web que contenga, en su estructura, el componente Action, las principales etiquetas del framework y acceso a base de datos a través de un pool de conexiones.



Al finalizar la unidad, el alumno se integra a un equipo de trabajo que refleja en su estructura los roles de un equipo de proyecto de desarrollo de software.

TEMARIO 1.1 Tema 1 : Fundamentos de Struts 2 1.1.1. : Arquitectura y Configuración de aplicaciones 1.1.2. : La clase Action 1.1.3. : Librerías de etiquetas de Struts 2 1.1.4. : Internacionalización – I18N

1.2 Tema 2 : Acceso optimizado a base de datos y otras características de Struts 2 1.2.1. : Uso de un Pool de conexiones para acceso a la fuente de datos 1.2.2. : Librería de Etiquetas de Struts 2 – Principales componentes. 1.2.3. : Patrón Composite View – Struts 2 Tiles

ACTIVIDADES PROPUESTAS •

Los alumnos implementan una aplicación web básica, utilizando las principales características del framework MVC Struts 2.

1.1 Fundamentos de Struts 2

CIBERTEC

CARRERAS PROFESIONALES

8

Struts 2 es un framework que implementa el patrón de arquitectura MVC en Java. Éste organiza de manera independiente las capas: Model (Objetos del Modelo del Negocio), View (interfaz con el usuario u otro sistema) y la capa Controller (controlador del flujo de la aplicación. Se muestra, a continuación, el esquema básico de funcionamiento de esta arquitectura. La capa Model en Struts 2 inicia con los componentes Action. Debajo de éstos, se tendrán diversos componentes: 9 Services (Lógica pura de negocio) 9 DAOs (objetos de persistencia de datos), entre otros. Se muestra, a continuación, el esquema básico de la arquitectura MVC implementado por el framework Struts 2.

Figura 1.1

Una característica típica de la capa View de Struts 2 es el uso de unos componentes especiales denominados Results. Éstos normalmente son representados por una página JSP; sin embargo, puede constituir, también, flujos de bytes, objetos del framework Tiles, etc.

1.1.1. Arquitectura y configuración de aplicaciones La arquitectura MVC funciona en Struts 2 básicamente de la siguiente manera: a través de un navegador se genera una solicitud. Ésta es capturada por la capa Controller (implementada por el componente FilterDispathcher representado por un único filtro especializado). Este filtro analizará la solicitud y verificará si el componente invocado se encuentra registrado en el archivo de configuración XML de Struts 2. Éste tiene por defecto el nombre struts.xml.

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

9

El componente invocado, normalmente un Action de Struts 2, instanciará y/o utilizará diversos objetos de negocio para concretar la tarea solicitada. Según el resultado que retorne el componente Action, la capa Controller derivará la respuesta generada a un objeto Result (normalmente una página JSP).

1.1.1.1. Ejercicio 1: Aplicación web básica de Struts 2 Se probará una aplicación web con los componentes mínimos para el correcto funcionamiento del framework Struts 2. a) Paso 1: mportar el archivo struts2-blank-2.1.8.1.war Al descargar el framework struts2 ,se tendrá acceso a una aplicación web de prueba, que cuenta con las características mínimas para que pueda ser ejecutada. Esta aplicación viene empaquetada dentro del archivo struts2-blank-2.1.8.1.war. Luego, de importarla, se visualizará un proyecto web, tal como se muestra a continuación:

1

2

Notas: 1) El principal archivo de configuración del Framework es el archivo struts.xml. En él, se registrarán sus principales

CIBERTEC

CARRERAS PROFESIONALES

10

componentes. Se inicia esta sesión con el registro de la clase Action. 2) Puede observar las librerías mínimas con las que todo proyecto basado en Struts 2 debería contar. Dentro de ellas, destaca el archivo struts2-core-2.1.8.1.jar.

b) Paso 2: Revisar el archivo web.xml

Struts Blank

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts2 /*

index.html

Notas: 1) Note el registro del filtro controlador del framework Struts 2. Este componente “atrapará” todas las solicitudes (request) generadas desde un cliente, dado que tiene como alias /*.

c) Paso 3: Ejecutar la aplicación

CARRERAS PROFESIONALES

CIBERTEC

1

DESARROLLO DE APLICACIONES WEB I

11

d) Paso 4: ¡Excelente!, ha culminado el proceso de probar exitosamente la aplicación web struts2-blank-2.1.8.1

1.1.2. La clase Action

CIBERTEC

CARRERAS PROFESIONALES

12

Un action es, en Struts 2, el primer componente de la capa Model dentro de la arquitectura MVC. Un actions realiza básicamente tres pasos dentro de una aplicación web. En primer lugar, recibe las solicitudes (request) enviadas por un cliente y realiza el trabajo inicial para atenderla. Es el componente que interactúa con la capa controladora y la capa view. En segundo lugar, actúa como un transportador natural de datos entre el objeto request y los componentes de la capa view, esto gracias a las características de transferencia automática de datos que tiene struts 2 entre estos. Finalmente, apoya al framework determinando qué result será retornado en la respuesta que se genere a la solicitud realizada.

Se detalla, a continuación, un ejercicio, en el cual se apreciarán los principales componentes de la arquitectura MVC utilizando Struts 2.

1.1.2.1. Ejercicio 1: Funcionalidad de Logueo Versión 1 Se simulará la funcionalidad de logueo con los componentes básicos del framework Struts 2 y sin acceso a base de datos.

a) Paso 1: Copiar las principales librerías y archivos de configuración al proyecto web funcionalidadLogueov1_Inicial

1

2

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

13

Notas: 1) Observe que solo se puede copiar el archivo struts.xml dentro de la carpeta src, utilizando la vista Navigator. 2) Distinga las principales librerías y archivos de configuración en las ubicaciones correctas: librerías en la carpeta lib y archivo de configuración struts.xml en la carpeta src junto a los archivos fuente.

b) Paso 2: Registrar el filtro controlador de Struts 2 dentro del archivo web.xml

${requestScope.mensaje}

Recuerde que debe utilizar Expression Language (EL) en el JSP bienvenida.jsp para visualizar los datos del cliente cargados en la sesión web.              

1 ${sessionScope.b_usuario.usuario} ${sessionScope.b_usuario.nombre} ${sessionScope.b_usuario.fecnac} ${sessionScope.b_usuario.sexo} . . .

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

f)

51

Paso 6: Ejecutar la aplicación web

Ingrese a la intranet a través de la página de logueo.

Se debe visualizar la pantalla de bienvenida y los enlaces a los idiomas definidos en la página cabecera.jsp. Seleccione la bandera italiana.

CIBERTEC

CARRERAS PROFESIONALES

52

Visualizará la siguiente pantalla con el menú y la bienvenida en idioma italiano. Seleccione la bandera de Brasil.

Se visualizará la siguiente pantalla con el menú y la bienvenida en idioma portugués. Finalmente, seleccione la bandera del Perú.

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

53

Se visualizará la siguiente pantalla con el menú y la bienvenida en idioma castellano.

g) Paso 7: ¡Bien!, ha culminado la funcionalidad “registra imagen con I18n” exitosamente.

CIBERTEC

CARRERAS PROFESIONALES

54

1.2 Acceso optimizado a base de datos y otras características Struts 2

1.2.1. Uso de un Pool de conexiones para acceso a base de datos Un Pool de Conexiones (jdbc) es un conjunto de conexiones preinstanciadas que serán "prestadas" a los threads (hilos) de ejecución a medida que estos lo requieran para que la usen y luego la devuelvan al pool. En el caso de las aplicaciones abiertas en Internet o con gran cantidad de usuarios potenciales, el análisis es el mismo. El recurso es la conexión a la base de datos. Se tendrá un conjunto de “n” conexiones para asignarlas (o prestarlas) a los hilos que lo requieran. Lo recomendable al usar un Pool de Conexiones es que se optimice las consultas a la base de datos para tener mayor rapidez.

1.2.1.1. Ejercicio 1: Funcionalidad Registra Imagen “Pool” Se implementa la funcionalidad indicada haciendo uso de un pool de conexiones de MySql para optimizar el acceso a base de datos.

a) Paso 1: Importar el proyecto FuncionalidadRegistraImagenPool_Inicial.war

CARRERAS PROFESIONALES

web

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

55

1

Notas: 1) Observe que, dentro del proyecto, cuenta en la carpeta META-INF con el archivo context.xml. En él, se debe crear la configuración del pool de conexiones que utilizará para acceder a una base de datos.

CIBERTEC

CARRERAS PROFESIONALES

56

b) Paso 2: Editar el archivo context.xml y configurar el pool de conexiones.

-->

1 2

3

Notas: 1) jdbc/sisepuede es el nombre del pool de conexiones que utilizará para referenciar a la base de datos. 2) El número máximo de conexiones activas es 100 en el ejemplo. Este valor debe ser calculado para cada aplicación web sobre la base de la “experiencia” y el tráfico que normalmente se soporte. En algunos casos, se tendrá la necesidad de incrementar o redecir este valor por defecto. 3) El máximo tiempo de espera, 10000, está expresado en milisegundos. En este ejemplo, se esperará, como máximo, 10 segundos para obtener una conexión disponible (de las 100 existentes). De no conseguirla, se produciría un error.

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

57

c) Paso 3: Modificar el archivo MySqlDbConn.java

package aprendamos.java.util; // Esta clase nos retornara una conexion a base de datos import java.sql.*; import javax.naming.*; import javax.sql.*;

1 2

public class MySqlDBConn { // Utilizaremos mas bien un pool de conexiones // creamos el metodo que nos permite obtener una conexion . . .

Notas: 3) Debe importar el paquete javax.naming.*, ya que en él se encuentran las clases para utilizar JNDI y acceder al pool de conexiones. 4) Debe importar el pauete javax.sql.* debido a que dentro de él se encuentra la clase DataSource. Ésta representa un pool de conexiones en java.

CIBERTEC

CARRERAS PROFESIONALES

58

. . . public static Connection obtenerConexion(){ // 1. Para referenciar al pool creamos un contexto JNDI // Java Naming and Directory Interface Connection cn=null; try { // creamos el contexto JNDI Inicial, JDNI valida los nombres , utiliza la infor de META INF para hacer un pool de conexiones., JNDI maneja nombres y objetos Context ctx = new InitialContext(); // ahora vamos a ubicar un nombre dentro // de este contexto, para ello usamos el // famoso metodo lookup. //Base standar JND String raizContexto ="java:comp/env/";

1

// obtenemos a traves de su nombre a nuestro // pool de conexiones DataSource ds=

2

(DataSource)ctx.lookup(raizContexto+"jdbc/sisepuede"); // le pedimos al pool que nos de una conexion cn = ds.getConnection(); System.out.println( "Mision cumplida, hemos obtenido la conexion del pool");

} catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return cn; }

Notas: 1) El nombre del contexto JNDI por default es java:comp/env. Todas las denominaciones de objetos JNDI (como nuestro pool), se crean debajo de este nombre raíz. Por lo tanto, para referenciar al pool, se pasar primero por el nombre raíz. 2) A través del método lookup y utilizando el nombre raíz del contexto, se referencia al pool de conexiones: jdbc/sisepuede.

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

59

Se obtiene un objeto de tipo DataSource que representa el pool almacenado en memoria.

d) Paso 4: Copiar el conector de mysql dentro de la carpeta lib del servidor de aplicaciones TomCat

1

Notas: 1) Este paso es necesario debido a que es el servidor Tomcat y no la aplicación web, quien solicita al servidor de base de datos las conexiones (en el ejemplo cien), que serán almacenadas en la memoria del servidor y que juntas constituyen el pool de conexiones.

CIBERTEC

CARRERAS PROFESIONALES

60

e) Paso 5: Ejecutar la aplicación web

Ingrese a la intranet a través de la página de logueo.

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

61

Debe visualizar la pantalla de bienvenida con los datos del usuario logueado.

También, se visualizará en la consola de Eclipse los mensajes del Logueo y el que se colocó en la clase MySqlDbConn: misión cumplida, se ha obtenido la conexión del pool.

CIBERTEC

CARRERAS PROFESIONALES

62

f)

CARRERAS PROFESIONALES

Paso 6: ¡Bien!, ha culminado la funcionalidad “registra imagen pool” exitosamente.

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

63

1.2.2. Librerías de etiquetas de Struts 2. Principales componentes Dentro de la familia de nuevas etiquetas de Struts 2, es importante destacar que, en esta versión, todas las etiquetas básicas del framework se encuentran en una sola librería, la cual es referenciada en un JSP de la siguiente manera:

Se detalla, a continuación, ejercicios de aplicación en los que se utilizan las principales etiquetas de Interface de usuario y datos de Struts 2: 9 9 9

1.2.2.1. Ejercicio 2: Funcionalidad carga datos del Cliente Se implementa la funcionalidad indicada haciendo uso de las utilidades incluidas en el Framework para procesar archivos (en el ejemplo la imagen del cliente) a través de un formulario HTML y el uso de un Action de Struts 2 que utiliza un nuevo tipo de Result: stream.

a) Paso 1: Importar el proyecto proyecto web FuncionalidadCargaDatosCliente_Inicial.war

1

CIBERTEC

CARRERAS PROFESIONALES

64

Notas: 1) Debe modificar la página listado.jsp para agregar un enlace que permita visualizar los datos de un cliente en particular.

b) Paso 2: Modificar el archivo listado.jsp Dentro de la página listado.jsp, debe crear un nuevo enlace para visualizar los datos del cliente seleccionado. Complete el código con la lógica mostrada a continuación:

. . . 1



${elcli.usuario}

M



. . .

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

65

2

Notas: 1) Utilizando la etiqueta defina un enlace que permitirá invocar al alias cargaModificaCliente. Adicionalmente, determine el parámetro usuario utilizando la etiqueta . Su valor es asignado usando el siguiente expression language (EL): ${elcli.usuario}

2) Culminado el cambio en listado.jsp, visualizará el enlace, tal como se muestra en la pantalla previa.

CIBERTEC

CARRERAS PROFESIONALES

66

c) Paso 3: Registrar el alias cargaModificaCliente en el archivo struts.xml

1

/modificaCliente.jsp

Notas: 1) El alias cargaModificaCliente fue referenciado en el enlace definido para modificar (M) de la página listado.jsp. Note que al invocar este alias se ejecutará dentro de la clase ClienteAction el método cargaModifica.

d) Paso 4: Crear el método cargaModifica en la clase ClienteAction

La clase ClienteAction debe contar con la siguiente lógica:

package aprendamos.java.action; import java.util.List; import aprendamos.java.bean.ClienteDTO; import aprendamos.java.service.ClienteService_I; import aprendamos.java.service.PaqueteBusinessDelegate;

1

public class ClienteAction { // creamos un atributo de tipo Lista de Clientes ClienteDTO cliente; List clientes; String usuario;

...

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

67

... public String cargaModifica(){ String vista="exito"; try {

2

cliente= servicioCliente.buscaClientePorUsuario( this.getUsuario());

} catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }

return vista;

3

}

...

Notas: 1) Se ha definido la variable usuario de tipo String. Se definen también los métodos setUsuario() y getUsuario(), respectivamente. De manera automática, el Framework instancia el objeto y almacena en éste el parámetro usuario, que llega desde la página listado.jsp. . 2) Note que el método buscaClientePorUsuario recibe como parámetro la variable usuario y retorna un objeto de tipo ClienteDTO que es asignada a la variable cliente. 3) Luego, se retorna a la vista respectiva, es decir, se invocará a la página modificaCliente.jsp

CIBERTEC

CARRERAS PROFESIONALES

68

e) Paso 5: Verificar la clase MySqlClienteDAO La clase MySqlClienteDAO debe implementar la siguiente lógica en el método buscaPorUsuario:

public ClienteDTO buscaPorUsuario(String usuario) throws Exception{ ClienteDTO objClienteDTO=null;

1

Connection cn = MySqlDBConn.obtenerConexion(); //definimos la sentencia String sql="select usuario,clave,nombre,sueldo,sexo,fecnac,foto " + " " + "from tbcliente where usuario = ?"; //la preparamos PreparedStatement pst=cn.prepareStatement(sql); //asignamos valores a las interrogantes pst.setString(1,usuario);

2

//ejecutamos ResultSet rs=pst.executeQuery(); //si hay datos, recuperamos un regsitro if(rs.next()){ objClienteDTO = new ClienteDTO(); objClienteDTO.setUsuario(rs.getString(1)); objClienteDTO.setClave(rs.getString(2)); objClienteDTO.setNombre(rs.getString(3)); objClienteDTO.setSueldo(rs.getDouble(4)); objClienteDTO.setSexo(rs.getString(5)); objClienteDTO.setFecnac(rs.getDate(6)); objClienteDTO.setIsFoto(rs.getBinaryStream(7)); } cn.close(); return objClienteDTO; }

Notas: 1) Note que se obtiene el campo de tipo longblob foto. 2) El campo foto es asignado al atributo isFoto del objeto objClienteDTO. Este atributo es de tipo InputStream, por ello, debe ser recuperado con el método getBinaryStream del objeto ResultSet rs: rs.getBinaryStream(7)

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

f)

69

Paso 6: Ejecutar la aplicación web

Seleccione del listado de Clientes el enlace M asociado a cualquiera de los clientes listados:

1

Notas: 1) Enlace para visualizar los datos del cliente y, opcionalmente, modificarlos.

CIBERTEC

CARRERAS PROFESIONALES

70

En la pantalla mostrada, se visualizarán los datos asociados al cliente seleccionado. Sin embargo, no reconoce aún la fotografía.

g) Paso 7: ¡Bien!, ha culminado la primera parte de la funcionalidad “carga imagen”

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

71

h) Paso 8: Modificar la página modificaCliente.jsp

Dentro de la página modificaCliente.jsp debe utilizar la etiqueta HTML para visualizar la fotografía asociada al cliente mostrado:

. . . Fotografía:



. . .

Notas: 1) Note cómo en el atributo src de la etiqueta se hace referencia al alias cargaImagenCliente. Se envía adicionalmente el parámetro usuario con el valor ${cliente.usuario}.

CIBERTEC

CARRERAS PROFESIONALES

72

i)

Paso 9: Registrar el alias cargaImagenCliente en el archivo struts.xml

1



2



org.apache.struts2.tiles.StrutsTilesListener

1

...

Notas: 1) Debe agregar el listener de Tiles para struts 2.

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

79

c) Paso 3: Modificar el archivo struts.xml









...

3

Notas: 1) Debe crear definiciones de Tiles. Ésta determina qué componentes (JSPs normalmente) se despliegan sobre una plantilla en particular. En el ejemplo, el definition d_bienvenida referencia a la plantilla diseno01.jsp, 2) Un definition puede ser heredado. De esta manera, solo es necesario “sobre escribir” los puts que queramos modificar. En el ejemplo, el definition d_listado hereda del definition d_bienvenida. 3) Note que los puts dentro de los definitions están referenciando a páginas JSP dentro de la carpeta páginas. Ésta debe existir y ahí deben encontrarse las páginas referenciadas.

CIBERTEC

CARRERAS PROFESIONALES

2

80

d) Paso 4: Modificar el archivo struts.xml

...



/logueo.jsp d_bienvenida



...

Notas: 1) Para trabajar con Tiles y struts 2, es obligatorio heredar del paquete tiles-default. 2) Cada de un action, ya no invoca directamente a una página JSP, sino, más bien, a un definition de tiles. 3) Para que un pueda invocar a un definition de tiles es necesario indicar en su atributo type el valor tiles.

CARRERAS PROFESIONALES

CIBERTEC

1

DESARROLLO DE APLICACIONES WEB I

81

e) Paso 5: Crear el archivo diseno01.jsp

1

Notas: 1) El archivo debe ser creado tal como se referenció en el archivo tiles.xml, es decir, dentro de una carpeta llada plantillas.

CIBERTEC

CARRERAS PROFESIONALES

82

f)

Paso 6: Modificar el archivo diseno01.jsp



1

Insert title here







...

Notas: 1) Dado que ahora se trabajará con Tiles, ya no es necesario tener directivas include dentro de los JSPs. Importante: De dejarlas, se duplicaría la implementación del patrón de diseño Composite View.

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

i)

85

Paso 9: Ejecutar la aplicación web

Ingrese a la intranet a través de la página de logueo.

CIBERTEC

CARRERAS PROFESIONALES

86

Visualizará la pantalla de bienvenida de la aplicación

j)

CARRERAS PROFESIONALES

Paso 10: ¡Bien!, ha culminado “Mantenimiento con Tiles” exitosamente.

la

funcionalidad

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

87

Resumen Las etiquetas de struts 2 se encuentran agrupadas dentro de una sola librería:

Las etiquetas de struts 2 son parte de la capa de presentación dentro de una arquitectura MVC. Con Tiles, se puede, fácilmente, cambiar de una estructura de aplicación a otra. A través de éste, únicamente de plantillas, permite tener mayor flexibilidad al momento de una posible migración. Si desea saber más acerca de estos temas, puede consultar las siguientes páginas:  http://struts.apache.org/2.x/index.html Aquí encontrará importante documentación oficial y ejemplos de uso del framework Struts 2  http://struts.apache.org/1.x/struts-tiles/ Aquí encontrará documentación oficial sobre el uso de plantillas Tiles dentro de una aplicación implementada con el framework Struts. También, encontrará referencias para utilizar Tiles independientemente de Struts: Tiles 2.

CIBERTEC

CARRERAS PROFESIONALES

88

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

89

UNIDAD DE APRENDIZAJE

2

PERSISTENCIA DE DATOS – FRAMEWORK IBATIS LOGRO DE LA UNIDAD DE APRENDIZAJE •

Al finalizar la unidad, los alumnos, utilizando el frameworks IBATIS, implementan la capa de persistencia de datos y la integran con el framework Struts 2.

TEMARIO 2.1 Tema 3 : Introducción a IBATIS 2.1.1.

: IBATIS – Introducción

2.1.2.

: Operaciones básicas de acceso a base de datos con IBATIS

2.2 Tema 4 : Otras operaciones con IBATIS 2.2.1.

: Otras operaciones y características de IBATIS

2.2.2.

: Tópicos avanzados de IBATIS e Integración con Struts 2

ACTIVIDADES PROPUESTAS •

CIBERTEC

Los alumnos implementan una aplicación web básica, utilizando las principales características del framework MVC Struts 2 y el framework IBATIS.

CARRERAS PROFESIONALES

90

2.1 Introducción a IBATIS 2.1.1. IBATIS - Introducción Ibatis es un framework (marco de trabajo) de código abierto basado en capas desarrollado por Apache Software Foundation, que se ocupa de la capa de Persistencia (se sitúa entre la lógica de Negocio y la capa de la Base de Datos). Puede ser implementado en Java y .NET (también existe un port para Ruby on Rails llamado RBatis). Ibatis asocia objetos de modelo (JavaBeans) con sentencias SQL o procedimientos almacenados mediante archivos XML, simplificando la utilización de bases de datos. Dentro de sus principales características se destacan: A. Es posible subdividir la capa de persistencia en tres subcapas: • La capa de abstracción será la interfaz con la de la lógica de negocio, haciendo las veces de fachada (Patrón Facade) entre la aplicación y la persistencia. Se implementa de forma general, mediante el patrón Data Access Object (DAO) y, particularmente en Ibatis, se implementa utilizando su framework DAO (ibatis-dao.jar). • La capa de framework de persistencia será el interfaz con el gestor de Base de Datos, ocupándose de la gestión de los datos mediante un API. Normalmente, en Java, se utiliza JDBC. Ibatis utiliza su framework SQL-MAP (ibatis-sqlmap.jar). • La capa de driver se ocupa de la comunicación con la propia base de datos, utilizando uno específico para la misma.

B. Toda implementación de Ibatis incluye los siguientes componentes: • Data Mapper proporciona una forma sencilla de interacción de datos entre los objetos Java y .NET y bases de datos relacionales. • Data Access Object es una abstracción que oculta la persistencia de objetos en la aplicación y proporciona un API de acceso a datos al resto.

El marco de trabajo SQL Maps es muy tolerante, tanto con las malas implementaciones de los modelos de datos como con los modelos de objetos.

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

91

A pesar de ello, es muy recomendable que se usen las mejores prácticas, tanto cuando se diseñe la base de datos (normalización apropiada, etc.) como el modelo de objetos. Al hacer esto, se garantizará un mejor rendimiento y un diseño más claro.

2.1.1.1. Ejercicio 1: Funcionalidad IBATIS - Introducción Se implementará una aplicación web con los componentes básicos para el correcto funcionamiento del framework IBATIS. a) Paso 1: Importar el archivo FuncionalidadIbatisIntro_Inicial.war

1

Notas: 1) Observe que debe contar con las librerías básicas de IBATIS para integrar el framework a su aplicación web.

CIBERTEC

CARRERAS PROFESIONALES

92

b) Paso 2: Copiar los archivos de configuración y la clase UtilSqlConfig

1

2

Notas: 1) SqlMapConfig.xml es el archivo de configuración por excelencia de IBATIS. En él, se define, por ejemplo, el pool de conexiones a utilizar y otros archivos XML (llamados SqlMaps), que serán referenciados en la aplicación web. En el ejemplo, se muestran dos archivos SqlMaps: Cliente.xml y Producto.xml. (Por cada entidad del modelo de datos, normalmente se tendrá un SqlMap).

2) UtilSqlConfig permite tener una representación en java como objeto del archivo SqlMapConfig.xml.

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

93

c) Paso 3: Modificar el archivo SqlMapConfig.xml







select usuario,clave,nombre,sueldo,sexo,fecnac from tbcliente where nombre like #value#

d_reporte

3

. . .

/reportes/reporte01.jasper listaClientes

attachment;filename="contacts.pdf"

PDF

...

Notas: 1) Debe invocar al action reporteFacilito, el cual ya ha sido registrado en el archivo struts.xm. Asimismo, debe generar el listado con jasperreport. f) Paso 6: Cree el action ReporteAction

CIBERTEC

CARRERAS PROFESIONALES

1

132

public class ReporteAction { private String nombre; private List listaClientes;

1

public List getListaClientes() { return listaClientes; } public void setListaClientes(List listaClientes) { this.listaClientes = listaClientes; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String listaClientesPorPais(){ String vista="exito"; //JasperReportConstants.FORMAT_HTML //JasperReportConstants.FORMAT_PDF //JasperReportConstants.FORMAT_XLS System.out.println("dentro de listaClientesPorPais :)"); try { this.setListaClientes( PaqueteBusinessDelegate.getClienteService(). listaClientesReporte(nombre)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("nombre del cliente"+this.getNombre()); System.out.println("redireccionamos a la vista exito!"); return vista; } } ... Notas: 1) El atributo listaClientes es referenciado en el archivo struts.xml como origen de datos para el Reporte. Note que es una lista de objetos de tipo ReporteDTO. Esta clase tiene como atributos los campos que serán mostrados en el reporte. 2) Se define la lista de clientes a obtener, considerando la selección del usuario (el atributo nombre).

CARRERAS PROFESIONALES

CIBERTEC

2

DESARROLLO DE APLICACIONES WEB I

133

g) Paso 7: Modifica la clase ClienteService

public List listaClientesReporte(String nombre) throws Exception{ System.out.println("dentro del listaCliente del Service"); // Aqui podemos colocar logica adicional antes de invocar al metodo // del DAO return objClienteDAO.listaPorNombreReporte(nombre); ...

Notas: 1) Debe crear el método listaClientesReporte para que la clase ReporteAction pueda invocarlo y generar el reporte.

CIBERTEC

CARRERAS PROFESIONALES

1

134

h) Paso 8: Modificar el archivo MySqlClienteDAO

public List listaPorNombreReporte(String nombre) throws Exception { ArrayList clientes= new ArrayList(); 1

Connection cn = MySqlDBConn.obtenerConexion(); //definimos la sentencia String sql="SELECT usuario,password,nombres,apellidos,sexo,fecha_nacimiento,dni, c.cod_pais,p.nom_pais" + " FROM cliente c,pais p WHERE c.nombres like and c.cod_pais = p.cod_pais order by c.cod_pais"; //la preparamos PreparedStatement pst=cn.prepareStatement(sql); //asignamos valores a las interrogantes pst.setString(1,"%"+nombre+"%"); //ejecutamos ResultSet rs=pst.executeQuery(); while(rs.next()){ //hay dayos, recuperamos un ergsitro ReporteDTO cliente = new ReporteDTO(); cliente.setUsuario(rs.getString(1)); cliente.setPassword(rs.getString(2)); cliente.setNombres(rs.getString(3)); cliente.setApellidos(rs.getString(4)); cliente.setSexo(rs.getString(5)); cliente.setFecha_nacimiento(rs.getString(6)); cliente.setDni(rs.getString(7)); cliente.setCod_pais(rs.getString(8)); cliente.setNom_pais(rs.getString(9)); clientes.add(cliente); } cn.close(); return clientes; } ...

Notas: 1) Note cómo, de manera “clásica”, se obtiene una conexión para hacer la consulta respectiva. Debe transformar este código a su equivalente en ibatis. i) Paso 9: Modifique el archivo menu.jsp

CARRERAS PROFESIONALES

CIBERTEC

?

DESARROLLO DE APLICACIONES WEB I

135





...

Notas: 1) Debe invocar al action a_reporte para cargar la página JSP a partir de la cual se generará el reporte.

i)

Paso 10: Ejecutar la aplicación web

Ingrese a la intranet a través de la página de logueo. Se visualizará la siguiente pantalla:

Seleccione la opción reporte utilizando JasperReport

CIBERTEC

CARRERAS PROFESIONALES

136

Se visualizará la siguiente pantalla. Luego, ingrese un criterio de búsqueda. Finalmente, seleccione el botón Listar.

Visualizará una pantalla a través de la que se le consultará si desea abrir o guardar el archivo. Seleccione abrir el archivo.

Visualizará el reporte en una pantalla similar a la siguiente:

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

j)

Paso 11:

137

¡Muy Bien!, ha culminado la funcionalidad

“reportes con JasperReport y Struts 2” de manera exitosa!

CIBERTEC

CARRERAS PROFESIONALES

138

Resumen Se pueden construir reportes visualmente en Java, utilizando la herramienta iReport. Ésta usa como estructura base jasperReport, un lenguaje basado en etiquetas xml y especialmente creado para generar reportes. IReport genera archivos fuente con extensión .jrxml. Los archivos compilados tienen extensión .jasper y pueden ser ejecutados desde una aplicación java web. Si desea saber más acerca de estos temas, puede consultar la siguiente página. http://jasperforge.org/website/ireportwebsite/IR%20Website/iReport_documentati on.html?group_id=243&header=project&leftnav=yes&target=ireport

Aquí, encontrará tutoriales que le permitirán crear reportes utilizando IReport.

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

139

ANEXOS

ANEXO 1: SOFTWARE REQUERIDO

Este curso requiere las siguientes herramientas de software: • • • • • • •

CIBERTEC

Java JDK Entorno integrado de desarrollo o IDE Servidor de Aplicaciones Base de datos Framework Struts 2 Framework MyIbatis MyIbatis Generator

CARRERAS PROFESIONALES

140

HERRAMIENTA #1: Java Development Kit Desde la página de Oracle, descargue la última versión del JDK (Java Development Kit). Se debe considerar que los “updates” de las versiones son periódicos. Se puede navegar por http://java.sun.com, el cual redirecciona a http://www.oracle.com/technetwork/java/javase/downloads/index.html

Para entornos de programación, se requiere el JDK, pero para los de producción basta con el JRE. Por último, ejecute el instalador y siga los pasos indicados en el wizard.

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

141

HERRAMIENTA #2: Entorno Integrado de Desarrollo En un entorno de desarrollo Java, el IDE ( Integrated Development Environment ) es la herramienta de software que permite obtener mayor productividad al programar las aplicaciones. En el mercado, existen varias opciones disponibles, pero las más utilizadas y conocidas son las siguientes: • • • •

Eclipse IDE : Sitio web http://www.eclipse.org NetBeans : Sitio web http://www.netbeans.org JDeveloper : Información disponible en http://www.oracle.com Rational Application Developer: Información disponible en http://www.ibm.com

Eclipse IDE: Primero, descargue Eclipse Helios desde la página de la fundación Eclipse ( http://www.eclipse.org ). Luego, busque la zona de descarga. Por último, seleccione la versión Java EE:

Al terminar la descarga, el .ZIP generado se puede extraer en una carpeta cualquiera (normalmente en la raíz de uno de los discos de la PC). Se puede crear un acceso directo desde el Escritorio apuntando al archivo eclipse.exe

CIBERTEC

CARRERAS PROFESIONALES

142

Rational Application Developer IDE : Descargue el software “IBM Rational Application Developer for WebSphere Software” desde la página web de IBM: http://www.ibm.com/developerworks/downloads/r/rad/?S_CMP=TRIALS

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

143

HERRAMIENTA #3: Servidor de aplicaciones Apache Tomcat Desde la página de la Fundación Apache ( http://tomcat.apache.org ), se debe obtener el servidor de aplicaciones Tomcat. La última versión probada en otros tutoriales ha sido la 6.0.20. Actualmente se encuentra disponible la versión 7 en beta.

Sólo es necesario el “Core”. Descargar el .ZIP y extraerlo en una carpeta.

WebSphere Application Server Desde la página web de IBM, se puede descargar el software del servidor de aplicaciones: http://www-01.ibm.com/software/webservers/appserv/was/

CIBERTEC

CARRERAS PROFESIONALES

144

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

145

HERRAMIENTA #4: Motor de Base de Datos Se necesita un motor de base de datos: En http://www.mysql.com, se puede decargar la Base de Datos MySQL (versión “Community Server” )

Es preferible descargar la versión “NO-INSTALL” para que no afecte el registry de la PC:

Basta con descargar el .ZIP y extraerlo en cualquier carpeta. El servicio de base de datos se activa por línea de comandos de la manera siguiente:

CIBERTEC

CARRERAS PROFESIONALES

146

También, se requiere el “Connector” o driver JDBC:

Las herramientas de Query Browser y MySQL Administrator han sido reemplazadas por MySQL WorkBench:

De igual forma, seleccionar el .ZIP ( que sea del tipo “No Install” ) y extraerlo en alguna carpeta de la PC.

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

147

HERRAMIENTA #5: Librerías de Struts 2 Del sitio web de la Fundación Apache, se obtienen las librerías del framework Struts 2 La última versión liberada es la 2.2.1

Se debe escoger una de las opciones de los archivos .ZIP. Con la alternativa de “Full Distribution”, es más que suficiente.

Extraer el contenido del .ZIP en una carpeta de la PC.

CIBERTEC

CARRERAS PROFESIONALES

148

HERRAMIENTA #6: MyIbatis La página principal se encuentra en http://www.mybatis.org/

En la zona de downloads, la dirección es http://code.google.com/p/mybatis/

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

149

HERRAMIENTA #7: MyIbatis Generator La página principal se encuentra: http://code.google.com/p/mybatis/downloads/detail?name=mybatis-generator-core1.3.1-bundle.zip&can=3&q=Product%3DGenerator

CIBERTEC

CARRERAS PROFESIONALES

150

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

151

ANEXOS

ANEXO 2: MANEJO DE MYIBATIS Ejemplo de una aplicación con MyIbatis

CIBERTEC

CARRERAS PROFESIONALES

152

La Clase entidad

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

153

El Data Access Object para Vendedor

CIBERTEC

CARRERAS PROFESIONALES

154

El Mapper de MyIbatis para el mantenimiento de vendedor es el siguiente:

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

El Archivo de Configuración de MyIbatis • los datos de la cadena de conexión • los tipos de datos de los mappers • la ubicación de los mappers

CIBERTEC

155

Se configura Se configura Se configura

CARRERAS PROFESIONALES

156

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

157

ANEXOS

ANEXO 3: MYIBATIS DynamicSQL Una de las características más potentes de MyBatis siempre ha sido su capacidad de SQL dinámico. MyBatis, sin duda, mejora la situación en el lenguaje SQL, que se pueden utilizar dentro de cualquier mapa instrucciónSQL. Los elementos de SQL dinámico debe ser familiar para cualquiera que haya usado JSTL o cualquier XML, similares a base procesadores de texto. En versiones anteriores de MyBatis, había una gran cantidad de elementos para conocer y comprender. M ejora en gran medida en esto y ahora hay menos de la mitad de esos elementos para trabajar. Asimismo, emplea potentes expresiones OGNL base para eliminar la mayoría de los demás elementos.

• If • choose (when, otherwise) • trim (where, set) • foreach Ejemplo de if:

SELECT * FROM BLOG WHERE state = ‘ACTIVE’

AND title like #{title}

SELECT * FROM BLOG WHERE state = ‘ACTIVE’

AND title like #{title}

AND title like #{author.name}

CIBERTEC

CARRERAS PROFESIONALES

158

choose, when, otherwise

SELECT * FROM BLOG WHERE state = ‘ACTIVE’

AND title like #{title}

AND title like #{author.name}

AND featured = 1



trim, where, set

SELECT * FROM BLOG WHERE

state = #{state}

AND title like #{title}

AND title like #{author.name}

SELECT * FROM BLOG

state = #{state}

AND title like #{title}

AND title like #{author.name}



Foreach

SELECT * FROM POST P WHERE ID in

#{item}

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

159

ANEXOS

ANEXO 3: DE IBATIS 2.X HACIA MYIBATIS En el sqlMapConfig.xml DTD:

En los mappers sqlMap (*.map.xml) DTD:

Configuración: •

La raíz era , ahora es

Settings Ibatis 2.0:

MyIbatis 3.0:



y

CIBERTEC

CARRERAS PROFESIONALES

160



deberia ser movido fuera de hacia



...



Ibatis 2.0:



MyIbatis 3.0:







CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

161

Ibatis 2.0:



MyIbatis 3.0:



Mapping • • • • • •

La raiz del elemento es ahora El atributo parameterClass debería ser cambiado por parameterType El atributo resultClass debería ser cambiado por resultType El atributo class debería ser cambiado por type El columnIndex atributo no existe algun resultado en la etiqueta El groupBy atributo debería ser eliminado.

Ibatis 2.0:





MyIbatis 3.0:





CIBERTEC

CARRERAS PROFESIONALES

162

Nested resultMaps Édebería especificarse mediante tag.

Ibatis 2.0:

...

MyIbatis 3.0:

...

Inline parameters Ibatis 2.0:

#value#

MyIbatis 3.0:

#{value}

jdbcType changes Ibatis 2.0:

jdbcType="ORACLECURSOR"

MyIbatis 3.0:

jdbcType="CURSOR"

CARRERAS PROFESIONALES

CIBERTEC

DESARROLLO DE APLICACIONES WEB I

163

Ibatis 2.0:

jdbcType="NUMBER"

MyIbatis 3.0:

jdbcType="NUMERIC"

Stored procedures •

La etiqueta no existe en MyIbatis. Use , o .

Ibatis 2.0:

{ ? = call pkgExample.getValues(p_id => ?) }

MyIbatis 3.0:

{ ? = call pkgExample.getValues(p_id => ?)}

Caching Ibatis 2.0:



MyIbatis 3.0:

CIBERTEC

CARRERAS PROFESIONALES

164

Dynamic SQL Ibatis 2.0:



MyIbatis 3.0:



CARRERAS PROFESIONALES

CIBERTEC