¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Jakarta EE
  3. Los servlets
Extrait - Jakarta EE Desarrolle aplicaciones web en Java
Extractos del libro
Jakarta EE Desarrolle aplicaciones web en Java
1 opinión
Volver a la página de compra del libro

Los servlets

Introducción

Una aplicación web en el entorno Java es una colección de servlets, páginas HTML, clases y todos los demás recursos útiles para la correcta ejecución de la aplicación (archivos CSS, archivos JavaScript, archivos de imagen, etc.).

Un servlet es un componente web de la tecnología Java. Se trata de una clase Java que permite generar contenido dinámico. El encargado de su administración es un contenedor, generalmente llamado contenedor web, contenedor de servlets o motor de servlets. 

Este contenedor es una extensión de un servidor web y ofrece las funcionalidades esenciales para el funcionamiento de los servlets (decodificar las peticiones, generar respuestas, gestionar el ciclo de vida del servlet, etc.).

La especificación Java Servlet Specification se encuentra actualmente en la versión 5.0. Puede consultarla en la siguiente dirección: https://jakarta.ee/specifications/servlet/5.0/jakarta-servlet-spec-5.0.pdf

Por supuesto, el servlet es el elemento central de esta especificación. Sin embargo, no hay que olvidar otros componentes importantes de ella, como los siguientes:

  • filtros,

  • eventos,

  • cookies,

  • sesiones.

El capítulo aborda todos estos puntos.

La estructura de una aplicación web

1. Presentación

Una aplicación web, independientemente de la tecnología de servidor utilizada, puede entregar respuestas a peticiones HTTP. Hay un conjunto de lenguajes común para todos los entornos:

  • HTML (HyperText Markup Language): lenguaje esencial en el desarrollo web. Permite presentar el resultado al usuario.

  • CSS (Cascading Style Sheet): lenguaje utilizado para mejorar la presentación HTML, definiendo reglas de representación (color, fuente y tipo de letra, disposición de los elementos en la página, etc.).

  • JavaScript: lenguaje que permite mejorar la experiencia del usuario, proporcionando un procesamiento más o menos complejo en el lado del cliente. Hoy en día, también se puede usar en el lado del servidor, sustituyendo a Java.

  • SQL (Structured Query Language): lenguaje que permite acceder a los datos, siempre que la base de datos subyacente sea una base de datos relacional.

Se pueden utilizar otros lenguajes/tecnologías, como XML, etc.

Para hacer que la generación de respuestas sea dinámica, es necesario utilizar una tecnología que lo permita. Entre las más conocidas se encuentran:

  • PHP,

  • C# y el entorno de Microsoft VB.NET,

    ...

El proyecto

El resto del capítulo se basa en un proyecto de ejemplo llamado Proyecto_Servlet.

 Para empezar, hay que crear un proyecto de tipo Gradle Project, con las mismas características que en el capítulo anterior.

 Complete el árbol de directorios para que tenga el siguiente aspecto:

images/02EP04N.png

 Agregue un archivo llamado web.xml al directorio src/main/webapp/WEB-INF, con el contenido descrito en la sección anterior.

 Modifique el archivo build.gradle con el siguiente contenido (consulte la sección dependencies para hacer referencia a la API de los servlet):

plugins {  
    id 'java'  
    id 'war'  
}  
 
repositories {  
    jcenter()  
}  
  
dependencies {  
    compileOnly "jakarta.servlet:jakarta.servlet-api:5.0.0"  
} 

 Seleccione el menú contextual Gradle - Refresh Gradle Project para que su proyecto descargue las dependencias.

El proyecto está listo para manejar servlets.

Servlets

Todo está listo para empezar a desarrollar servlets.

1. ¿Qué es un servlet?

Un servlet es simplemente una clase Java que permite ampliar las capacidades de un servidor que aloja aplicaciones, accesibles a través de un modelo de programación basado en petición/respuesta. Por lo tanto, los servlets pueden responder a cualquier tipo de petición, si bien el caso más común es el procesamiento de peticiones HTTP.

Como parte de una aplicación web, un servlet es una clase Java accesible a través de una o más URL HTTP.

Los paquetes jakarta.servlet y jakarta.servlet.http proporcionan las interfaces y clases necesarias para escribir servlets. Un servlet debe implementar la interfaz Servlet, que define los métodos del ciclo de vida de un servlet. La clase abstracta GenericServlet implementa esta interfaz.

La clase HttpServlet hereda de esta clase y añade los métodos para poder tratar las peticiones HTTP, como los métodos doGet(...) y doPost(...) para procesar peticiones de tipo GET y POST.

La creación de un servlet consiste en crear una clase Java que hereda de la clase HttpServlet y sustituir los métodos necesarios para lograr el comportamiento esperado.

A continuación, se muestra un diagrama de clases que resume esta arquitectura:

images/cap2_pag10.png

La clase fr.ediciones_eni.jakartaee.servlets.MiServlet es un servlet que permite procesar una petición HTTP y devolver una respuesta HTTP.

2. Ciclo de vida de un servlet

El desarrollador no tiene que crear instancias del servlet. El contenedor en el que se despliega el servlet controla el ciclo de vida de este. Cuando una petición HTTP requiere que se ejecute un servlet, el contenedor realiza los siguientes procesos:

  • Si no existe ninguna instancia del servlet, el contenedor:

    • Carga la clase de servlet.

    • Crea una instancia del servlet.

    • Llama al método init() para inicializar eventuales parámetros.

  • A continuación, el contenedor llama sistemáticamente al método service(...), que recibe como argumentos dos objetos que representan, por un lado, la petición HTTP (HttpServletRequest) y, por otro, la respuesta HTTP (HttpServletResponse). El objetivo principal de este método es definir el tipo de petición HTTP y llamar al método doXXX(...) adecuado:

    • doGet(...) para consultas GET,

    • doPost(...) para consultas POST,

    • doPut(...)...

Seguir la actividad del usuario

1. Presentación

HTTP es un protocolo sin estado. Es decir, cuando se procesa una petición, el cliente y el servidor se olvidan mutuamente. Es importante poder mantener un diálogo entre las dos partes. Cuando navega por un sitio web de comercio electrónico, es normal que su carrito no se vacíe cada vez que cambia de página. Cuando se conecta a su banco en línea, es normal que el servidor se acuerde de usted a lo largo de la actividad que realiza en el sitio web. Por lo tanto, es necesario almacenar información contextual. Esta información se puede almacenar en la máquina cliente utilizando cookies o a nivel de servidor utilizando las sesiones.

En las secciones siguientes, se analizan estos dos modos de almacenamiento.

2. Cookies

a. Presentación

Una cookie es simplemente una pareja clave/valor. La clave y el valor se representan como una cadena de caracteres. El tamaño de una cookie no puede superar los 4 096 bytes. Las cookies se pueden ver como pequeños archivos que contienen información. Es el servidor quien las crea y se envían al navegador, que las almacena.

Cuando el cliente realiza una nueva petición a la aplicación que proporcionó las cookies, estas se envían de vuelta al servidor. Pueden permitir que el servidor recuerde el diálogo en curso. A su vez, el servidor devolverá las cookies si han sido modificadas.

A continuación, se muestra un diagrama que resume este principio:

images/cap2_pag58.png

Existen diferentes tipos de cookies. La especificación solo permite manipular cookies de tipo HttpOnly. Estas cookies tienen la particularidad de que no se pueden explotar por un script escrito en JavaScript, por ejemplo, en el lado del cliente. Esto evita ataques de tipo cross-site scripting (XSS).

El navegador puede rechazar las cookies si el usuario las ha configurado de esta manera. Esto puede ser un problema para el uso adecuado de la aplicación.

Se transmiten entre las dos partes en forma de una cabecera de petición (del cliente al servidor) y una cabecera de respuesta (del servidor al cliente). La cabecera de la petición se denomina Cookie. Esta cabecera está presente solo una vez y, si hay varias cookies, se separan por medio de un punto y coma.

La cabecera de respuesta se denomina Set-Cookie. Esta cabecera puede estar presente varias veces...

Filtros

1. Presentación

Un filtro es un componente de software que se ejecuta cuando una petición HTTP llega al servidor, antes de que se realice su procesamiento. Por lo tanto, un filtro permite realizar tratamientos preliminares. Estos tratamientos pueden ser diversos y variados, tales como:

  • Comprobar que el cliente tiene permiso para acceder al recurso solicitado.

  • Registrar información relacionada con la petición para realizar estadísticas futuras.

  • Cambiar las cabeceras de petición o respuesta.

A continuación, se muestra un diagrama resumido de este mecanismo:

images/cap2_pag72.png

Puede haber uno o más filtros. Algunos filtros pueden impedir el acceso al recurso (bajo condiciones) devolviendo una respuesta al cliente o redirigiendo a otro recurso. No todos los recursos están necesariamente detrás de un filtro desde el momento en que se utilizan.

Un filtro es una clase Java que implementa la interfaz javax.servlet.Filter.

2. Implementación

a. Crear un filtro

Para crear un filtro, siga estos pasos:

 Haga un clic derecho en el proyecto y, seguidamente, haga clic en el menú New - Filter. Aparece la siguiente pantalla, donde se introduce un nombre de paquete y un nombre de clase.

images/cap2_pag73.png

 Haga clic en el botón Next para llegar a la siguiente pantalla, donde puede definir los parámetros de inicialización y las URL para las que se debe ejecutar el filtro. De forma predeterminada, la URL parametrizada es el nombre del filtro.

images/cap2_pag74.png

 Haga clic en el botón Add de la sección Filter mappings para acceder a la siguiente pantalla, que permite añadir los Servlet o las URL pattern para las que se debe ejecutar el filtro.

images/cap2_pag74_b.png

 Seleccione la casilla de verificación URL pattern e introduzca el pattern /*. Esto ejecutará el filtro para todas las peticiones HTTP. La sección Select dispatchers le permite especificar los orígenes de la petición para la que se ejecutará el filtro:

  • REQUEST: la petición proviene del cliente.

  • FORWARD: la petición sigue a la llamada del método forward(...) del RequestDispatcher

  • INCLUDE: la petición sigue a la llamada del método include(...) del RequestDispatcher

  • ERROR: la petición sigue al lanzamiento de una excepción que provoca la visualización de una página parametrizada por una etiqueta <error-page>...

Eventos

1. Presentación

Cuando se ejecuta una aplicación, se crean, manipulan y destruyen los objetos gestionados por el contenedor de servlets. Puede ser interesante recibir notificaciones de estos eventos para realizar los procesamientos asociados. Para recibir la notificación de un evento, debemos crear una clase que implemente una interfaz correspondiente al evento en el que estamos interesados. En las siguientes secciones se analizan estos eventos, en función del contexto con el que se relacionan. Para obtener más información sobre los contextos, consulte la sección Los diferentes contextos, más atrás en este capítulo.

En las capturas de pantalla de esta sección, se mencionan interfaces del paquete javax.servlet.http pero, en la última especificación, este paquete ha sido renombrado por jakarta.servlet.http.

2. Configurar las clases

Para que los métodos que ha implementado se llamen cuando se produce el evento correspondiente, la clase se debe declarar en el entorno. Esta declaración se puede realizar como para servlets y filtros, es decir, a nivel de descriptor de despliegue o mediante una anotación.

La clase se debe declarar en el archivo web.xml mediante la etiqueta <listener> y la subetiqueta <listener-class>, como se muestra en el siguiente ejemplo:

<listener>  
    <listener-class>  
    fr.ediciones_eni.jakartaee.listeners.EjemploListener  
    </listener-class>  
</listener> 

Con las anotaciones, basta con colocar la anotación @WebListener a nivel de la declaración de la clase:

@WebListener  
public class EjemploListener implements   
                    XXXListener,   
                    YYYListener   
{  
    //...  
} 

Las interfaces XXXListener e YYYListener se deben reemplazar por las interfaces descritas en las siguientes secciones.

3. Eventos relacionados con el contexto de la aplicación

El contexto de la aplicación se representa mediante un objeto de tipo ServletContext. Cuando se crea o destruye este objeto, se genera un evento. Los métodos que permiten gestionar estos eventos se encuentran...

Seguridad

La seguridad se describe en el capítulo que trata sobre el despliegue de Tomcat.

Conclusión

Este capítulo ha revisado los elementos esenciales para comenzar con éxito un proyecto utilizando servlets. Los servlets son el corazón de la especificación homónima. Permiten procesar peticiones HTTP y proporcionar respuestas adecuadas. Sin embargo, sin la existencia de los otros elementos, la tecnología seguiría siendo limitada. Las cookies, las sesiones y los filtros son una parte integral de la especificación y proporcionan la riqueza y flexibilidad necesarias.