Capitulo 4 - Servlet
Capitulo 4 - Servlet
Temas
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
Para ejecutar este Servlet, haga clic derecho en cualquier parte de él y del menú emergente,
seleccione Run File.
Inicializar un Servlet
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.
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
El servlet recoge datos desde un formulario y válida. Luego envía el Ok o error de los datos.
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.
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:
Para recoger estos datos desde otro Servlet, debemos implementar en él, las siguientes líneas:
Servlets 94
Laboratorio Nº 4.2
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.
A pesar que ya estamos en llegada.jsp, el URL del navegador muestra la dirección del servlet
Demo01.
dispatcher.include(request, response);
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:
Laboratorio Nº 4.3
DemoForward
DemoInclude y
DemoResponse
destino_forward
destino_include y
destino_response.
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).
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.
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
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.