Aplicaciones web java y directorio WEB-INF

aplicaciones-web-javaTradicionalmente, cuando hablamos de aplicación web en entorno java, podemos decir que es una colección de servlets, páginas dinámicas con JSP o estáticas con HTML, XHTML, clases Java, archivos de descripción de la aplicación, imágenes, etc. o más modernamente utilizando framworks y otros recursos que pueden ser empaquetados y ejecutados en distintos servidores de diferentes proveedores (ISP's) o bien en nuestros servidores propios. Es decir, una aplicación web se podría definir como la capa web de cualquier aplicación.

Una de las características principales de una aplicación web java es que tiene necesitan un contenedor de servlets (también llamado a veces servidores web) como serían Tomcat, Jetty, JBoss, Resin y su relación con el ServletContext. Esta relación está controlada por el contenedor de servlets, que asocia un único ServletContext para cada aplicación, garantizando que las aplicaciones no van a colisionar a la hora de almacenar objetos en el ServletContext.

El contenedor que alberga una aplicación web no es más que la estructura de directorios donde están colocados todos los archivos necesarios para la ejecución de la aplicación web. Por tanto, en el desarrollo de cualquier aplicación web java tenemos que tener creada la estructura de directorios donde colocaremos los componentes. A continuación se indican los directorios necesarios para una aplicación llamada "ejemploWeb", que debe colgar del directorio raíz del contenedor de servlets, que puede diferir de unos servidores web a otros. En el caso de Tomcat, el directorio a partir del cual se instala cualquier aplicación web debe ser /webapps, dentro del directorio de instalación de Tomcat.
Los directorios de la aplicación "ejemploWeb" serán los siguientes (a partir de la especificación de Servlet 2.2, deben estructurarse según la siguiente jerarquía de subdirectorios:):

/ejemploWeb
Directorio raíz de la aplicación web, en el cual se colocan todos los archivos (JSP, HTML, imágenes, hojas de estilo, etc.) que utiliza la aplicación. Se pueden crear subdirectorios adicionales para mantener cualquier otro recurso de tipo estático que forme parte de la aplicación web y constituyan la parte de acceso público desde cualquier navegador.

/ejemploWeb/WEB-INF
Directorio que contiene todos los recursos relacionados con la aplicación web que no se han colocado en el directorio raíz y que no deben servirse al cliente. Esto es importante, ya que este directorio no forma parte del documento público, por lo que ninguno de los ficheros que contenga va a poder ser enviado directamente a través del servidor web.
En este directorio se coloca el archivo web.xml, donde se establece la configuración de la aplicación web.

/ejemploWeb/WEB-INF/classes
Directorio que contiene todos los servlets y cualquier otra clase de utilidad o complementaria que se necesite para la ejecución de la aplicación web. Normalmente contiene solamente archivos .class.

/ejemploWeb/WEB-INF/lib
Directorio que contiene los archivos Java de los que depende la aplicación web. Por ejemplo, si la aplicación web necesita acceso a base de datos a través de JDBC, en este directorio es donde deben colocarse los ficheros JAR que contengan el driver JDBC que proporcione el acceso a la base de datos. Normalmente contiene solamente archivos .jar.

/ejemploWeb/WEB-INF/tlds
Directorio que contiene los archivos TLD, descriptor de la librería de etiquetas, en el caso de que la aplicación web utilice cualquier librería de etiquetas, o acciones personalizadas, en este caso contiene el archivo ejemploWeb.tld.
En esta estructura, el cargador de clases consulta en primer lugar el directorio /ejemploWeb/WEB-INF/classes y posteriormente el directorio /ejemploWeb/WEB-INF/lib, de forma que en el desarrollo se pueden colocar clases de usuario en el directorio classes y las clases ya probadas o clases de terceros en el directorio lib; de este modo el cargador de clases resolverá en primer lugar las clases con las que se encuentran en desarrollo, y si no es capaz de encontrarlas en el directorio classes las buscará en los archivos del directorio lib.

Una segunda parte muy importante de toda aplicación web es su descriptor de configuración. Este descriptor no es más que un archivo XML de nombre web.xml, localizado en el directorio WEB-INF, que contiene la descripción de la configuración correspondiente a la aplicación web. En el caso anterior el archivo web.xml estará situado en el directorio /ejemploWeb/WEB-INF. La información que contiene este descriptor puede incluir los siguientes elementos:

  • Parámetros de inicialización del ServletContext
  • Configuración de la sesión
  • Definiciones de Servlets/JSP
  • Mapeado de Servlets/JSP
  • Mapeado de tipos MIME
  • Configuración de seguridad
  • Páginas de error
  • Páginas de bienvenida

Finalmente, la tercera parte importante de una aplicación web es el archivo WAR (Web ARchive), que es el método estándar empleado para empaquetar una aplicación web y dejarla lista para su distribución y acceso a través de servidores web con soporte para servlets y páginas JSP. Utilizando el archivo WAR se puede distribuir una aplicación web completa, compuesta por cualquier número de recursos, en una única unidad de distribución, en un único archivo.

El archivo WAR se genera con la herramienta jar, desde el directorio inmediatamente anterior al directorio que contiene la aplicación web. En realidad, un archivo WAR es un archivo comprimido que utiliza tecnología zip que permite agrupar múltiples ficheros y directorios en un único fichero, manteniendo su estructura original y comprimiendo su contenido; por lo que cualquier herramienta que permita comprimir en este formado puede ser utilizada, renombrando el archivo de salida de dicha herramienta a un archivo con extensión WAR.

El archivo WAR es el que se proporciona al proveedor de Internet, que debe colocarlo en el directorio adecuado del servidor web que utilice, dejando la aplicación accesible al público a través de cualquier navegador.

Durante el desarrollo de un aplicación web, si se están construyendo constantemente archivos WAR, se debe considerar la utilización de alguna herramienta que automatice este proceso, por ejemplo ANT, MAVEN, GRADLE.

El archivo WAR siempre incluye dos directorios especiales: META-INF y WEB-INF. Si el lector es recién llegado al mundo de las páginas JSP seguramente se sorprenderá ante la presencia del primer directorio; en él se almacena el archivo manifest e información útil para las herramientas Java y no es de especial interés para el desarrollador, el contenido del segundo espero que haya quedado más claro.