Espacio (Anterior) Servlets Espacio Acceso a Bases de Datos (Siguiente) Espacio

Función y Estructura.

Hasta este punto se han mencionado los detalles más finos de Servlets y JSP's, pero aún falta mencionar la manera en que ambos pasan de ser un programa independiente a interactuar unos con otros. Para facilitar la distribución e interacción entre JSP's/Servlets estos son agrupados en una estructura denominada WAR ("Web-Archive") descrita a continuación :

  • / *.html *.jsp *.css : Este directorio base contiene los elementos típicamente empleados para un sitio web: Documentos HTML, CSS ("Cascading Style Sheets"), JavaScript y Graficas; además en este directorio residen los JSP's a utilizarse en el WAR, aquí no residen los Servlets estos deben ser colocados en otra parte del WAR ya que son Clases Java puras.

  • /WEB-INF/web.xml : Este archivo contiene elementos de configuración del WAR como : Página de Inicio, Ubicación ("Mapeo") de Servlets, parámetros para componentes adicionales tales como "Struts" y otros elementos como manejo de errores.

  • /WEB-INF/classes/ : Este directorio contiene las clases Java utilizadas dentro del WAR, es dentro de este directorio que generalmente residen los Servlets diseñados para el WAR.

  • /WEB-INF/lib/ : Este directorio contiene los archivos JAR que serán utilizados por la aplicación, estos generalmente corresponden a las clases (JAR's) utilizadas para conectarse a Bases de Datos o aquellas utilizadas por librerías de JSP's.

Este tipo de estructura logra una interoperabilidad para las diversas aplicaciones Java, ya que los diversos "Servlet Engines"/"Application Servers" emplean esta misma estructura para ejecutar componentes.

web.xml.

web.xml es un archivo escrito en XML que describe diversas características del archivo WAR, a continuación se describen sus elementos básicos.


<web-app>

<servlet>
    <servlet-name>hola</servlet-name>
    <servlet-class>com.osmosislatina.Saludos</servlet-class>
</servlet>
 
<servlet-mapping>
    <servlet-name>hola</servlet-name>
    <url-pattern>/visitas</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>hola</servlet-name>
    <url-pattern>/despedida</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>hola</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>


<welcome-file-list>
   <welcome-file>index.jsp</welcome-file>
   <welcome-file>index.html</welcome-file>
   <welcome-file>bienvenida.jsp</welcome-file>
</welcome-file-list>

</web-app>

El primer elemento <web-app> indica el inicio de la aplicación, es dentro de este elemento que se definen todos los elementos restantes.

El elemento <servlet> define las características de un Servlet y a su vez esta compuesto por los elementos <servlet-name> y <servlet-class> que indican un nombre corto para el Servlet así como el nombre de la Clase Java que contiene el Servlet respectivamente. En este caso se indica que la Clase llamada com.osmosislatina.Saludos (encontrada dentro de /WEB-INF/classes) será denominada con el nombre hola.

Posteriormente se define el elemento <servlet-mapping> el cual define la ubicación en términos de directorios de un sitio (URL), esto es, el elemento <servlet-name>hola</servlet-name> esta indicando que el Servlet llamado hola será accesado cada vez que se accese el directorio base /visitas .

Nótese que existen otras dos declaraciones con el Servlet hola, lo anterior permite que un mismo Servlet sea accesado de diversos directorios en un sitio, en este caso se esta indicando que toda solicitud destinada para los URL's /visitas, /despedida y todas aquellas terminadas en *.do sean procesados por el Servlet en cuestión (hola) .

Finalmente el elemento <welcome-file-list> indica que cuando se solicite cualquier directorio sin indicar un archivo en especifico se envíe el archivo llamado: index.jsp, index.html o index.htm, donde el primero tiene preferencia en caso de existir más de un archivo en la lista.

Lo anterior son solo los parámetros básicos utilizados en web.xml, a continuación se describen otros elementos que pueden ser empleados en web.xml .

init-param en Servlets.

<servlet>
    <servlet-name>hola</servlet-name>
    <servlet-class>com.osmosislatina.Controller</servlet-class>
    <init-param>
      <param-name>debug</param-name>
      <param-value>0</param-value>
    </init-param>
    <init-param>
      <param-name>listings</param-name>
      <param-value>true</param-value>
    </init-param>
</servlet>
 

A través de los elementos <init-param> de la declaración se están indicando parámetros de inicialización para el Servlet en cuestión, donde <param-name> es el nombre del parámetro y <param-value> su valor; lo anterior puede resultar útil para aquellos Servlets (Clases) que no distribuyen su código fuente, a través de parámetros definidos en web.xml se puede inicializar un Servlet (Clase) ya compilado.

session-config.

  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>
 

La definición anterior indica la duración en minutos de la sesión del usuario cuando navegue en esta aplicación (WAR-"Web-Archive"), esto permite expirar automáticamente los datos de dicha sesión, facilitando realizar diseños con datos críticos o aplicaciones con alto nivel de seguridad.

resource-ref.
 <resource-ref>
      <description>Conexion hacia Base de Datos SQL</description>
      <res-ref-name>jdbc/ConexionMySQL</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
 </resource-ref>

El parametro <resource-ref> es empleado para definir un recurso a utilizarse dentro de la aplicación (WAR-"Web-Archive"), en el caso de la declaración anterior se trata de una conexión hacia una Base de Datos que anida los siguientes elementos : <description> que indica una descripción amplia del recurso, <res-ref-name> para especificar el nombre JNDI ("Java Naming Directory Interface") con que será llamado el recurso dentro de un JSP/Servlet, <res-type> utilizado para definir el tipo de recurso (en este caso javax.sql.DataSource que representa una fuente para Base de Datos) y finalmente <res-auth> para indicar que la autorización del recurso será llevado mediante el "Servlet Engine" (Container). NOTA: El uso de estos elemento será descrito a detalle en la siguiente sección que describe el uso de conexiones hacia Bases de Datos desde ambientes Java.

error-page.
  <error-page>
   <error-code>404</error-code>
   <location>/noencontrado.htm</location>
  </error-page>

  <error-page>
   <error-code>500</error-code>
   <location>/error.htm</location>
  </error-page>

  <error-page>
   <exception-type>java.sql.SQLException</exception-type>
   <location>/base_nodisponible.htm</location>
  </error-page>

Las definiciones anteriores permiten un manejo gráfico para cualquier error que pueda surgir dentro de la aplicación (WAR-"Web-Archive").

Las primeras dos declaraciones indican una página de redirección mediante el elemento <location>, esta redirección sería llevada acabo cada vez que el "Servlet Engine"/"Application Server" encontraría un error HTTP 404 (Página no Encontrada) y/o HTTP 500 (Error Interno).

La tercer declaración indica una redirección en base a un error por Clase, en este caso se esta indicando que en caso de surgir un error de tipo java.sql.SQLException se redireccione al usuario a la página base_nodisponible.htm.

Las definiciones anteriores permiten que el usuario final nunca observe un Stack de errores y le sea presentada una página más amigable, con instrucciones o indicaciones acerca del error.

taglib.
  <taglib>
    <taglib-uri>/WEB-INF/tags-cursojsp.tld</taglib-uri>
    <taglib-location>/WEB-INF/tags-cursojsp.tld</taglib-location>
  </taglib>

Esta última declaración es empleada en la definición de Tags JSP hechos a medida, los cuales serán descritos en la sección final de este curso.

mime-mapping.
  <mime-mapping>
    <extension>wav</extension>
    <mime-type>audio/x-wav</mime-type>
  </mime-mapping>

Esta declaración es empleada para definir como deben ser manejados los diversos archivos en base a su extensión; la definición anterior indica que todo archivo con una extensión wav es del tipo audio/x-wav; por lo general estas definiciones son declaradas a nivel global en el "Servlet Engine"/"Application Server" tomando efecto sobre todos los WAR's del Servidor, sin embargo, cualquier declaración a nivel de WAR sobrepasa cualquiera definida a nivel global.

filter y filter-mapping .
    <filter>
      <filter-name>Auditoria</filter-name>
      <filter-class>com.osmosislatina.Auditoria</filter-class>
    </filter>

    <filter-mapping>
       <filter-name>Auditoria</filter-name>
       <url-pattern>/finanzas/*</url-pattern>
    </filter-mapping>

El elemento <filter> define las características de un Filtro y a su vez esta compuesto por los elementos <filter-name> y <filter-class> que indican un nombre corto para el filtro así como el nombre de la Clase Java que contiene el filtro respectivamente.

Posteriormente se define el elemento <filter-mapping> el cual define la ubicación en términos de directorios de un sitio (URL), esto es, el elemento <filter-name>Auditoria</filter-name> esta indicando que el filtro llamado Auditoria sea invocado en toda requisición del directorio /finanzas.NOTA: El uso de estos elemento será descrito a detalle en la sección que describe el uso de filtros.

listener y listener-class .
    <listener>
      <listener-class>com.osmosislatina.UsuariosActivos</listener-class>
    </listener>

El elemento <listener> define las características de un evento ("Listener") que ocurre en el "Servlet Engine", dicho elemento anida en su estructura <filter-class> que indica el nombre de la Clase Java que contiene la lógica a realizarse una vez ocurrido el evento.NOTA: El uso de este elemento será descrito a detalle en la sección que describe el uso de eventos ("Listeners").

Ordenamiento de elementos en web.xml.

En los incisos anteriores se describieron la gran mayoria de los elementos que pueden ser empleados en el archivo web.xml, sin embargo, las declaraciones de estos elementos deben cumplir con cierto ordenamiento para que sean procesadas correctamente por el "Servlet Engine".

El ordenamiento de dichos elementos se encuentra regido por un DTD ("Data Type Definitio") que es precisamente una estructura empleada para definir el ordenamiento de elementos XML, la definición de este DTD se describe a continuación :

Librerías Java.

Las clases/librerías en un desarrollo Java juegan un papel muy importante, en esta sección se describe su uso en ambientes JSP/Servlets.

Cuando se compila y/o ejecuta cualquier programa en Java, se hace uso de todas las clases/librerías definidas en la variable ambiental CLASSPATH, sin embargo, la modificación constante de esta variable para un ambiente de JSP's/Servlets es sumamente deficiente, por la simple razón que todo Servlet es un Clase.

Lo anterior forzaría un cambio constante al ser agregado un Servlet a un ambiente Java, y es por esta razón que se definen otros lugares donde pueden ser ubicadas las clases/librerías en un ambiente JSP's/Servlets automáticamente.

Directorios en WAR'S

En la estructura de un WAR es posible colocar las librerías/clases Java en dos puntos en los cuales serán reconocidas automáticamente por el "Servlet Engine"/"Application Server", sin la necesidad de modificar la variable CLASSPATH.

  • /WEB-INF/lib/ : Aquí pueden ser colocados los diversos archivos JAR que serán utilizados por los Servlets y JSP's del WAR ("Web-Archive").

  • /WEB-INF/classes/ : Bajo este directorio se coloca la estructura de las diversas clases empleadas para Servlets y/o cualquiera otra clase utilizada en el "Web-Archive". Esta estructura debe ser diseñada de acuerdo a directorios como se ilustra a continuación.

    Suponiendo que la clase llamada com.osmosislatina.Saludos es empleada para generar un Servlet y es declarada apropriadamente en el archivo web.xml, para que esta clase sea detectada/encontrada por el "Servlet Engine"/"Application Server" es necesario colocarla bajo la siguiente estructura:

    /WEB-INF/classes/com/osmosislatina/Saludos.class
    

    Donde Saludos.class es la clase correspondiente, nótese que debieron generarse los directorios com y osmosislatina y finalmente la clase(Servlet) fue colocada en este directorio; si coloca la clase directamente bajo el directorio classes no será detectada la clase, otra alternativa sería colocar todas la clases en un archivo JAR y colocarlas bajo WEB-INF/lib esto evita la necesidad de generar la estructura de directorios antes mencionada.

Creación de WAR's.

Para generar un "Web-Archive" pueden utilizarse diversas herramientas:

Finalmente cabe mencionarse que la creación de WAR's no es obligatoria sino solo una manera de transferir y modularizar aplicaciones, si coloca la estructura de un WAR bajo el directorio webapps en Tomcat esto funcionaría de la misma manera que si hubiera sido descomprimido/expandido el archivo WAR.

Terminos Legales de Contenido ©2000-2011 Osmosis Latina

Diseñado bajo estándares : XHTML   CSS  

webmaster@osmosislatina.com