Un Servlet de Jakarta , anteriormente Java Servlet , es un componente de software Java que amplía las capacidades de un servidor . Aunque los servlets pueden responder a muchos tipos de solicitudes, lo más común es que implementen contenedores web para alojar aplicaciones web en servidores web y, por lo tanto, califican como una API web de servlet del lado del servidor . Estos servlets web son la contraparte Java de otras tecnologías de contenido web dinámico como PHP y ASP.NET .
Un Servlet de Jakarta es una clase Java [1] en Jakarta EE que se ajusta a la API de Servlet de Jakarta, [2] un estándar para implementar clases Java que responden a solicitudes. En principio, los servlets podrían comunicarse a través de cualquier protocolo cliente-servidor , pero se utilizan con mayor frecuencia con HTTP . En principio, cualquier servlet puede ampliar la GenericServlet
clase; sin embargo, siendo realistas, todos los servlets amplían la HttpServlet
clase. [3] Por lo tanto, "servlet" se utiliza a menudo como abreviatura de "servlet HTTP". [4] Así, un servlet se puede utilizar para agregar contenido dinámico a un servidor web utilizando la plataforma Java . [5] El contenido generado suele ser HTML , pero pueden contener otros datos como XML y, más comúnmente, JSON .
La API de Servlet de Jakarta ha sido, hasta cierto punto, reemplazada [ cita necesaria ] por dos tecnologías Java estándar para servicios web:
A Servlet
es un objeto que recibe una solicitud y genera una respuesta basada en esa solicitud. El paquete básico Servlet
define objetos Java para representar solicitudes y respuestas de servlet, así como objetos para reflejar los parámetros de configuración y el entorno de ejecución del servlet.
La API de servlet , contenida en la jerarquía de paquetes de Javajavax.servlet
, define las interacciones esperadas del contenedor web y un servlet. [4]
El paquete javax.servlet.http
define subclases específicas de HTTPGenericServlet
de . Este paquete incluye objetos de gestión de sesiones que rastrean múltiples solicitudes y respuestas entre el servidor web y un cliente.
Los servlets pueden mantener el estado de las variables de sesión en muchas transacciones del servidor mediante el uso de cookies HTTP o mapeo de URL . La aplicación puede realizar un seguimiento de la sesión y las cookies mediante el uso de sesiones y cookies. [6] Hay varias formas de crear y mapear URL para un servlet. Antes de la especificación del servlet 3.0 (Tomcat 7.0), la única opción era configurar web.xml para asignar un servlet a una URL. Para aplicaciones que utilizan la especificación servlet 3.0 o posterior, la @WebServlet
anotación se puede utilizar para asignar cualquier servlet a uno o más patrones de URL.
Los servlets pueden empaquetarse en un archivo WAR como una aplicación web . [7]
Se requiere un contenedor web para implementar y ejecutar un servlet. Un contenedor web (también conocido como contenedor de servlets) es esencialmente el componente de un servidor web que interactúa con los servlets. [1] El contenedor web es responsable de gestionar el ciclo de vida de los servlets, asignar una URL a un servlet en particular y garantizar que el solicitante de la URL tenga los derechos de acceso correctos.
El compilador de Jakarta Server Pages (JSP) puede generar servlets automáticamente desde Jakarta Server Pages . La diferencia entre los servlets y JSP es que los servlets normalmente incorporan HTML dentro del código Java, mientras que los JSP incorporan código Java en HTML. En general, cuando se utilizan JSP, incrustar código Java en JSP se considera una mala práctica. [8] En cambio, un mejor enfoque sería mover la lógica de back-end del JSP al código Java en el archivo Servlet
. [8] Esto garantiza que JSP Servlet
solo sea responsable del procesamiento y que JSP solo sea responsable de presentar el HTML, [8] permitiendo una clara separación de preocupaciones y conformidad con el principio de responsabilidad única .
Si bien el uso directo de servlets para generar HTML (como se muestra en el ejemplo a continuación) se ha vuelto raro, el marco web MVC de nivel superior en Yakarta EE ( Faces ) todavía usa explícitamente la tecnología de servlet para el manejo de solicitudes/respuestas de bajo nivel a través de FacesServlet
.
Un uso algo más antiguo es utilizar servlets junto con JSP en un patrón llamado " Modelo 2 ", que es una versión del modelo-vista-controlador .
La API de Java Servlet se anunció públicamente por primera vez en la conferencia inaugural JavaOne en mayo de 1996. [9] [10] Aproximadamente dos meses después de los anuncios en la conferencia, la primera implementación pública estuvo disponible en el sitio web de JavaSoft. Este fue el primer alfa del servidor web Java (JWS; entonces conocido por su nombre en clave Jeeves ) [11] que eventualmente se enviaría como producto el 5 de junio de 1997. [12]
En su blog en java.net , el veterano de Sun y líder de GlassFish , Jim Driscoll, detalla la historia de la tecnología de servlets. [13] James Gosling pensó por primera vez en los servlets en los primeros días de Java , pero el concepto no se convirtió en un producto hasta diciembre de 1996, cuando Sun lanzó JWS. [14] [15] [16] Esto fue antes de que lo que ahora es el EE de Yakarta se convirtiera en una especificación.
La especificación Servlet1 fue creada por Pavni Diwanji [17] [18] mientras trabajaba en Sun Microsystems , con la versión 1.0 finalizada en junio de 1997. A partir de la versión 2.2, la especificación se desarrolló bajo el Proceso de la comunidad Java .
Tres métodos son fundamentales para el ciclo de vida de un servlet. Estos son init()
, service()
y destroy()
. Son implementados por cada servlet y el servidor los invoca en momentos específicos.
service()
método del servlet para cada solicitud. El service()
método determina el tipo de solicitud que se realiza y la envía a un método apropiado para manejar la solicitud. El desarrollador del servlet debe proporcionar una implementación para estos métodos. Si se realiza una solicitud para un método que no está implementado por el servlet, se llama al método de la clase principal, lo que generalmente genera un error que se devuelve al solicitante.destroy()
método que pone el servlet fuera de servicio. El destroy()
método, como init()
, se llama solo una vez en el ciclo de vida de un servlet.El siguiente es un escenario de usuario típico de estos métodos.
init()
método del servlet.service()
método del servlet.service()
método se llama para cada solicitud HTTP.destroy()
para ceder cualquier recurso, como los identificadores de archivos, asignados al servlet; Los datos importantes se pueden guardar en un almacén persistente.El siguiente servlet de ejemplo imprime cuántas veces service()
se llamó a su método.
Tenga en cuenta que HttpServlet
es una subclase de GenericServlet
, una implementación de la Servlet
interfaz.
El service()
método de clase HttpServlet
envía solicitudes a los métodos ,,,, doGet()
etc .; según la solicitud HTTP. En el siguiente ejemplo se anula y no distingue qué método de solicitud HTTP sirve.doPost()
doPut()
doDelete()
service()
importar java.io.IOException ; importar jakarta.servlet.ServletConfig ; importar jakarta.servlet.ServletException ; importar jakarta.servlet.http.HttpServlet ; importar jakarta.servlet.http.HttpServletRequest ; importar jakarta.servlet.http.HttpServletResponse ; clase pública ServletLifeCycleExample extiende HttpServlet { entero privado contador compartido ; @Override public void init ( configuración final de ServletConfig ) lanza ServletException { super . inicio ( configuración ); getServletContext (). log ( "init() llamado" ); contadorcompartido = 0 ; } @Override servicio anulado protegido ( solicitud HttpServletRequest final , respuesta HttpServletResponse final ) arroja ServletException , IOException { getServletContext (). log ( "servicio() llamado" ); int contador local ; sincronizado ( Contador compartido ) { Contador compartido ++ ; contador local = contador compartido ; } respuesta . obtener escritor (). escribir ( "Incrementando el recuento a " + localCounter ); // accediendo a una respuesta de variable local . obtener escritor (). rubor (); // respuesta de descarga } @Override public void destroy () { getServletContext (). log ( "destruir() llamado" ); } }
La especificación de la tecnología Servlet se ha implementado en muchos productos. Vea una lista de implementaciones en la página del contenedor web .
También existen otros tipos de contenedores de servlets, como los de servlets SIP, por ejemplo, SailFin .
Cubrimos la versión 2.0 de la API de Servlet, que se introdujo como parte de Java Web Server 1.1 en diciembre de 1997 y se aclaró con el lanzamiento del Java Servlet Development Kit 2.0 en abril de 1998.