1. Planeando la Estructura Las aplicaciones Web Simples pueden ser diseñadas utilizando una arquitectura two-tier (cliente-servidor), en la cual la aplicación se comunica directamente con un servidor web. Las peticiones de usuarios son enviadas al servidor mediante haciendo uso del protocolo http, son procesadas por el servidor y en caso de que la petición proceda los resultados son enviados directamente al usuario, éstos normalmente son archivos escritos en html, con información estática. Las arquitecturas Two-Tier pueden ser mapeados fácilmente a una configuración cliente – servidor, donde el navegador web del usuario sirve como cliente, y una base de datos remota accesible a través de Internet corresponde al servidor (pero en medio está una tercera capa, el servidor web que se encarga de generar las páginas web –archivos html- a partir de la información contenida en la base de datos, para lograr generar estas páginas de forma dinámica, el servidor web ejecuta scripts encargados de ello. Dichos scripts pueden estar escritos en java, en unas clases especiales conocidas como Servlets. Los servlets son objetos que corren dentro del contexto de un contenedor de servlets (ej: Tomcat) y extienden su funcionalidad. La palabra servlet deriva de otra anterior, applet, la cual se refería a pequeños programas escritos en Java que se ejecutan en el contexto de un navegador web, mientras que un servlet es un programa que se ejecuta en un servidor. El uso más común de los servlets es generar páginas web de forma dinámica a partir de los parámetros de la petición que envíe el navegador web. La aplicación que tú desarrollarás en esta actividad, involucra la creación de dos páginas JSP (Java Server Pages). La diferencia entre JSP y Servlet, está en que JSP es una representación gráfica de un aplicación java que interactua con HTML y el servlet es la aplicación Java. En cada una de esas páginas, agregarás HTML básico para implementar una interfaz simple, seguida por tags SQL las cuales son provistas por la tecnología JSTL para hacer una petición a una base de datos. Considera el siguiente escenario cliente – servidor: Figura 17 Escenario Cliente Servidor (Cliente: Navegador Web / Servidores: Web y de Base de Datos) La página de bienvenida (index.jsp) muestra al usuario un formulario simple HTML. Cuando un cliente entra a la página index.jsp, el código JSP contenido en ésta se analiza y recupera los datos de la tabla Sujeto en la base de datos , los datos se añaden a la página que finalmente es enviada al cliente (navegador web). Ahora, cuando el usuario selecciona algún elemento del formulario mostrado, provoca que el cliente haga una solicitud a response.jsp. Cuando se analiza response.jsp, los datos tanto de la tabla Sujeto como la de Consejero son obtenidas e insertados dentro de la página. Finalmente, la página regresa al cliente (navegador web) y el usuario visualiza los datos del elemento que seleccionó desde el formulario. 2. Crea un nuevo Proyecto Con el fin de aplicar el escenario descrito anteriormente, desarrollarás una simple aplicación de un departamento ficticio llamado SBXDADW, Sistemas BX – Desarrollo de Aplicaciones y Diseño Web. La aplicación permite a un usuario elegir un empleado desde una lista desplegable (index.jsp), entonces recupera datos de la base de datos MySQL y devuelve la información al usuario (response.jsp): a. Abre el IDE Netbeans 6.1, selecciona File > New Project (Ctrl-ShiftN) desde el menu principal. Debajo de Categories selecciona Web; debajo de Projects selecciona Web Application. Da clic en Next. b. En Project Name, escribe SBXDADW. De la lista desplegable Server drop-down list, selecciona TomCat. Deja todas las demás configuraciones por omisión (default) y da clic en Finish. NetBeans crea una plantilla de proyecto para toda la aplicación, y abre una página JSP vacía (index.jsp) en la parte central. 3. Preparando la Interfaz Empecemos por preparar una interfaz simple para las dos páginas. Ambas tanto index.jsp como response.jsp contienen una tabla HTML para desplegar la información de un modo estructurado. La página index.jsp también requiere un formulario HTML que incluye una lista desplegable. 3.1 index.jsp Asegúrate de que index.jsp está abierto en la parte central del IDE. Si no es así, da doble clic en index.jsp desde la Pestaña Projects seleccionando SBXDADW > Web Pages. a) Ya que se haya abierto la página index.jsp en el Editor (Parte Central del IDE), cambia el texto entre las etiquetas <title> a Página Principal de SBXDADW. Figura 18 Estructura de la página index.jsp b) Cambia el texto entre las etiquetas <h2> por: Bienvenido a SBXDADW, Sistemas BX – Desarrollo de Aplicaciones y Diseño Web. c) Abre la paleta del IDE, seleccionando desde el menú principal Window > Palette (Ctrl-Shift-8). Pasa el puntero del mouse sobre el icono Table y nota que el código por default para ese elemento es el siguiente (ver figura 19): Figura 19 Paleta de Herramientas HTML de NetBeans d) Posiciónate justo después de la etiqueta </h2> y presiona Enter, ahora da clic en el botón Table de la Paleta anteriormente vista (Figura 19) y arrástralo hasta ese punto, saldrá el siguiente cuadro: Figura 20 Insertando una Tabla en NetBeans Cambia los datos que te salen, por los que se muestran en la Figura 20. e) Agrega el siguiente contenido a la tabla recién creada, en las primeras etiquetas <th></th> y en las primeras etiquetas <td></td> (nuevo contenido está resaltado) <table border="0"> <thead> <tr> <th> SBXDADW ofrece Servicios Profesionales de Diseño de Aplicaciones y Páginas web </th> </tr> </thead> <tbody> <tr> <td>Para ver la información de alguno de nuestros expertos, selecciona uno del siguiente formulario.</td> </tr> Tecnologias: aplicar efecto de resaltado y después dejar normal. f) Para la última fila de la tabla (<tr></tr>), arrastra y suelta el botón de Form desde la paleta de HTML, directamente entre el segundo par de etiquetas <td></td>, ver Figura 21. En la parte de Action del dialogo del Formulario, escribe response.jsp después da clic en OK. Figura 21 Insertando un Formulario (Form) g) Entre las etiquetas <form></form> que se crearon después de arrastrar y soltar el botón Form, escribe lo siguiente: <strong>Selecciona un Empleado: </strong> h) Arrastra y suelta una lista desplegable (Drop-down List) desde la Paleta a un punto justamente debajo del texto que acabas de agregar anteriormente. Cuando sueltas la lista desplegable, te saldrá una ventana, en el primer campo que dice Name escribe sujeto_id, lo demás déjalo tal y como está, veremos más adelante como agregar varios elementos a una lista desplegable. i) Ahora arrastra y suelta un botón justo después de la etiqueta </select>, en la ventana que se abre, para los campos Label y Name escribe: Submit para los dos. Figura 22 Insertando un Boton j) Tu código actualmente está desalineado, para mejorar la lectura de tu pagina web y de tus programas, puedes presionar: Alt + Shift + F, cuando hagas ésto tu código automáticamente se ordenará. k) El código que debes tener en tu pagina, debe ser similar a lo siguiente: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Página Principal de SBXDADW </title> </head> <body> <h2>Bienvenido a SBXDADW, Sistemas BX – Desarrollo de Aplicaciones y Diseño Web</h2> <table border="0"> <thead> <tr> <th>SBXDADW ofrece Servicios Profesionales de Diseño de Aplicaciones y Páginas web </th> </tr> </thead> <tbody> <tr> <td>Para ver la información de alguno de nuestros expertos, selecciona uno del siguiente formulario.</td> </tr> <tr> <td><form action="response.jsp"><strong>Selecciona un Empleado:</strong> <select name="subject_id"> <option></option> <option></option> </select> <input type="submit" value="Submit" name="Submit" /> </form> </td> </tr> </tbody> </table> </body> </html> l) Para visualizar esta página en tu navegador web, da clic derecho sobre el Editor (donde está todo el código de tu página) y selecciona Run File (Shift + F6). Al hacer esto, la página JSP es automáticamente compilada y se corre en nuestro servidor TomCat. NetBeans abre tu navegador por default con la pagina, como se muestra en la Figura 23. Figura 23 Index.jsp 3.2 response.jsp Con el fin de diseñar la interfaz para la página response.jsp, primero debemos crear el archivo en nuestra aplicación. Ten en cuenta que la mayor parte del contenido que aparecerá en esta página, se generará dinámicamente. 3.2.1. Da clic derecho en el proyecto SBXDADW en la pestaña Proyectos que aparece en la parte superior izquierda de Netbeans y elige New > JSP. Se abre una ventana. Figura 24 Creando un nuevo archivo JSP Figura 25 Configurando un nuevo archivo JSP 3.2.2. En el campo JSP File Name escribe response. Date cuenta de que el directorio Web Pages está seleccionado en el campo Location, lo que significa que la página response será creada en el mismo directorio donde se encuentra index.jsp. Todas las demás opciones déjalas tal y como están y presiona el botón Finish, al hacer esto se genera la página response.jsp y se abre en el editor. También puedes verificarlo en la pestaña de proyectos, se ha creado un nuevo nodo debajo de index.jsp con el nombre response.jsp 3.2.3. Ahora cambia el texto que se encuentra entre las etiquetas <title></title> por lo siguiente: SBXDADW – {placeholder} Tecnologías: Aplicar efecto de resaltar y después dejarlo normal. 3.2.4. Copia y pega el siguiente código HTML de una tabla entre las etiquetas <body></body>: <table border="0"> <thead> <tr> <th colspan="2">{placeholder}</th> </tr> </thead> <tbody> <tr> <td><strong>Descripcion: </strong></td> <td><span style="font-size:smaller; fontstyle:italic;">{placeholder}</span></td> </tr> <tr> <td><strong>Consejero: </strong></td> <td>{placeholder} <br> <span style="font-size:smaller; fontstyle:italic;"> miembro desde: {placeholder}</span> </td> </tr> <tr> <td><strong>Detalles de Contacto: </strong></td> <td><strong>email: </strong> <a href="mailto:{placeholder}">{placeholder}</a> <br><strong>Telefono: </strong>{placeholder} </td> </tr> </tbody> </table> Tecnologías: Aplicar efecto de resaltar y después dejarlo normal. 4. Configuración de un Pool de Conexiones La manera más eficaz de aplicar la comunicación entre el servidor y una base de datos es la creación de una base de datos de conexión tipo “pool” (piscina) (conjunto preestablecido de conexiones). La creación de una nueva conexión para cada cliente puede consumir mucho tiempo, especialmente para las aplicaciones que continuamente reciben un gran número de solicitudes. Para remediar esta situación, numerosas conexiones son creadas y mantenidas en una piscina (pool). Todas las solicitudes que requieren acceso a la capa de datos de la aplicación usan una conexión ya creada desde la piscina. Del mismo modo, cuando una solicitud se ha completado, la conexión no se cierra, pero regresa a la piscina. 4.1. Configuración de una fuente de datos JNDI Tanto Glassfish (Glassfish es un servidor de aplicaciones con soporte para la plataforma J2EE, si deseas conocer mas sobre Glassfish, visita la siguiente página: http://glassfish.dev.java.net como Tomcat y contienen las bibliotecas de la Database Connection Pooling (DBCP) que proporcionan la funcionalidad de conexión a base de datos de una manera que sea transparente para ti como desarrollador. En cualquier caso, tendrás que configurar una Fuente de Datos JNDI para que el servidor cree una interfaz con la cual tu aplicación pueda utilizar el pool de conexiones. Como estamos usando TomCat, nos enfocaremos a la instalación del JNDI en Tomcat, como lo veremos a continuación en los siguientes puntos, pero antes veamos que es JNDI y para que sirve: La Interfaz de Nombrado y Directorio Java (JNDI) es una Interfaz de Programación de Aplicaciones para servicios de directorio. Esto permite a los clientes descubrir y buscar objetos y nombres a través de un nombre y, como todas las APIs de Java que hacen de interfaz con sistemas host, es independiente de la implementación subyacente. Adicionalmente, especifica una interfaz de proveedor de servicio (SPI) que permite que las implementaciones del servicio de directorio sean integradas en el framework. Las implementaciones pueden hacer uso de un servidor, un fichero, o una base de datos. 4.1.1 Desde la pestaña de Projects en la parte superior izquierda de NetBeans, se encuentra primero el nombre de nuestro proyecto y si lo ampliamos se muestran varias carpetas, una de ellas en la carpeta Web Pages se llama META-INF, ahí da doble clic en el archivo context.xml 4.1.2 Agrega las siguientes tags <Resource> (texto resaltado) como una declaración para el recurso JNDI. Tu archivo context.xml debe lucir de la siguiente forma: <?xml version="1.0" encoding="UTF-8"?> <Context path="/SBXDADW"> <Resource name="jdbc/SBXDADW" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="nbuser" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/MiNuevaBD"/> </Context> Tecnologías: aplicar efecto de resaltado y luego dejar normal. 4.2. Referenciando la Fuente de Datos desde la Aplicación Deberás de hacer referencia al recurso JNDI que acabas de configurar a partir de la aplicación web. Para hacerlo, puedes crear una entrada en el archivo web.xml (descriptor de despliegue de la aplicación). Los descriptores de despliegue son archivos de texto basados en XML que contienen información describiendo como una aplicación debe ser desplegada (emplazada y mostrada) en un entorno específico. Por ejemplo, son normalmente usados para especificar los parámetros de contexto de la aplicación y patrones de comportamiento, opciones de seguridad, así como asignaciones para los servlets, filtros y listeners. Para referenciar la fuente de datos JNDI en el descriptor de despliegue de la aplicación, sigue estos pasos: 4.2.1 En la pestaña de Projects, expande la carpeta Web Pages y selecciona la subcarpeta WEB-INF y da doble clic en el archivo web.xml. Se abrirá un editor gráfico en la parte central de NetBeans. 4.2.2 Da clic en la pestaña References localizada a lo largo de la parte superior del Editor. Expande la opción Resource References, después presiona Add, se abrirá una nueva ventana. 4.2.3 En Resource Name, escribe el nombre que configuraste en el JNDI: jdbc/SBXDADW. Para Description: escribe jdbc:mysql://localhost:3306/MiNuevaBD la siguiente Tecnologias: Aplicar efecto de resaltar y luego dejar normal. url: Deja los demás campos tal y como están y presiona Ok. Figura 26 Configurando la URL de nuestra base de Datos 5. Agregando la Lógica Dinámica En este paso deberás de regresar a los archivos index.jsp y response.jsp creados anteriormente, para agregar código JSP y JSQL para permitir que las páginas generen contenido dinámicamente. Para hacerlo, realiza los siguientes pasos: 5.1. Agregando la biblioteca JSTL al Classpath del Proyecto Con el fin de hacer un mejor uso de los recursos JSP a tu disposición, puedes hacer uso de las JavaServer Pages Standard Tag Library (JSTL) para acceder y visualizar los datos tomados de la capa lógica. Esta biblioteca viene incluida en NetBeans, por lo tanto debes asegurarte de agregarla a tu proyecto, también deberás agregar las tags taglib a cada una de las paginas JSP. Esto permite que el servidor que estamos utilizando, identificar los tags cuando sean leídas desde las páginas JSP. Como estamos utilizando TomCat, realiza los siguientes pasos: 5.1.1 Abre tanto el archivo index.jsp como response.jsp en el Editor y agrega las siguientes directivas en la parte superior de ambas páginas: <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> %@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"% Tecnologías: Aplicar efecto de resaltar y luego dejar normal. 5.1.2 Da clic derecho en la carpeta Libraries en la pestaña Projects, selecciona Add Library, se abrirá una nueva ventana, ahí selecciona JSTL 1.1 y da clic en Ok. 5.2. Agregando Código JSP y JSTL 5.2.1 Finalmente, después de haber agregado las directivas anteriores, ambas paginas requieren que implementes un query SQL que utiliza tags JSTL <sql:query> y la fuente de datos creada anteriormente. 5.2.2. Abre el archivo index.jsp. Con el fin de desplegar dinámicamente el contenido del formulario en index.jsp, necesitas acceder a todos los nombres de la tabla Sujeto de la base de datos: 5.2.3 Agrega el siguiente script SQL debajo de las directivas taglib que acabas de agregar en el paso anterior: <sql:query var="subjects" dataSource="jdbc/SBXDADW"> SELECT subject_id, name FROM Sujeto </sql:query> Tecnologías: Aplicar efecto de resaltar y luego dejar normal. Los tags JSTL <sql:query> te permiten usar lenguaje SQL directamente en una pagina JSP. Un resultset es generado desde la petición, y la información adquirida puede ser insertada dentro de la pagina usando un tag iterator (<c:forEach>) desde la biblioteca JSTL core. 5.2.4 Reemplaza los tags vacíos <option> en el formulario HTML por el siguiente iterator: <select name="subject_id"> <c:forEach var="subject" items="${subjects.rows}"> <option value="${subject.subject_id}">${subject.name}</option> </c:forEach> </select> Tecnologías: Aplicar efecto de resaltar y luego dejar normal. El loop forEach hace un bucle a través de todos los valores id y name desde el resultset generado, e inserta cada par dentro de los tags <option>. De esta manera la lista desplegable se llena de información. Tecnologías: Aplicar efecto de resaltar y luego dejar normal. Guarda todos los cambios (Ctrl + S), después da clic derecho en el editor y selecciona Run File (Shift + F6). El archivo es compilado e implementado por el servidor, y después mostrado en el navegador web. La lista desplegable contiene el Puesto de cada empleado desde la base de datos. Figura 27 Conexión a Base de Datos realizada para el elemento Drop Down List (homologar la fuente) 5.3 response.jsp Para el archivo response.jsp necesitas acceder a la información de ambas tablas: Sujeto y Consejero, que corresponda al id seleccionado por el usuario. Esto se puede completar con un query SQL: 5.3.1. Agrega el siguiente script sql debajo de las directivas taglib que hemos agregado anteriormente: <sql:query var="counsSubjRs" maxRows="1" dataSource="jdbc/SBXDADW"> SELECT s.name, s.description, c.first_name, c.nick_name, c.last_name, c.member_since, c.telephone, c.email FROM Sujeto as s, Consejero as c WHERE c.counselor_id = s.counselor_idfk AND s.subject_id = ? <sql:param value="${param.subject_id}"/> </sql:query> Un resultset llamado counSubjRs es generado desde el query, el cual contiene información asociada con el subject_id seleccionado por el usuario. 5.3.2. Agrega la siguiente declaración debajo del query SQL agregado anteriormente: <c:set var="counsSubj" scope="request" value="${counsSubjRs.rows[0]}"/> El tag <c:set> te permite cambiar el resultset a una variable, de modo que usted pueda recuperar su contenido en una etapa posterior 5.3.3. En el código HTML, reemplaza todas las palabras {placeholders} con código JSP que te permita recuperar y desplegar información guardada en el resultset counsSubj, cambia las partes resaltadas: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link rel="stylesheet" type="text/css" href="style.css"> <title>${counsSubj.name}</title> </head> <body> <table> <tr> <th colspan="2">${counsSubj.name}</th> </tr> <tr> <td><strong>Descripcion: </strong></td> <td><span style="font-size:smaller; fontstyle:italic;">${counsSubj.description}</span></td> </tr> <tr> <td><strong>Empleado: </strong></td> <td><strong>${counsSubj.first_name} ${counsSubj.nick_name} ${counsSubj.last_name}</strong> <br><span style="font-size:smaller; font-style:italic;"> <em>miembro desde: ${counsSubj.member_since}</em></span></td> </tr> <tr> <td><strong>Detalles de contacto: </strong></td> <td><strong>email: </strong> <a href="mailto:${counsSubj.email}">${counsSubj.email}</a> <br><strong>Telefono: </strong>${counsSubj.telephone}</td> </tr> </table> </body> </html> 5.3.4 Guarda todos los archivos y presiona Shift + F6. Ahora prueba tu aplicación web. Figura 28 Conexión a Base de Datos Terminada Si tienes alguna duda durante la realización de este ejercicio, puedes comunicarte vía foro, correo o chat. Una vez una vez que termines de realizarlo deposítalo en el portafolio . Deberás enviar el proyecto creado. Guarda en un archivo .zip el proyecto, éste se encuentra en la carpeta NetBeansProjects en Mis Documentos el proyecto se llama SBXDADW toda esa carpeta guardala en .zip y súbela a tu portafolio.