Práctica 3: JSP y Java para aplicaciones web
En esta práctica nos iremos al lado del servidor para que la
aplicación de blogs funcione de verdad. Como resultado de
esta práctica tendremos un sitio web totalmente operativo.
Software y plantillas necesarias para la práctica
Para compilar y ejecutar la práctica es necesario
primero instalar las herramientas de desarrollo y luego usar una serie
de plantillas para crear vuestro proyecto.
- Si vais a hacer trabajo en casa necesitaréis
instalar el software
- Para comenzar con la práctica hay que
- Preparar la
base de datos para poder trabajar
- Copiar el driver
de la base de datos al directorio
common/lib
de Apache Tomcat (que está en /usr/local/apache-tomcat-5.5.17)
- Crear la base de datos. Bajáos el archivo con el script SQL (Actualizado el 14-12-06, corregidos ciertos errores) y en la consola
teclead
mysql -u tw
-p < blogtw.sql
Os
pedirá el password,
que en los laboratorios es "tw". La sentencia
anterior se
conecta con el servidor de base de datos mysql empleando el
usuario "tw" (ya creado en los laboratorios) y ejecuta el SQL contenido
en blogtw.sql.
IMPORTANTE:
aunque tanto el driver como la base de datos son permanentes y no se
borran aunque rearranquéis, en los laboratorios es
conveniente hacer esto al comienzo de todas las sesiones
para evitar posibles problemas con lo que hagan otros usuarios.
- Crear un
proyecto de Eclipse: la primera vez
será necesario crear un nuevo proyecto, al que tendréis que importar:
- El sitio web HTML+CSS+Javascript que habéis desarrollado
hasta
ahora (en la carpeta WebContent)
- El código Java que os
dejamos
para que no tengáis que empezar desde cero (en la carpeta src)
- El archivo context.xml (en la carpeta WebContent/META-INF). Dicho archivo hace posible que el Tomcat gestione las conexiones con la base de datos.
Estructura de la base de datos
La siguiente figura muestra la estructura de la base de datos en un
diagrama E-R. Como puede observarse, hay relaciones uno a muchos entre
entradas-comentarios y entradas-eventos. Además, las tablas
comentarios y eventos tienen claves ajenas. Si se borra una entrada se
borrarán en cascada todos los eventos y comentarios
asociados.
En cuanto a la tabla de usuarios hay que tener en cuenta que por el
momento solo estará el editor del blog (salvo que
hagáis
la parte optativa, en cuyo caso habría más
usuarios y se
podría establecer una relación 1:N entre usuarios
y
comentarios).
En cuanto al SQL tened en cuenta que:
- Cuando un campo es autonumérico en el INSERT se
pone como NULL
- Cuando en un campo TIMESTAMP se quiere introducir la fecha
y hora del sistema se pone como NULL
Estructura del código
El código Java que se desarrollará en la
práctica
viene en dos formas: JSPs (Java mezclado con HTML) y clases Java
(código Java "puro"). La misión de los JSPs es
lanzar las
operaciones necesarias para la aplicación (por ejemplo, ver
las
últimas 5 entradas del blog) y mostrar el resultado. Para
ello
se apoyará en el código contenido en las clases
Java.
IMPORTANTE:
el código
Java incluido en los JSPs debe ser el mínimo imprescindible
para
lanzar las operaciones y mostrar los resultados. Todo el
código
de acceso a la base de datos debe estar fuera de los JSPs en clases
Java auxiliares. Un JSP con mucho código Java va siendo
más difícil de leer y mantener a medida que crece
el
tamaño de la aplicación.
El "reparto de responsabilidades" del
código es como sigue:
- Las páginas
JSP
toman los parámetros de la petición HTTP y llaman
a las
clases Java auxiliares que hay en el paquete tw.datos. Los resultados
(por ejemplo, los datos correspondientes a una entrada del blog) los
reciben en forma de objetos Java cuyos campos muestran en el HTML.
- Las clases del paquete tw.datos
son las que interactúan con la base de datos, insertando
información (nuevas entradas y comentarios) y obteniendo la
actual (listados de las últimas entradas, las de un mes
determinado,..). La información que se obtiene de la base de
datos se "empaqueta" en objetos Java que se le pasarán a los
JSPs
- Las clases del paquete tw.dominio
son los objetos Java en los que se encapsula la información
que viaja a o desde la base de datos.
- El paquete
tw.util contiene clases de utilidad.
A continuación se muestra un diagrama de clases de
la
aplicación para que podáis ver la estructura. Los
métodos que debéis implementar aparecen en
negrita. Pulsad sobre el diagrama para verlo ampliado.
Implementación a desarrollar
Básicamente consiste en que todos los enlaces,
páginas y formularios del sitio funcionen adecuadamente.
Algunas aclaraciones:
- La extensión de aquellas páginas en
las que se inserte código Java debe cambiar de .html a .jsp
- Podéis consultar la documentación generada
a partir
del código (JavaDoc) para saber más
sobre los
métodos, clases y paquetes
- En todas las
páginas:
en la sección de "Archivos"
deben
aparecer automáticamente siempre los enlaces
correspondientes al
mes que se está viendo, los 2 anteriores, y los 2 siguientes
en caso de que no
sean posteriores a la fecha del sistema.
Inicialmente el mes que se está viendo debe ser el actual
según la fecha del sistema, pero cuando se pinche en los
archivos de un mes ese pasará a ser el actual.
- Cuando se inserte
una nueva entrada en el blog,
se deben sustituir los retornos de carro por etiquetas
<br> para
que al mostrar el contenido de la entrada aparezcan varios
párrafos.
- Para subir
una imagen al blog :
- La imagen se debe guardar como un archivo en el
directorio
"imagenes" del servidor, poniéndole como nombre el
identificador
de la entrada asociada y como extensión .jpg. Solo se
admitirán imágenes en este formato, si se intenta
subir
un archivo en otro formato se mostrará una página
con el
error. Chequead si la extensión del archivo a subir es .jpg,
no
hace falta comprobar que efectivamente es un JGP auténtico.
- Usar el siguiente código
de ejemplocomo
base, que muestra cómo guardar un archivo en el
servidor
subido desde un formulario. Los archivos .jar hay que copiarlos a la
carpeta
WebContent/WEB-INF/lib del proyecto de Eclipse y el HTML y el JSP a la
carpeta WebContent. Tened en cuenta que:
- Aunque este ejemplo es un JSP, vuestro
código para
guardar el archivo estará en realidad en el
método
crearEntrada de la clase EntradasBD.
- Para poder darle nombre a la imagen,
necesitaréis
saber cuál es el identificador de la entrada asociada. Este
es
un valor autonumérico y lo genera automáticamente
MySQL.
Puede obtenerse con la instrucción SQL "SELECT
LAST_INSERT_ID()". Devolverá un registro con un
único
campo conteniendo el valor.
- Se deben procesar
los eventos sucedidos en la web para poder avisar al
cliente:
- Cuando se produzcan los diversos eventos (login
del
dueño del blog, nueva entrada, etc.) habrá que
insertar
un registro con la información correspondiente en la tabla
eventos.
- Hay que modificar la petición hecha por el
Javascript de
la práctica 2, añadiéndole el
parámetro
HTTP "fecha" con la fecha a partir de la que
queréis los eventos.
- Hay que crear una página eventos.jsp que
responda a la petición AJAX en el formato que vimos en la
práctica 2.
- Las páginas
de la zona privada
(listar.jsp y editar.jsp) deben comprobar que el usuario haya hecho
login en la aplicación.En caso contrario se
saltará
automáticamente a login.html
Calendario de implementación
Hay que tener en cuenta que la práctica 3 es compleja y los
conocimientos necesarios se irán viendo en las sucesivas
sesiones de teoría. Con lo que se ha visto hasta la fecha
(en el
momento de publicarse este enunciado) no es posible implementar toda la
práctica.
| Para hacer... |
Necesitaréis
saber... |
| Familiarización con Eclipse y Tomcat.
Creación del proyecto en Eclipse. Prueba de la plantilla |
Java (ya visto en clase de teoría) |
| Implementación de los métodos de
las clases del paquete tw.datos |
JDBC (teoría de la semana del 27 nov al 3
dic) |
| Implementación de las páginas JSP |
JSP básico (teoría de la semana
del 27 nov al 3 dic) |
| Parte privada de la web |
Seguridad y sesiones (teoría de la semana
del 11 al 17 de dic) |
Parte optativa
Hacer que los usuarios tengan que registrarse para poder poner
comentarios:
- Hacer una página (o una serie de
páginas) para que
los usuarios se registren. El enlace que permita registrarse debe
aparecer en todas las páginas junto a la opción
de hacer
login. Cuando un usuario se registra se introducirá sulogin
y password en la tabla usuarios,
poniendo como valor del campo rol
"registrado". Si ya existe un usuario con el mismo login se
dará un error y se comenzará el registro de nuevo.
- El enlace "Añadir comentario" de la
página
entrada.jsp no debe aparecer si el usuario no ha hecho login. En su
lugar aparecerá un mensaje indicando "para hacer comentarios
debes estar registrado" o similar y un enlace a la página de
registro.
- Cuando un usuario intente enviar un comentario a una
entrada, hay
que comprobar si ha hecho login. En caso contrario se le
redirigirá a login.html. Si ya ha hecho login no se
mostrará el campo de formulario "autor" y el nombre del
autor se
tomará del usuario actual a la hora de insertar el
comentario en
la base de datos.
Puntuación
- 5 puntos: parte obligatoria
- 1 punto: documentación del código
fuente
- 1 punto: documentación adicional (no se trata de
comentar
línea a línea el código fuente, sino
explicar
cómo se han implementado las cosas: APIs usados para cada
cosa, etc.)
- 1 punto: estructuración, limpieza del
código y modularidad
- 2 puntos: parte optativa
La entrega de la práctica se dividirá en 2 fases:
- Parte pública de la web: hasta
el 7
de enero
- Web completa: hasta el 22 de enero.
Es necesario
cumplir con
las 2 entregas en el plazo acordado para que se corrija la
práctica