Ejercicios de Contexto de Servlets

1. Vamos a probar la aplicación contexto incluida en las plantillas de la sesión. Descomprimir el fichero de plantillas en nuestro directorio de trabajo, e importar la aplicación contexto desde Eclipse.

a) Compilar y desplegar la aplicación web. A continuación iniciaremos el servidor Tomcat, y si en un navegador accedemos a la dirección:

http://localhost:8080/contexto

Veremos la aplicación web ya en marcha.

b) La aplicación web nos permite visualizar los atributos de contexto definidos y sus valores, y añadir nuevos atributos. A parte de los atributos que nosotros añadimos manualmente, ¿hay más atributos de contexto definidos?

c) Podemos añadir nuevos atributos de contexto. Daremos un nombre del atributo, y un texto que contendrá como valor. Además como valor también se introducirá el identificador de sesión del navegador que haya creado dicho atributo. Abrir varios navegadores (por ejemplo konqueror y mozilla) y añadir atributos de contexto desde cada uno. Comprobar que en cada navegador vemos tanto los atributos creados en su sesión, como lo atributos creados creados en las sesiones de otros navegadores (el identificador de sesión será distinto).

d) Si nos fijamos en el descriptor de despligue, web.xml, veremos que se ha añadido un listener sobre los atributos del contexto. Este listener imprime mensajes en el log indicando cuando se añade, elimina o reemplaza un atributo de contexto. Comprobar en el fichero de logs correspondiente:

 $CATALINA_HOME/logs/localhost_log<fecha>.txt

que se han registrado los cambios en los atributos que hayamos hecho.

Ejercicio final de Servlets

1. Vamos a realizar una aplicación de chat utilizando servlets. La aplicación deberá tener las siguientes páginas:

La lista de mensajes de la página del chat deberá:

Contestar a las siguientes preguntas:

a) ¿En qué ámbito (petición, sesión o contexto) introducirías el nick del usuario? ¿Por qué?

b) ¿En qué ámbito introducirías la lista de mensajes del chat? ¿Por qué?

c) La lista de mensajes deberá ser inicializada una única vez antes de que el primer cliente se conecte al chat. ¿Cuál será el lugar más apropiado para hacer esta inicialización?

Implementar la aplicación web con servlets, para ser desplegada en el servidor Tomcat. Puedes seguir la siguiente guía de implementación como ayuda:

Contenido estático

La página del chat se puede hacer utilizando marcos (frames), de forma que tendremos los siguientes dos marcos:

En las plantillas de la sesión puedes encontrar un ejemplo en HTML del aspecto que podría tener esta página de marcos.

La página de mensajes deberá generarla dinámicamente el servidor. El resto de páginas serán estáticas:

/index.html Página de login. Contendrá el formulario donde se introducirá el nick del usuario.
/chat/frames.html
Página principal de los frames (marcos) de la aplicación de chat. Mostrará un frame con el formulario para enviar mensajes, y otro con la lista de mensajes enviados.
/chat/envia.html
Formulario para enviar mensajes al chat.

Servlets

Para acceder a las funcionalidades de la aplicación necesitaremos implementar una serie de servlets:

LoginUsuario Recogerá el nick que el usuario ha introducido en el formulario de login e introducirá esta información en la sesión. Si el nick es correcto nos redirigirá (utilizando sendRedirect) a la página de marcos del chat (/chat/frames.html), si no volverá a mostrarnos el formulario de login (/index.html).
EnviaMensaje Publica un nuevo mensaje en la lista de mensajes del chat. Para ello recoge el mensaje introducido en el formulario de envío de mensajes y lo insertará en la cola de mensajes junto al nick del usuario actual, que deberá extraer de la sesión. Una vez registrado el mensaje, mostraremos en la salida el contenido de /chat/envia.html, mediante un objeto RequestDispatcher.
ListaMensajes

Mostrará los mensajes enviados al chat junto al nick de quien los envió. Leerá la cola de mensajes e irá generándo una página HTML que muestre estos mensajes, anteponiendo a cada uno el nick del remitente.

Para que la lista de mensajes se actualice periodicamente en el cliente, haremos que se recargue cada 5 segundos. Para esto añadiremos la cabecera HTTP correspondiente a la respuesta para que esto ocurra (cabecera "Refresh" con valor "5").

Los mensajes enviados por el usuario actual se mostrarán en negrita. Obtendremos el nick del usuario actual de la sesión y escribiremos en negrita los mensajes cuyo nick sea igual al nick del usuario.

Clases auxiliares

Necesitaremos clases de apoyo para almacenar la lista de mensajes del chat:

ColaMensajes Lista que almecena los últimos N mensajes (por ejemplo, N=20). Podremos insertar mensajes en la cola de mensajes, y obtener la lista de los mensajes ya insertados. Si el número de mensajes insertados supera N, se eliminará el mensaje más antiguo para que nunca haya más de N mensajes en la lista.
Mensaje Clase que encapsula cada mensaje. Deberá contener información acerca del nick del remitente y del texto del mensaje.

La cola de mensajes será el objeto común al que acceden los servlets para el envio y la consulta de estos mensajes. Por lo tanto el objeto deberá añadirse como atributo del contexto. Esto lo tendremos que hacer antes de que cualquier servlet se haya ejecutado. Para ello debemos crear un objeto ServletContextListener que en la creación del contexto inicialice la cola de mensajes (ColaMensajes) y la introduzca como atributo en el contexto global.