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/contextoVeremos 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>.txtque se han registrado los cambios en los atributos que hayamos hecho.
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á:
<pedro> Hola
<miguel> Hola, q tal?
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:
- Página de envío de mensajes. Página con el formulario para enviar un mensaje al chat.
- Página de mensajes. Contendrá la lista de mensajes publicados en el servidor por todos los usuarios. Esta página deberá recargarse cada 5 minutos para comprobar si hay nuevos mensajes.
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.