Ejercicios de Comunicación

1. Compilación y despliegue de una aplicación web con ant.

Vamos a trabajar con la herramienta ant, que nos facilitará la compilación y el despligue de nuestra aplicación web. Es una herramienta basada en Java, similar a la herramienta make, pero sin muchas de sus limitaciones. Make tiene el inconveniente de ser dependiente del shell que utilicemos, ya que ejecuta comandos de éste, lo cual complicaría la portabilidad de nuestras aplicaciones a distintas plataformas.

Ant utiliza ficheros de configuración basados en XML, donde definiremos las tareas a realizar. Para realizar estas tareas se utilizarán clases Java, en lugar de comandos del shell, lo cual lo hará independiente de la plataforma. Podremos realizar un gran número de diferentes tareas con esta herramienta, pero nos centraremos en la compilación y despliegue de nuestras aplicaciones web.

El fichero de configuración, llamado build.xml, es bastante más complejo que un Makefile, pero podremos reutilizar una plantilla genérica para todas nuestras aplicaciones. Para comenzar veremos como debemos estructurar nuestra aplicación web. Es recomendable no desarrollar la aplicación directamente en el directorio webapps de Tomcat, sino tener un directorio de desarrollo a parte. En este directorio de desarrollo tendremos los siguientes elementos:

build.xml
Fichero de configuración de Ant
build.properties
Nos permite añadir propiedades a la configuración de Ant
src
Directorio con los fuentes de nuestras clases Java (servlets, filtros y clases auxiliares)
web
Directorio con el resto de contenido de la web: recursos estáticos, JSPs, directorio WEB-INF (web.xml y lib).

Para la compilación y despliegue de aplicaciones web con Tomcat 4.0.X podemos utilizar este fichero build.xml. En él sólo deberemos cambiar dos parámetros de configuración: nombre de nuestra aplicación web (propiedad app.name) y directorio donde tenemos instalado Tomcat (propiedad catalina.home).

Podemos modificar el valor de estas propiedades en el fichero build.xml, o bien crear un fichero build.properties por separado donde daremos valor a estas propiedades que pueden variar. Este fichero build.properties tendrá la siguiente forma:

catalina.home=/home/malo/jakarta-tomcat-4.0.5

Para otras versiones de Tomcat será necesario cambiar en build.xml los directorios donde se encuentran las librerias. Normalmente en la documentación de cada versión de Tomcat se puede encontrar una plantilla del fichero apropiado para compilar y desplegar en esa versión.

Para más información acerca de las posibilidades de la herramienta ant, puedes consultar la documentación de ant disponible online en la página del proyecto (http://jakarta.apache.org/ant) o en el mismo paquete de la distribución de ant.

Vamos a probar la aplicación contexto incluida en los ejercicios de la sesión. Descomprimir el fichero de ejercicios en nuestro directorio HOME, y entrar dentro del directorio de la aplicación contexto.

a) Comprueba en el fichero build.properties que la ruta donde tenemos instalado Tomcat coincida con la especificada en este fichero. Puedes echar un vistazo a la estructura de directorios que se ha utilizado en la aplicación, como ejemplo de como organizar un directorio de desarrollo de una aplicación web para utilizar ant.  

b) Vamos a compilar la aplicación web. Para ello deberemos introducir desde el directorio donde se encuentra el fichero build.xml (directorio contexto en este caso) el siguiente comando:

ant

Una vez hecho esto veremos que se ha generado un directorio build, cuyo contenido es la aplicación web contruida, con la estructura que debe tener una aplicación en el directorio webapps de Tomcat.

c) Ahora solo nos queda desplegar la aplicación. Para ello lo único que tenemos que hacer es introducir el siguiente comando:

ant deploy

Lo que hará será copiar la aplicación web contruida (directorio build) al directorio webapps del Tomcat. 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.

d) 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?

e) 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).

f) 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.

2. Vamos a realizar una aplicación de chat utilizando servlets. En el directorio chat de los fuentes de la sesión podrás encontrar la base sobre la que construiremos el chat. Cada mensaje de chat estará encapsulado en la clase Mensaje, y la lista de mensajes actual del chat se encontrará en la clase ColaMensajes. Todas las clases de nuestra aplicación se encuentran en el paquete chat.

Además se proporcionan los ficheros HTML estáticos necesarios para la aplicación. El fichero index.html contiene el formulario de login para que un usuario introduzca el nick con el que entrará en el chat (no se solicita ningún password para validar). El login se hará efectivo por el servlet LoginUsuario también proporcionado, que introducirá el nick del usuario en la información de sesión y nos redirigirá al chat. En el subdirectorio chat tendremos los ficheros estáticos de la aplicación de chat:

frames.html
Página principal de los frames de la aplicación chat. Mostrará un frame con el formulario para enviar mensajes, y otro con la lista de mensajes enviados.
envia.html
Formulario para enviar mensajes al chat.
pie.html
Cabecera de la tabla de mensajes, a incluir al comienzo de la página de lista de mensajes.
cabecera.html
Pie de la tabla de mensajes, a incluir al final de la página de lista de mensajes.

Ahora deberemos implementar los servlets para el envio de mensajes, y para la consulta de la lista de mensajes enviados. Se pide:

a) 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.

b) Una vez tenemos creada la cola de mensajes, deberemos implementar el servlet EnviaMensaje, que tome un mensaje como parámetro (el nombre del parámetro es texto), y lo añada a la lista de mensajes con el nick del usuario actual (obtenido del atributo nick de la sesión). Una vez enviado el mensaje, mostraremos en la salida el contenido de envia.html, mediante un objeto RequestDispatcher.

c) Por último, deberemos implementar el servlet ServletChat que mostrará todos los mensajes del chat, anteponiendoles el link de quien lo envió. Este servlet debe:

d) Comprobar que el chat funciona correctamente. Conectar desde varios clientes a un mismo servidor.

3. Vamos a utilizar una aplicación independiente en el cliente como front-end para la aplicación de chat. Esta aplicación cliente ya está desarrollada en la clase AplicChat dentro del directorio applet. Se pide:

a) La aplicación invoca cada 5 segundos al servlet ListaMensajes. Espera recibir como respuesta un objeto ColaMensajes, del cual mostrará todos los mensajes en el área de texto de la aplicación. Implementar el servlet ListaMensajes que devuelva el objeto ColaMensajes al cliente.

b) ¿Por qué en este caso no podemos utilizar información de sesión? ¿Es realmente necesaria en este caso? La aplicación front-end en cada solicitud a EnviaMensaje, además del mensaje envia como parámetro el nick que hemos introducido en la aplicación (en el parámetro de nombre nick). Modificar EnviaMensaje para que en caso de recibir como parámetro el nick, utilice dicho nick para insertar el mensaje.