1.2. Configuración de servlets en aplicaciones web

Para instalar un servlet en una aplicación web, se coloca la clase del servlet dentro del directorio WEB-INF/classes de la aplicación (respetando también la estructura de paquetes, creando tantos subdirectorios como sea necesario).  Veremos ahora las formas que tenemos de invocar a ese servlet.

1.2.1. Llamada directa de servlets

Si no hemos configurado el servlet en el fichero descriptor de despliegue de la aplicación, podemos llamarlo con:

http://localhost:8080/<dir>/servlet/<nombre-servlet>

donde <dir> se sustituye por el directorio donde tengamos la aplicación Web, y <nombre-servlet> es el nombre completo del servlet, incluyendo paquetes (separados por '.'). Por ejemplo, si tenemos el servlet paquete1.subpaquete1.MiServlet, dentro de la aplicación miapp, lo llamamos con:

http://localhost:8080/miapp/servlet/paquete1.subpaquete1.MiServlet

Notar que se pone el subdirectorio servlet, aunque la aplicación no contiene dicho subdirectorio. Esto es porque, mediante este subdirectorio "virtual" (inexistente), el servidor Web interpreta que tiene que cargar una clase del directorio classes, y que dicha clase es un servlet.

Si hemos colocado el servlet en el directorio classes de root, lo llamamos con:

http://localhost:8080/servlet/<nombre-servlet>

1.2.2. Mapeado de servlets y páginas JSP en el fichero descriptor

Otra opción para llamar al servlet es incluir en el fichero descriptor de la aplicación donde lo hemos colocado (web.xml en Tomcat) la información necesaria para que lo encuentre. Dicha información consiste en introducir una marca <servlet> para cada servlet que se quiera llamar de esta forma:

<servlet>
	<servlet-name>nombre</servlet-name>
	<servlet-class>ClaseServlet</servlet-class>
</servlet>

Donde <servlet-name> es un nombre identificativo y arbitrario del servlet, y <servlet-class> es la clase del servlet (incluyendo paquetes y subpaquetes, separados por '.'). Con esto, al servlet ClaseServlet lo podemos llamar de dos formas:

http://localhost:8080/<dir>/servlet/ClaseServlet
http://localhost:8080/<dir>/servlet/nombre

siendo <dir> el directorio de la aplicación Web. De forma similar se podría mapear una página JSP, sustituyendo la etiqueta <servlet-class> por la etiqueta <jsp-file>:

<servlet>
	<servlet-name>nombre2</servlet-name>
	<jsp-file>/mipagina.jsp</servlet-class>
</servlet>

con lo que podemos invocar la página de dos formas también:

http://localhost:8080/<dir>/mipagina.jsp
http://localhost:8080/<dir>/nombre2

1.2.3. Asignar URLs a servlets o páginas JSP

El uso de la ruta .../servlet/... para llamar a los servlets puede ser útil durante la depuración, pero luego podemos querer invocar al servlet utilizando una URL alternativa. Esto se consigue mediante las etiquetas <servlet-mapping>:

<servlet-mapping>
	<servlet-name>nombre</servlet-name>
	<url-pattern>/ejemploservlet</url-pattern>
</servlet-mapping>

En la subetiqueta <servlet-name> se pone el nombre del servlet al que se quiere asignar la URL (será uno de los nombres dados en alguna etiqueta <servlet> previa), y en <url-pattern> colocamos la URL que le asignamos al servlet, que debe comenzar con '/'.

Notar que primero se colocan todas las etiquetas <servlet>, y luego las <servlet-mapping> que se requieran. 

Así, con lo anterior, podremos llamar al servlet identificado con nombre de otra forma más:

http://localhost:8080/<dir>/ejemploservlet

También podemos asignar en <url-pattern> expresiones como:

<servlet-mapping>
	<servlet-name>nombre</servlet-name>
	<url-pattern>/ejemploservlet/*</url-pattern>
</servlet-mapping>

o como:

<servlet-mapping>
	<servlet-name>nombre</servlet-name>
	<url-pattern>/ejemploservlet/*.jsp</url-pattern>
</servlet-mapping>

Con el primero, cualquier URL del directorio de nuestra aplicación Web que comience con /ejemploservlet/ se redirigirá y llamará al servlet identificado con nombre. Por ejemplo, las direcciones:

http://localhost:8080/<dir>/ejemploservlet/unapagina.html
http://localhost:8080/<dir>/ejemploservlet/misjsp/maspaginas.jsp

acabarían llamando al servlet nombre.

Con el segundo, cualquier llamada a cualquier página JSP del directorio /ejemploservlet/ de nuestra aplicación se redirigiría al servlet nombre. Podemos hacer que distintas URLs llamen a un mismo servlet, sin más que añadir varios grupos <servlet-mapping>, uno por cada patrón de URL diferente, y todos con el mismo <servlet-name>

Este mismo procedimiento se aplica, sin cambio alguno, si en lugar de un servlet queremos tratar una página JSP.

1.2.4. Asignar parámetros de inicio a un servlet o página JSP

El hecho de asignar un nombre a un servlet o página JSP mediante la etiqueta <servlet> y sus subetiquetas nos permite identificarlo con ese nombre, y también poderle asignar parámetros de inicio. Para asignar parámetros se colocan etiquetas <init-param> dentro de la etiqueta <servlet> del servlet o página JSP al que le queremos asignar parámetros. Dichas etiquetas tienen como subetiquetas un <param-name> (con el nombre del parámetro) y un <param-value> (con el valor del parámetro). Por ejemplo:

<servlet>
	<servlet-name>nombre</servlet-name>
	<servlet-class>ClaseServlet</servlet-class>
	<init-param>
		<param-name>param1</param-name>
		<param-value>valor1</param-value>
	</init-param>
	<init-param>
		<param-name>param2</param-name>
		<param-value>valor2</param-value>
	</init-param>
</servlet>

Para obtener luego los parámetros desde el servlet se utiliza getServletConfig().getInitParameter(nombre) donde nombre es el valor <param-name> del parámetro que se busca, y devuelve el valor (elemento <param-value> asociado), que es de tipo String siempre. Para obtener estos valores desde páginas JSP se emplean otros métodos.

Los parámetros de inicio sólo se aplican cuando accedemos al servlet o página JSP a través del nombre asignado en <servlet-name>, o a través de la URL asociada en un <servlet-mapping>.

1.2.5. Deshabilitar un servlet

En algunas ocasiones nos puede interesar que no se pueda llamar a un servlet a través del alias .../servlet/... Por ejemplo, si se utilizan parámetros de inicio en el servlet, estos sólo se pueden utilizar a través de la URL alternativa, y no a través de /servlet/. Otra razón la veremos en el tema de seguridad.

Para deshabilitar la ruta /servlet/ tenemos dos alternativas:

Lo que tenemos que hacer es crear un servlet que muestre un mensaje de error (lo llamamos, por ejemplo ErrorServlet), y luego mapear las URLs de tipo /servlet/* para que se cargue dicho servlet, de la siguiente forma:

<servlet>
	<servlet-name>error</servlet-name>
	<servlet-class>ErrorServlet</servlet-class>
</servlet>
...
<servlet-mapping>
	<servlet-name>error</servlet-name>
	<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>

Por ejemplo, en Tomcat la forma de deshabilitarlo es igual que la técnica vista en el punto anterior, pero colocando las etiquetas <servlet> y <servlet-mapping> en el fichero web.xml global (colocado en conf/web.xml). Normalmente ya tiene las etiquetas puestas, y sólo hace falta descomentarlas.

1.2.6. Cargar servlets al inicio

A veces nos puede interesar que un servlet se cargue al arrancar el servidor, y no con la primera petición de un cliente. Para hacer eso, incluimos una etiqueta <load-on-startup> dentro de la etiqueta <servlet>. Dicha etiqueta puede estar vacía:

<servlet>
	<servlet-name>nombre</servlet-name>
	<servlet-class>ClaseServlet</servlet-class>
	<load-on-startup/>
</servlet>

o contener un número:

<servlet>
	<servlet-name>nombre</servlet-name>
	<servlet-class>ClaseServlet</servlet-class>
	<load-on-startup>2</load-on-startup>
</servlet>

que indica el orden en que el servidor irá cargando los servlets (de menor a mayor valor).