Está en la página 1de 17

Servlets

Objetivo: Al finalizar el capítulo, el alumno

 Reconoce y desarrolla Servlets.

Temas

1. Definición y ciclo de vida de un Servlet


2. Interfaces: ServletContext y ServletConfig
3. Dispatch y forward
4. Filters y Listeners
5. Alias

Programa Java Web Application Developer


Servlets 86

1. Definición y ciclo de vida de un Servlet

Los servlets son la tecnología de la plataforma Java y proporcionan componentes


independientes de la plataforma para la creación de aplicaciones basadas en Internet, sin las
limitaciones de rendimiento de los programas CGI. Y a diferencia de los mecanismos de
propiedad de extensión de servidor (por ejemplo, la API de Netscape Server o módulos de
Apache), los servlets son de servidor y plataforma. Esto le da la libertad de elegir "lo mejor del
mercado" en estrategias para sus servidores, plataformas y herramientas.

Los servlets tienen acceso a toda la familia de APIs Java, incluida la API JDBC para acceder a
bases de datos empresariales. Los servlets también pueden acceder a una biblioteca de HTTP
y recibir todos los beneficios del lenguaje Java incluyendo la portabilidad, rendimiento,
reutilización y seguridad.

Hoy los servlets son una opción popular para la creación de aplicaciones Web interactivas.
También existen terceros contenedores servlets que están disponibles para Apache Web
Server, IIS de Microsoft, y otros. Contenedores de Servlets son generalmente componentes de
los servidores web y de aplicaciones, tales como BEA WebLogic Application Server,
WebSphere de IBM, Sun Java System Web Server, servidor Sun Java System Application, y
otros.

Fácilmente es posible crear un servlet en NetBeans dando clic derecho sobre el nodo Source
Package de su proyecto, digitando un nombre y el paquete del servlet según su elección, y
opcionalmente puede dar un alias para este servlet.
Servlets 87

El siguiente código muestra un simple servlet:

La línea 11 indica que el alias del servlet es Demo.


Servlets 88

Para ejecutar este Servlet, haga clic derecho en cualquier parte de él y del menú emergente,
seleccione Run File.

Ciclo de vida de un Servlet

En el Ciclo de Vida de un Servlet, se pueden apreciar claramente estos 3 sucesos siguientes:

 Inicializar un Servlet

 Interactuar con Clientes

 Destruir un Servlet
Servlets 89

 Inicializar un Servlet

Cuando un servidor Web carga un servlet, ejecuta el método init del servlet. La
inicialización se completa antes de manejar peticiones de clientes y antes de que el
servlet sea destruido.
Aunque muchos servlets se ejecutan en servidores multi-thread, los servlets no tienen
problemas de concurrencia durante su inicialización. El servidor llama sólo una vez al
método init, cuando carga el servlet, y no lo llamará de nuevo a menos que vuelva a
recargar el servlet. El servidor no puede recargar un servlet sin primero haber destruido
el servlet llamando al método destroy.

 Interactuar con Clientes

Después de la inicialización, el servlet puede manejar peticiones de clientes. Estas


respuestas son manejadas por la misma instancia del servlet por lo que hay que tener
cuidado con acceso a variables compartidas por posibles problemas de sincronización
entre requerimientos concurrentes.

 Destruir un Servlet

Los servlets se ejecutan hasta que el servidor los destruye, por cierre el servidor o bi en
a petición del administrador del sistema. Cuando un servidor destruye un servlet,
ejecuta el método destroy del propio servlet. Este método sólo se ejecuta una vez y
puede ser llamado cuando aún queden respuestas en proceso, por lo que hay que
tener la atención de esperarlas. El servidor no ejecutará de nuevo el servlet, hasta
haberlo cargado e inicializado de nuevo.

Con los Servlets se involucran muchas clases, a continuación se señalan las clases más
importantes de cada paquete.

Para entender mejor la relación entre las clases notar que en líneas punteadas en rojo, se
encuentran las herencias directas de clases o interfaces, y en negro, se encuentran las
relaciones de uso entre clases.
Servlets 90

Laboratorio Nº 4.1

Creación de un Servlet que retorne información para cliente AJAX

Un formulario con la siguiente presentación enviará datos al servlet:

El servlet recoge datos desde un formulario y válida. Luego envía el Ok o error de los datos.

El cliente hace petición AJAX mediante jQuery.


Servlets 91

2. Interfaces: ServletContext y ServletConfig

Un contexto está asociado a un objeto ServletContext, que está contenido en un objeto


ServletConfig. Es utilizado para compartir datos entre todos los servlets y jsps de una
aplicación.

Además, proporciona al programador lo siguiente:

 Un contenedor virtual para almacenar objetos a los que pueden acceder todos los
servlets y jsps de una misma aplicación web. En este sentido, se emplea para pasar
datos de un servlet a otro. Es importante resaltar que hay un contexto por cada
aplicación web.

 Interfaces que permiten comunicarse con el entorno de ejecución de la aplicación web,


es decir, con el contenedor web. Por ejemplo, para obtener el tipo MIME de un fichero,
para escribir en un fichero log del servidor, para obtener un objeto RequestDispatcher
usado para delegar en otros recursos el procesamiento de la petición, para conocer la
ruta asociada al directorio raíz de una aplicación web, etc.
Servlets 92

Mediante el método getServletContext() de la interface ServletConfig o mediante


getServletContext() de GenericServlet, se obtiene un contexto vacío, todavía no contiene
elementos.

Mediante el método setAttribute(String clave, Object valor) de la interface ServletContext,


se asigna una clave y un valor asociado a la misma. La clave debe ser una String y el valor un
Object.

Mediante el método getAttribute(String clave) de la interface ServletContext, se obtiene el


valor asociado a la clave.

Estas operaciones de guardar datos en una memoria temporal, también es posible a través de
un objeto Session, pero estas serían las diferencias:

Objeto Alcance ¿Cuánto tiempo vive?

El tiempo de vida del contexto coincide con el tiempo que la


Context (ServletContext)
aplicación está activa.
El tiempo de vida de una sesión coincide con el tiempo que
un usuario está conectado a la aplicación. Una sesión
Session (HttpSession) puede morir con el método invalidate() o excediendo el
tiempo de vida de la sesión. Pero, la aplicación puede
seguir existiendo.

Se pueden inicializar parámetros en el archivo web.xml del proyecto o con anotaciones en


algún servlet. Si se hace en web.xml, entonces se tendrían las siguientes líneas adicionales en
él:
Servlets 93

Si se hace mediante un servlet (ServletData3), se tendría lo siguiente:

Para recoger estos datos desde otro Servlet, debemos implementar en él, las siguientes líneas:
Servlets 94

Laboratorio Nº 4.2

Uso de interfaces ServletContext y ServletConfig

En web.xml, genere un parámetro de nombre logo que tenga como dato la ruta del logo de su
Empresa o Institución.

El logo quedará disponible para todos los servlets y JSPs del proyecto. Realice las pruebas
con un Servlet que lo coloque en el context de la aplicación y un JSP que lo llame.
Servlets 95

3. Dispatch y forward

Un servlet puede invocar de modo directo a otro documento web y reenviar su objeto request
del servlet a ese otro documento. Para hacer esto, se necesita un objeto de
RequestDispatcher, que es una referencia que encapsula el recurso.

Por ejemplo, se podría tener un JSP con un link hacia el servlet Demo01 al cual se le envía el
dato Cibertec en el objeto msg.

En el servlet Demo01, mediante un objeto dispacher, se envía el objeto request y response a


un JSP llegada.jsp.
Servlets 96

Finalmente, el contenido de llegada.jsp sería el siguiente:

Y la salida de llegada.jsp sería el siguiente:

A pesar que ya estamos en llegada.jsp, el URL del navegador muestra la dirección del servlet
Demo01.

La invocación a llegada.jsp se puede hacer de dos formas.

 Incluir el recurso en el flujo de salida

La salida de "/llegada.jsp" se incluye en la salida de Demo01. Incluye el contenido de


un recurso Web, pero no delega el pedido.

dispatcher.include(request, response);

 Redirigir (forward) la petición al recurso

Delega el manejo de la respuesta a "/llegada.jsp". Es clásico cuando un componente


(Demo01) maneja una serie de operaciones y lógica, mientras que "/llegada.jsp"
maneja la salida o respuesta.

dispatcher.forward(request, response);

Otro método para redireccionar el flujo de salida es sendRedirect(), pero este se diferencia de
forward() (o también include()) por lo siguiente:

 En sendRedirect() la petición acaba bajo el control del segundo documento web. La


URL que se puede ver en el navegador es la del segundo documento web. Además,
sendRedirect() es un método de HttpResponse.

 En forward() o include() la petición se controla por el primer servlet. La URL que se


puede ver en el navegador es la del primer servlet.
Servlets 97

Laboratorio Nº 4.3

Empleo de Dispatch y forward

Genere los siguientes 3 servlet:

 DemoForward
 DemoInclude y
 DemoResponse

También, los siguientes 3 JSP:

 destino_forward
 destino_include y
 destino_response.

Y muestre por separado el efecto de forward, include y sendRedirect.


Servlets 98

4. Filters y Listeners

Los listener escuchan eventos. Los eventos siempre se lanzan, lo que pasa es que no siempre
se recogen. Quien se encarga de escuchar los eventos son los escuchadores ( listener).

Las principales listener que tenemos son los siguientes:

 De aplicación

- ServletContextListener,
Escucha desde que se arranca la aplicación hasta que esta termina.

- ServletControlAttributeListener
Escucha cuando se añade atributos al context; se elimina, o se le reemplaza.

 De sesión

- HttpSessionListener,
Escucha desde que empieza la sesión de un usuario, hasta que se termina.
Es decir, escucha todo lo que el usuario hace en el transcurso de su sesión.

- HttpSessionActivateListener
Escucha cuando se activa o desactiva la sesión.

- HttpSessionAttributeListener
Escucha cuando se añade atributos a la sesión, se elimina, o reemplaza.
Servlets 99

 Servlet

- HttpServletRequestListener
Escucha en cada petición que se hace a la aplicación; por ejemplo, cuando se
pide una dirección web, se crea un objeto de tipo HttpServletRequest y
cuando se devuelve una respuesta, se elimina.

A continuación, se muestran fragmentos de código de un filtro que intercepta todas las


peticiones que llegan a los documentos en la carpeta admin de la aplicación.

El filtro se llama FilterLogin y mediante anotaciones, se define que su ámbito es /admin/*

Básicamente, el filtro verifica que en la sesión del cliente exista un atributo usuario definido, si
no es así, retorna al index.jsp de la aplicación; en caso contrario, si está definido el atributo
usuario, entonces lo deja pasar al documento que corresponde de la carpeta admin.

El documento que corresponde de la carpeta admin está definido en este fragmento de servlet.
Servlets 100

Laboratorio 4.4

Uso de Filters y Listeners

Con el uso de filtros, impida la ejecución de documentos en la carpeta admin y a clientes no


autorizados mediante logueo. Solo tendrá acceso a ellos el usuario admin de password 123.
Servlets 101

5. Alias

Los alias en los servlets son los segundos nombres de cómo estos pueden ser llamados por el
resto de documentos de la aplicación. Por ejemplo, el siguiente fragmento de código define a
un servlet que se llama ServletPepe:

Pero el atributo urlPatterns de notación a definido que su alias será /util/correo.aspx es decir,
se asume que desde la raíz del proyecto ingresará a la carpeta útil y desde ella lo llamará
como correo.aspx, a pesar de que la carpeta no existe y dicho alias no corresponde a un
nombre de documento existente en el proyecto.

Si ejecutamos ServletPepe el navegador mostrará lo siguiente: