TRIBAL PROJECT
POOL DE CONEXION ES CON STRUTS
Java EE con IDE Workshop Oracle | Eladio Del Razo Cuamatzi
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Para esto tendremos que trabajar con un gestor de Base de datos en este caso usare Oracle XE (partimos de que ya está instalado).
Viene con un usuario administrador que es el cual ustedes pusieron su contraseña, a la hora de hacer la instalación, es System y el password que pusieron, al instalar nos pide contraseña y confirmar contraseña.
Aquí lo que hay que hacer es activar un usuario, porque ahorita el usuario es el administrador de la base de datos, pero normalmente no nos conectamos como un administrador si no como un usuario con ciertos privilegios, ya viene pre-creado un usuario que nos va a servir para comunicarnos, vamos a activarlo porque viene desactivado. Vamos a propiedades de administración – Usuarios y viene un usuario llamado HR, viene con un candadito que significa que está bloqueado.
1
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Para desbloquearlo vamos a colocar su estado ha desbloqueado, y vamos a palomear como lo tengo yo.
Vamos a trabajar con las tablas a partir de este que es el explorador de objetos, como el usuario ya viene pre-creado entonces viene con un conjunto de tablas, viene porque este usuario representa un departamento de recursos humanos en una empresa, pero no nos vamos a meter mucho con esas tablas que ya viene pre-fabricadas, pero tampoco nos van a estorbar asĂ que las vamos a dejar ahĂ.
2
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Para eso hay que pensar en un escenario que nos gustaría programar, para eso nos vamos a ir a nuestro libro de Jackarta Struts, nos vamos a la página 28, donde nos habla de un Pool de conexiones con Struts, Struts nos da la opción de conectarnos a nuestra B.D, a través de darle ahí la configuración de Conexión, y él nos devuelve la conexión cuando nosotros se la pidamos.
Le vamos a hacer una conectividad a través de nuestro código de nuestro proyecto. Paso 1 Lo primero que nos dice es que para que nos podamos conectar a nuestra B.D, vamos a necesitar 3 archivos .jar: • • •
Commons-dbcp Commons-pooling Y un jar propio de la B.D del JDBC.
Estos 3 archivos ya los tienen, ya no hay ningún problema, paso número uno ya lo tenemos.
3
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Pasó 2 Tener una tabla donde hacer pruebas, utiliza aquí una tabla user que tiene: • • • • • •
Email Name Last name Password Pone fax,
Nosotros no la tenemos la vamos a construir, nos vamos a nuestro administrador de B.D, y vamos a entrar a nuestro explorador de objetos, que es donde vamos a manipular nuestras tablas, no le pongo user porque Oracle tiene user como una palabra reservada.
CREANDO LA TABLA DE PRUEBA Crear- Tabla – “UsuarioFeb” El nombre de las columnas si las vamos a hacer coincidir con las que están aquí. Las vamos a poner en minúscula, numero de caracteres 80, así con los demás.
4
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Siguiente. Nos pide por una llave primaria, le vamos a dar sin rellenar, porque se va a rellenar de manera automática, si nosotros queremos darle una llave primaria, llenar el campo de llave primaria en cada fila tendremos que darle su valor, la llave primaria es el email.
Siguiente. Aquí nos dice ¿Existe alguna llave foránea de esta tabla? Pues no porque es la primera tabla que he generado, tampoco hay un tipo de restricción particular, le damos terminar.
Antes de ejecutarlo me muestra aquí el SQL de forma automática, si lo comparamos con el del libro es muy parecido, le damos créate.
5
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Genera la tabla, aquí está, con una descripción de los campos, puedo trabajar con sus datos en esta pestaña, aquí le podemos ingresar información, el paso de construir nuestra tabla ya está.
CONECTARNOS A LA B.D – CREAR NUEVO PROYECTO Creare un nuevo proyecto para el ejercicio. Pasos: New – Dynamic Web Project – Nombre: “Struts_Pool_Conexiones”
6
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Desmarcar JSF – Marcar Struts – (Siguiente) palomear “Genérate Desployment Descriptor” Finish
Para conectarnos a la B.D primero ay que agregar estos 3 .jar.
7
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
La posición para colocar estos 3 .jar es la carpeta lib, que está debajo de WEB-CONTEN y WEBINF, para eso solo arrastrar los .jar. F5 para actualizar y ver los nuevos jar,
En la sección WebAppLibrary yo los puedo abrir y checar que paquetes tiene adentro, que clases vienen en cada paquete y eso me puede servir para saber si algo que necesito está dentro del jar que yo acabo de colocar.
CONFIGURACION DE LA CONEXIÓN EN STRUTS-CONFIG Para que Struts nos ayude a una conexión de B.D, necesitamos darle los datos de conexión, y eso lo vamos a hacer en nuestro archivo de configuración principal en decir en el StrutsConfig, en una petición que vamos a conocer como DataSource, vamos al archivo, buscamos la sección de DataSource que viene toda comentada con un ejemplo, quitamos todos los comentarios, primero la vacío.
8
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
ASISTENTE DE WORSHOP PARA XML Yo podría escribir todo lo del libro y ponerlo aquí, sin embargo el IDE me da una opción de escribir los datos. Pasos: -
New Data Source- BasicDataSource Data Source Key: userDB Next Driver Class Name: orace.jdbc.OracleDriver URL: jdbc:oracle:thin:@localhost:1521:XE UserName: HR Password: hr
9
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Quedaría:
¿Qué dice esta configuración? • •
• • •
BasicDataSource - Utiliza una clase llamada “BasicDataSource”( que viene dentro de los jar que colocamos hace un momento). KEY - Para establecer la conexión, le da un nombre ósea un key, es importante porque cuando yo quiera conectarme con el código en java le voy a tener que decir a Struts que key quiero, que DataSource quiero, debe coincidir, le paso la clase que representa al driver, va a cambiar, va a ser una clase ajustada a Oracle, que viene dentro de los .jar. URL de conexión - a donde me quiero conectar, en que computadora esta mi B.D, y como se llama esa B.D. oracle.jdbc.OracleDriver - El driver que viene dentro del jar OJDBC es OracleDriver. jdbc:oracle:thin:@localhost:1521:XE 1. 2. 3. 4. 5.
•
JDBC : La URL es JDBC porque me estoy conectando con JDBC Oracle:Thin: que es el tipo de B.D con el que me estoy conectando LocalHost: porque está ubicada en mi maquina en este momento 1521: la B.D se escucha por defecto en el puerto 1521 XE: la Base de Datos se llama XE
Usuario y Password
Nota: En el caso del ejemplo del libro Struts Jackarta los valores de cada uno de estos va a cambiar porque el autor utiliza otro tipo de B.D y yo usare Oracle XE.
10
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
LAS CONSULTAS SQL Nuevo Paquete - strutsTutorial
Nueva clase- UserRegistrationAction – extends Action
Sobrescribir el método execute.
11
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Caso del PreparedStatement Evita el uso de concatenaciones en las consultas.
Ejemplo:
La variable que es una cadena la trunco y la concateno con Y así sigo truncando y concatenando, este es un Query con concatenación.
Pero esto no lo vamos a hacer no es una buena práctica: En su lugar vamos a usar PreparementStatement, y en los puntos donde yo estaba usando la concatenación voy a poner signos de “ ? ”, son como comodines.
Vean que la cadena nunca se truncó, yo continúo, esos signos de interrogación después por posición 1 y 2 yo los voy a remplazar por valores que serán el usuario y el password.
12
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
La clase PreparementStatement está preparada para que yo trabaje así, cualquier Query que requiera una parametrizacion puede ser usado de esta manera, ahorita fue un Select, pero en el ejemplo del libro (Jackarta Struts) viene un Insert y también se usan los signos de “ ? ”, también sirve con los Update, cualquier consulta. No hay un límite en cuanto a los signos, puede ser 1, 2, 3,… siempre y cuando al terminar la cadena si remplace los signos de interrogación, que ni me sobren o falten signos.
Sabiendo esto: El autor nos pone Insert into “User” todos los campos, 6 signos de interrogación
Donde con posición con este setString sobre la variable statement yo lo remplazo.
Digo: “A mira, la interrogación que está en la posición 1 la quiero remplazar por esto. La interrogación que está en la posición 2 la quiero remplazar por esto….” Sabiendo que son 6 los signos de interrogación. En nuestro caso el Query se va a ver ligeramente afectado porque el nombre de nuestra tabla es distinto, esto va a ir dentro de un Try, porque en cualquier operación de B.D, cualquier cosa podría salir mal. Pero mi tabla se llamaba “usuarioFeb”, cambia el nombre de la tabla, lo demás se mantiene porque son los mismos nombres.
13
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Ya en el código: PreparementStatement viene también de la distribución de java, del paquete java.sql.
Ahora hay que remplazar las interrogaciones por valores reales, aquí el autor recupera los valores de un formulario,
Pero como yo no tengo un formulario con campos, entonces yo voy a colocar los valores así, en duro, por ejemplo un email, name, lastname, password, phone y fax.
Correcciones del codigo El autor del libro lo que le interesa es ejecutar el Query, por eso coloca un Finally y cierra la conexión.
PERO
en realidad a la hora de cerrar la conexión deberíamos asegurarnos de que está abierta, que tal si nunca abrió la conexión, tendríamos una excepción, y además que tal si a la hora de cerrarla no pudiéramos cerrarla por cualquier circunstancia, también habría otra excepción.
14
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Hay más manejo aquí de lo que poner el autor, esta parte es importante, por eso les pondré el código de cómo debería de ser de una manera adecuado ese cierre de la conexión y verificación de que no hay problema: Voy a poner el uso correcto de la excepción para que ustedes me ayuden a copiarlo, el catch y el finally.
EJEMPLO: INTRODUCCION DE DATOS DESDE CODIGO DURO
15
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
UserForm es el nombre de la variable que transformo en el form que te llega del método Execute.
Aquí te llega una variable llamada form, tú la tomas y la conviertes al form que tú sabes que es, porque te llega genérica como ActionForm, ya que la conviertes entonces ya la puedes manipular. Claro nosotros no tenemos todos estos campos que están aquí, de tal manera que no tenemos un formulario adecuado ahorita para pasar los valores.
PROBANDO CONEXIÓN A LA BD Como una simple prueba para ver si hay conexión con nuestra base de datos vamos a imprimir los datos de la B.D en la consola. Para eso: Ya que aún no tenemos un formulario vamos a mapear directamente nuestra acción para que se ejecute al iniciar nuestro servidor. Dentro de Strut-Config.xml en la sección Action-Mapping
16
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
EJECUTAR AUTOMATICAMENTE MI ACTION Y para que se ejecute automáticamente mapeamos que se vaya directamente a ejecutar mi Action n el global-forwards: Porque: El web.xml mapeara cualquier solicitud que termine con *.do del ActionServlet de Struts.
Como nuestro Action mapea a una salida success, crearemos un JSP con un simple mensaje de ejemplo
Crear una nueva JSP “RegSuccess” Creamos el nuevo JSP dentro de la carpeta pages.
17
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Mostrando valores usando la interfaz ResultSet. El caso más usual en aplicaciones web es el de mostrar el resultado de una consulta Por pantalla. Como ejemplo quiero ver la salida en mi consola para corroborar que efectivamente se han introducido los datos a mi B.D (por ahorita así ;P) y ocupare algunos de sus métodos. Así que agrego mi ResultSet (en el UserRegistrationAction):
Checamos, ejecutando nuestro servidor Web Logic Server
18
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
El c贸digo se conecta a la B.D y agrega datos y los muestra en consola (Bueno si sirve :D)
19
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
VERSION 2.
IMPRIMIR EN EL NAVEGADOR LOS DATOS DE LA B.D
Alternativas (Teoria) Opcion1 Tomar el ResultSet que tengo y que ya está cargado entonces pasárselo al JSP.
¿Cómo se lo pasaríamos? Como un atributo del Request, yo tomo el ResultSet que ya estamos manipulando y lo pongo como un atributo el Request, y ya en el JSP sé que lo recupero como un atributo y por medio de un While como el que hicimos ahorita en la acción lo hacemos en el JSP y lo imprimimos (Este es el problema de los Servlets y JSP). Es una alternativa, sin embargo aquí hay un pequeño detalle.
Si nosotros pensamos en el Modelo MVC:
Principios Fundamentales del MVC Las 3 capas que conforman el proyecto deben ser INDEPENDIENTES. Capas Controller no deber saber cómo funciona la Capa del Model, ni debe saber cómo funcionaba la capa de la Vista. El Controller controla el flujo, pero no debería saber cómo se imprimía el resultado final, ni saber cómo se ha calculado los resultados, solo sabe cómo va la distribución del flujo. Modelo solo debe saber cómo calcular los datos pero no saber realmente como ha llegado la petición, ni que se va a hacer después con la respuesta ni cómo se va a imprimir esa respuesta, solo calcular la respuesta y ya. Vista no debe saber de donde ha llegado la petición, ni saber cómo se había calculado la respuesta, simplemente tomar el resultado y mandarlo a imprimir. Por lo tanto si yo le envió el ResultSet al JSP 20
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
El JSP dice: “A ya sé que este resultado lo calculaste en base a una consulta de la B.D” Entonces ya está teniendo información de más de lo que debería saber.
El JSP solo debe saber: “Me llego una colección, como se calculó quien sabe, si la llenaron a mano, de un archivo o de una B.D, a mí no me interesa solo sé que me llego esa colección y que la tengo que imprimir”. Hay que buscar siempre esa separación entre las capas, por lo tanto si esto lo programamos no tuviera problema de una manera teórica siguiendo, Pero el patrón MVC no sería lo ideal, entonces no, mejor no.
Buena Practica Entonces tomo el ResultSet lo vacío en una COLECCIÓN, en un arreglo normal o un ArrayList, y ese ArrayList se lo paso al JSP.
El JSP: “ya me llego una colección, ya está llena, como se llenó quien sabe”, pero ya lo puedo empezar a recorrer para imprimir.
¿Qué tipo de datos va a tener este ArrayList, como lo voy a rellenar? Podemos usar AddElement o Add solito “ L.Add(result.getString(email))”
21
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
O un Problema!! En una sola lista me va a ir agregando todos los campos de una B.D, independientemente si son 100 campos todos los va a llenar en un ArrayList
En cada posición pondrías uno nuevo, Firsname, Lastname, continuaríamos haciendo Add y colocando el resto de las columnas que vamos recuperando. Ya tiene un ciclo While que tiene adentro Resultados.Next entonces si hay siguiente muévete al siguiente, me mueve al siguiente, y del siguiente recupero el email y el nombre, si hay otro siguiente recupero del siguiente el email y el nombre, me voy moviendo fila por fila. Cada vez que me muevo recupero el nombre y el email fila por fila como un estilo Scanner. Ej.
Nuestra lista se va a llenar con todos los pasos el problema va a ser para sacarlos.
PROBLEMA
El problema es sacar los datos, podríamos hacer corte cada 6(email, nombre, apellido…) y ya los recupero, hasta ahí funciona bien. Qué pasa si no pongo fax, ahora tendría que modificar el código, implica ir al JSP y reprogramar cada cambio. No sé cuántos cambio puede haber en esos resultados. Me gustaría que sin importar los cambios pues no tuviera hacer tantos cambios, sobre todo por el conteo del índice que es lo más latoso, hacer un algoritmo que haga los cortes exactos en la posición que corresponda me cuesta algo de trabajo. Sobre todo si recupero un usuario y ese usuario no tenía password, a lo mejor esa posición no aparece en el arreglo, mi corte iba cada seis y en uno me encontré que hiba cada tres, ahí ya se descuadro toda la información. No puedo depender entonces de estas posiciones, tengo que aislarlo de este cálculo de cortes.
22
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Solución Orientado a Objetos Estamos pensando de una manera estructurada, procedural, queremos aquí resolver un problema orientado a objetos. Buscamos un objeto que empate con estos valores. No hay ningún objeto que empate con estos valores porque no lo hemos creado. Estamos obteniendo valores de la tabla usuarios, por lo tanto son usuarios, creo una clase que se llame usuario ( con los campos email, firsname, lastname,…). Entonces voy a construir un arreglo de tipo usuarios, en cada posición del arreglo voy a poner un objeto usuario que trae todos los datos de un usuario.
Esta es una solución orientada a objetos. Así es como deberíamos de pensar. La programación estructurada ya murió hace muchos años, ya es vieja. Vamos a hacerlo:
Manos a la obra!! Construimos un nuevo proyecto versión 2, con los mismos elementos con la diferencia de que este si imprime en el navegador.
23
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Pasos: Nuevo proyecto – Struts_Pool_Conexiones_Ejemp2. Dinamic Web Project – Desmarcar JSF y marcar Struts – Marcar Generate Deployment Descriptor - Finish
Y como siempre se necesitan los plugin para la conexion a la B.D
Nuevo paquete strutTutorial Crear dentro las clases: • UserRegistrationAction • UserRegistrationForm • Usuarios
24
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
UserRegistrationAction.java
25
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
26
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
UserRegistrationForm.java
27
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Usuarios.java Vamos a construir una clase usuario, y vamos a recorrer el ResultSet y por cada resultado que ofrezca el ResultSet creamos un objeto usuario, que colocamos como una posición del ArrayList, para que finalmente enviar el ArrayList al JSP y luego imprimirlo, vamos a hacer esta parte… Pasos: Nueva Clase (en el mismo paquete) “Usuarios.java”
28
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
MessageResources.Properties
29
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Creamos un JSP “RegSuccess.jsp”
30
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Configuraci贸n Struts-Config.xml
31
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Probando el codigo
32
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Etiquetas Struts y JSTL Hay acciones en Struts que pertenecen a 3 categorías. • • •
LoginBean HTML OUT
Login - Iterate Dentro de la categoría Login, de las Acciones de Struts, hay una acción llamada Iterate, que sirve para iterar sobre colecciones, viene en el libro (Jackarta Struts).
Modo de uso - TagLib
Para usar una acción primero tenemos que agregar un TagLib, voy a colocar en TagLib Logic y entonces asi poder utilizar la acción Iterator. El Iterate dice: “Hay que pasarle un ID, donde el ID es el nombre de identificador,y nombre donde nombre es el nombre del atributo”. RegSuccess.jsp (del ejemplo anterior)
33
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
OK, si en mi Request hay un atributo llamado usuarioss, yo tengo que poner aquí solo el nombre del atributo, nada más, ni siquiera tengo que decir que viene del request, ya se entiende que viene en este caso de alguno de los alcances, en este caso el Request. Por eso nos pone aquí: A mira, escribí usuario tal como yo lo había escrito cuando invoque al método setAtribute, desde la acción en este caso. Y luego, va a iterar de una forma automática sobre estos usuarios, y por cada iteración me va a devolver la referencia de este objeto de esa iteración en este momento, a través de algo que v voy a conocer como usuario, como si fuera una variable de iteración, una variable que va a apuntando al objeto al cual estoy iterando en este momento.
Core(JSTL) - clase C
Bueno ya recupere usuarios y lo que voy a hacer es mandar a imprimir, para imprimir este objeto que está siendo referenciado por usuarioss, voy utilizar otra categoría en este caso C de la categoría Core, pero esta categoría no es una etiqueta, no es una acción de Struts, no pertenece ni a logic ni a bean, ni a HTML, esta categoría pertenece a algo llamado JSTL, que son las acciones estándar de JSP. Todos los JSP a partir de la versión 2.0 ya pueden usar estas acciones estándar que también vienen catalogadas en categorías, ahí no hay que tener Struts, ni ningún Framework, si no que funcionan con cualquier código. Entonces digo : “Dentro de esta categoría Core, existe una acción llamada OUT, que si yo le paso un valor, lo imprime, en esta posición”
El Expresage Lenguage (JSP) y el estándar JavaBean Y el valor que le imprimo es la propiedad nombre del objeto usuario, este necesita un signo de $, conocido como un Expresage Lenguage, que también forma parte de la tecnología JSP, no es propia de ningún Framework. Expresage Lenguaje Es un lenguaje de expresión, un lenguaje de recuperación de datos fácil, no me permite asignar valores, es un lenguaje de pura consulta, pura recuperación. Yo me encuentro con un signo de pesos y entre las llaves pongo que quiero recuperar, en este caso: “Quiero recuperar de usuarios, quiero sacar el nombre, apellido, email, teléfono, fax y contraseña”, este usuario lleva el estándar JavaBean. Como las buenas prácticas dicen que las clases deben llevar el estándar JavaBean, entonces el Expresage Lenguaje va a ir a buscar el getter del nombre, apellido y email, de manera automática. Si la clase no lleva el estándar JavaBean marcaria error, diría “No encuentro el Get de esa propiedad”.
34
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
En este caso usamos TR y TD, porque lo construyo en un formato de tabla(HTML), y entonces va a ir saliendo como filas dentro de la tabla, no importa cuando usuario salieran la tabla crecería o sería más corta. La clave de aquí es : Utilizar acciones de Struts, utilizar acciones de JSTL que se pueden usar en cualquier momento, y Utilizar el Expresage Lenguage que es una forma muy cómoda de extraer datos, y con esto con esto ya está en unas cuantas líneas de código JSP, ya está la impresión de los datos del usuario. Salida de pantalla:
Hay que buscar usar las acciones de etiquetas. Ya de plano no encontremos una acción que nos sirva pues ya metemos un poco de código en JSP normal, pero vamos a ir siempre por esta alternativa.
Consejo uso de los IDE Ahorita nuestro IDE nos da ciertas herramientas, basado en un motor eclipse, pero si nos pasamos a un Eclipse normal, cambiamos este Workshop a un eclipse normal a lo mejor hay unas vista que no aparecen, unas pestañas, entonces ya no hay un generador de código, si yo me aprendo como hacer código en base a estos generadores de código, cuando me lo quiten este generador, me va a costar trabajo. Java está pensado para que el programador programe, por ejemplo del lado del .NET en Visual Studio arrastran y sueltan por todos lados genera cantidades de código, que luego no sabes ni que género, no hay mucha opción, o usas Visual Studio o usas Visual Studio, no hay de otra.
35
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Aprenderse cómo funciona el producto más que el lenguaje hace la vida más cómoda, pero estas muy casado a IDE, la ventaja es que es rápido y cómodo, pero la desventaja es que poco personalizable, genera mucho código basura, a veces el código no te lo genera de la forma que tu quisieras, eso limita el rendimiento y la arquitectura de la aplicación.
Yo quiero una aplicación empresarial que pueda llegar a cambiar y que tu como programador puedas tener control al 100% de la aplicación, si te quito el IDE y te dejo el block de notas, de todas formas tu sabes que hacer para que siga funcionando, muy independiente de la tecnología, por eso los IDEs que usamos no nos ayudan tanto como el visual Studio, si hay que meterle mano.
Recomendación La recordación es que hay que hay que aprenderse mejor el código, y cómo funcionan las cosas y ya después si encontramos un ayudante visual pues que bueno, pero que no dependamos de este auxiliar.
36
Pool De Conexiones con Struts
Versión 3 Teoría
Eladio Del Razo (TribalProject)
USO DEL PATRON DAO
Bueno. Bueno, tenemos aquí un ejemplo de inserción y un ejemplo de recuperación de datos, incluso hasta llegar a un JSP. Ya que estamos hablando del tema de las B.D, el otro día que hablaban de los patrones, había uno de ellos que se enfocaba a las partes de las Persistencia, un patrón que se enfocaba a la parte de la Persistencia de datos.
DAO
Una buena idea es ver cómo puedo integrar DAO en esto, La intención es que vayamos metiendo más patrones a lo largo de nuestro desarrollo, en base a LAS MEJORES ESTRATEGIAS QUE YA EXISTEN. Ya sabemos que funciono la operación, pudimos obtener un resultado, pero ahora habría que integrarle el patrón.
¿Qué dice el patrón que debemos hacer? Tenemos que crear una interfaz, va a ocultar de cierto modo el acceso de los datos, el usuario debe pedir pero no debe saber cómo llego ese resultado. Usa el CRUD por ahí, que es la metodología que utiliza que es el Create, Reader, Update, Delete, como las operaciones fundamentales de las B.D por así decirlo. Vamos a buscar implementar entonces eso. Por un lado tengo mi B.D Oracle, normalmente tengo varias tablas que tienen cierta relación entre sí, por ejemplo “X”,” Y”. Y por aquí una tabla que es usuario, y luego por aquí una clase cliente que puede ser cualquier clase que se conecte y agá una consulta a la B.D.
37
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
En este caso nuestra clase cliente fue nuestra acción de Struts. ¿Qué está sucediendo aquí?, bueno yo estoy conectándome y haciendo una consulta de un Query que está aquí adentro de la acción. Pero no voy a tener siempre una Acción y un Query, en realidad dentro de esta acción podría haber muchos Querys, y se espera que tenga muchas acciones dentro de mi aplicación, y que todas las acciones tengan sus propios Querys. El problema con esto es que yo voy a tener tantas acciones y tantos Querys ahora sí que regados por todos lados.
¿Qué, que va a pasar cuando un administrador de la B.D me pida un cambio? Por ejemplo: Qué pasaría si me dijera: “Mira, sabes que en la tabla usuarios tú tienes un campo llamado FAX, ¿Pues adivina qué?, la acabo de borrar, ya borre ese campo, ya no lo necesitábamos y lo borre” Tendría que hacer un ajuste donde se utilice el campo FAX de la tabla usuario, porque habrá Querys que no tengan la tabla usuarios y ahí no hay ninguna afectación, y abra Querys que si tengan la tabla usuarios pero no ocupen el campo FAX, ahí tampoco hay un empleo.
¿En que clase tengo que hacer Querys en las que aparezca el campo FAX? No podremos decir “A mira en la primera, en la cuarta” Que tal si son muchos programadores los que están echando mano, tu sabes las clases que desarrollas tú, de los otros no te las sabes de memoria, pensemos que hay muchas. No me queda otra más que revisarlas, voy a abrir una y a buscar los Querys que estén adentro y a ver si en esos Querys tengo que modificar, si la abro y en esos Querys habría que modificar pues se aprovechó el tiempo, pero si yo la abro y esos Querys no tenían nada que ver con esos campos FAQ, ya perdí mi tiempo, estoy revisando código que ni siquiera tenía que revisar, o a lo mejor estoy revisando clase por clase pero como hay tantas, alguien me distrae y cuando regreso a revisar ya me salte una, y resulta que esa una que me acabo de saltar, pues ahí se usaba el campo FAQ y a la hora que corro mi programa “truena”.
¿Cuándo entra en Acción el Patrón? Detalle: Como los Querys están regados, no tengo un control preciso sobre ellos y ahí es donde entra el patrón. 38
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
¿Qué me dice el patrón con respecto a esos Querys? El DAO viene a facilitar todo la parte donde en este ejemplo se utiliza la parte de FAX, para no estar buscando solo se modifica en la parte de la DAO, de la interfaz, y ya automáticamente se harían los cambios en todas las demás. DAO sería una clase, donde se meten los métodos de la interfaz que vienen de la DAO, en la interfaz es donde vienen los principales métodos, Create, Update… Bien, tenemos la parejita, la interfaz y su implementación (clase).
Voy a ponerle por ejemplo DAO, y a este le pondré por nombre DAO_IF (pensando que es una interfaz), le voy a poner la nubecita clásica que siempre dibujo para que nuestra mente la absorba. La clase que implementa esta interfaz, entonces dice: “Vamos a tomar los Querys que están aquí (en varias acciones regados) y los vamos a quitar de aquí (en la interfaz) porque no es el lugar correcto, y ahora paso todos los Querys aquí”. Todos los Querys los meto dentro de un método para que no se revuelvan, y así lo que hago es que mis acciones cuando quieren hacer una operación vienen a este DAO y le dicen: “Mira yo quiero el método A, B, C”, y ya no van directo a las acciones de Struts a pedir la consulta a la base de datos, ahora es el DAO quien va a la B.D.
39
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Estrategia de Fragmentación Imagínate que aquí dentro de estas acciones, disperso tenía 500 Querys, y ahora esos 500 Querys disperso los metí aquí, tengo 500 Querys en 500 métodos. Ahora el administrador de la B.D me dice: “Oye ya quite el campo FAX” Ya sería más revisar 500 métodos que 500 acciones. Pero no resulta fácil revisar en 500 métodos, aún resulta un poco complicado y a mí no me gustan las cosas complicadas entonces quiero facilitarme la vida, ya mejoramos. Pero ahora yo quisiera que cuando alguien me pida una modificación sobre un campo de una tabla, no tuviera que revisar en todos los Querys, si no que de una forma supiera donde está un subconjunto de Querys que afectan nada más a esa tabla que está ahí. Si tengo que modificar ese Query (FAX) la pregunta es donde está. Si creo una clase que solo tenga que ver con la tabla usuario, y en otra clase todo lo que tenga que ver con la tabla inventario, y en otra clase todos los Query que tengan que ver con la tabla reporte, ya sería fácil. Ya solo voy a los Querys específicos y no me meto con los otros. Seguimos una estrategia de fragmentación. Podría haber tantos DAO como Querys.
40
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Aquí tengo al usuario DAO, y los que tengo que modificar sobre la tabla usuario ya sé que está aquí, ya no voy a buscar en otro, seria xDao que implementa esta interfaz, y también tendría otra que sería DAO con su interfaz, donde principalmente tengo los métodos CRUD, que son las operaciones básicas que puedo hacer sobre cualquier tabla, no quiere decir que son los únicos métodos que puedo tener, puedo tener más. En cada método irán los Querys necesarios para afectar esa tabla. Algunas acciones usaran un DAO y algunas otras otro DAO, dependiendo en que tabla quieren interactuar, finalmente los DAO ya viene a Oracle a hacer las consultas que correspondan.
Recuperar la conexión a B.D Algo interesante, es que al mover un Query de este DAO, pues necesitamos recuperar una conexión, pero ahorita la conexión la estamos recuperando es a través de un método que se llama getDataSource (un método que recibe el key que pusimos en el Strut-config), este método yo dije que lo estábamos ejecutando desde la clase Action, pero ahora ya no voy a ser Querys en las acciones, ya no tengo necesidad de invocar a este método, pero no lo puedo implementar en los DAO, me falta el request y falta el método porque al no extender el DAO de la clase Action tampoco puedo invocar al método, entonces yo no tengo esa alternativa. UserRegistrationAction.java
) Struts-Config.xml
41
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Tendría que recuperar aquí el getDataSource y luego pasárselo a la clase usuario_DAO para que recuperara la conexión o tendría que tener una clase de conexión independiente que no tuviera nada que ver con Struts, para que el recuperar la conexión y me la devolviera. Tengo que hacer un ajuste depende de lo que yo quiera.
Opciones para recuperar la conexión a B.D Desde la instancia del DAO Puede ser que a la hora de construir una instancia del DAO le pase el DataSource. Y le diga: “Mira este es el DataSource y con esto te vas a conectar”. O puede ser que diga: “Soy yo una Acción (clase) independiente de Struts”, y el DAO sabrá solito como conectarse él ya no le voy a dar una pista.
Conexión de manera independiente Voy a seguir la estrategia de hacerlo de manera independiente, quiere decir que debería haber una clase de conexión que tuviera un método getConection, que yo pudiera invocar desde los DAO, para recuperar la conexión y luego sobre esa conexión ya poder hacer mis consultas.
Enviando datos como objetos Ya con esto con mi clase conexión y con mi DAO ya puedo comunicarme, aquí hay un DETALLE INTERESANTE: Vamos a pensar que yo quiero invocar al método Create desde esta acción que está aquí, quiero usar el método Create de usuarioDAO. 42
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
¿Qué tengo que hacer? Bueno, crear una instancia del DAO, muy común manipularla a través de su interfaz por polimorfismo (una práctica que se van a encontrar con mucha frecuencia, pero yo lo voy a programar así), luego yo digo us.Create y le tendría que pasar paramento una lista de los valores que me servirá a la hora de ejecutar el Query (email, nombre, apellido…).
PATRON TO (TRANSFER OBJECT) ¿Qué pasaría si la tabla usuario tuviera 50 campos? Necesito 50 parámetros, seria tedioso y propenso a errores. La solución está en la programación orientada a objetos, en lugar de enviarle los datos así con valores escalares mejor le paso un objeto, un usuario (habría que crear al usuario primero antes de pasárselo), por ejemplo UsuarioX, pensando que tenemos por aquí una clase usuario que de algún manera es como el mapeo en atributos que están en la tabla usuarios, Luego diríamos: “x.setNombre, y el nombre, x.setApellido , y el apellido y así set, set, set” Y rellenamos al usuario para luego decir: us.CreateX, dejando que internamente el método Create tome esa X que apuntan al usuario y le saque los valores como quiera, a esta clase que nos apoyó para el intercambio de información se le conoce como un TO, de Transfer Object que en sí mismo es un patrón que va de la mano con los DAO. Las clases cliente se comunicaran con el DAO a través de los Transfer Object, básicamente abra un TO por tabla, tanto para colocar información como para extraer.
43
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
PASOS La versión con el patrón DAO – AHORA SEPARAMOS EN PAQUETES LAS CLASES Nuevo proyecto – Struts_Pool_Conexiones_Ejem3. Dinamic Web Project – Desmarcar JSF y marcar Struts – Marcar Generate Deployment Descriptor - Finish
Y como siempre se necesitan los plugin para la conexion a la B.D
Creamos los paquetes necesarios: • • •
acciones dao to 44
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Dentro de los paquete Paquete Acciones: Crear dos clases, uno que será la acción y otro el formulario: • •
UserRegistrationAction UserRegistationForm
UserRegistationAction.java
45
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
UserRegistationForm.java
46
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Creamos el TO Nuevo paquete – to
47
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Creamos el DAO Voy a crear paquetes independientes, creo un paquete DAO y aquí voy a crear el DAO de usuario, que es una interfaz y su implementación. Habíamos dicho, que era UsuarioFebDao_interfaz, UsuarioFebDao_Implementacion. En esta interfaz le puedo meter tanto métodos como yo quiera, ahorita el que me va a servir es el de Read, que debería de regresar el ArrayList, ahorita con este método para mi es suficiente. Lo salvamos.
Nuevo paquete - dao Dentro del paquete dao 2 clases y una interfaz: • • •
Conexión.java UsuarioFebDAO_Implementacion.java UsuariofebDao_Interfaz.java
Nueva Interfaz - UsuarioFebDao_Interfaz
Ahí está la interfaz. 48
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Creamos la Clase Conexión
¿Ahora qué le vamos a colocar ahí dentro del contenido de la implementación? Bueno vamos a hacer una conexión de forma independiente por medio de otra clase, una que tenga un método getConnection(), vamos a crear esa clase antes de colocar código. La podemos poner aquí en el mismo paquete DAO. Como es el único método de la clase getConnection y no me interesa estar creando objetos de tipo conectar, simplemente pedir por esta conexión, voy a dejar este método como un método estático, que me regrese una conexión en Java.sql. El metodo getConnection tiene lo siguiente: De inicio invoca un método estático llamado forName, de la clase Class, que lo que hace es tomar como parámetro una cadena, y buscar una clase que se encuentre dentro de la aplicación con ese nombre, y cargar esa clase en memoria de una manera dinámica, buscar el driver y cargar el driver en memoria para que yo me pueda conectar. El método getConnection simplemente ira a establecer la conexión, yo le paso la URL, después usuario, después password en ese orden, y con eso me devuelve una conexión, y esa es la conexión que regreso. Lo primero que hago con el DAO es recuperar esa conexión, Connection viene de java.sql.
49
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Creamos su implementación (que implementa la interfaz UsuarioFebDao_Interfaz) Nueva Clase – UsuarioFebDao_Implementacion
Conexión.java
50
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Creamos la Implementación del DAO Aquella clase que implemente los métodos de la interfaz “UsuarioFebDao_Interfaz” Ahora vamos a crear la clase que es la implementación, antes hay que importarlos (que ya sabemos de dónde vienen estas clases), ArrayList de Java.util, Usuarios en el paquete TO. Vamos a crear en el mismo paquete de implementación una nueva clase UsuarioFebDao_Implementacion que debe de implementar la interfaz que creamos hace un momento.
Muy parecido a la Action de Struts De ahí el código es lo mismo que hacíamos en la acción, prácticamente haremos copiar y pegar, ya con la conexión puedo hace el Statement, con el Statement lo ejecuto y obtengo el ResultSet, y voy a iterarlo para en nuestro caso ir generando nuestra lista, incluso todo lo que sería el Try y el Catch para la administración de la conexión, quedaría igual. Toda esa parte la puedo copiar y traerla aquí al DAO, también el PreparatementStatement, solo que aquí manda a imprimir, no quiero mandar a imprimir solo ver la lista de tipo usuario, lo que hare aquí es crear lista usuario, creo la lista usuario que va a ser la que voy a ir rellenando aquí. Voy a crear un nuevo usuario, “Usuarios” del paquete “to” , y le voy a ir agregando usuarios por medio de la consulta.
51
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
New – Interface – UsuarioFebDao_Implementacion UsuariofebDao_Inmplementacion.java
52
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
53
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
MessageREsouces.properties
Creamos un JSP “RegSuccess.jsp”
54
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Configuraci贸n Struts-Config.xml
55
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
56
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Versión 4
USO DEL PATRON DAO + FORMULARIO
Nuevo proyecto – Struts_Pool_Conexiones_Ejemp4. Dinamic Web Project – Desmarcar JSF y marcar Struts – Marcar Generate Deployment Descriptor - Finish
Y como siempre se necesitan los plugin para la conexion a la B.D
Creamos los paquetes necesarios: • • •
acciones dao to
57
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Dentro de los paquete Paquete Acciones: Crear dos clases, uno que será la acción y otro el formulario: • •
UserRegistrationAction UserRegistationForm
UserRegistationAction.java
58
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
UserRegistationForm.java
59
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Paquete dao: Crear 3 clases: •
Conexión (clase encargada de la conexion)
• •
UsuarioFebDao_Implementacion UsuariofebDao_Interfaz
Patrón DAO: Clase Interfaz y Clase implementación
Conexión.java
60
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
UsuariofebDao_Interfaz.java
UsuarioFebDao_Implementacion.java
61
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
62
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
63
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Paquete to •
Crear clase Usuarios.
Usuarios.java
64
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
MessageResources.Properties Agregamos mensajes
Creamos 2 JSP (dentro de la carpeta Pages) • •
RegSuccess UserRegistration
RegSuccess.jsp
65
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
UserRegistration.jsp
66
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
67
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Configuraci贸n Struts-Config.xml
68
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
69
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Corriendo la aplicación Run As – Run on Server, Oracle Web Logic Server – Next - Escoger proyecto actual
Checando en la B.D
70
Pool De Conexiones con Struts
Eladio Del Razo (TribalProject)
Probando el codigo
71