Un servlet de Jakarta , anteriormente llamado servlet de Java, es un componente de software de 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, se los califica como una API web de servlet del lado del servidor . Dichos servlets web son la contraparte de Java de otras tecnologías de contenido web dinámico como PHP y ASP.NET .
Un Jakarta Servlet es una clase Java [1] en Jakarta EE que cumple con la API de Jakarta Servlet, [2] un estándar para implementar clases Java que responden a solicitudes. Los servlets podrían, en principio, comunicarse a través de cualquier protocolo cliente-servidor , pero se utilizan con mayor frecuencia con HTTP . En principio, cualquier servlet puede extender la GenericServlet
clase; sin embargo, hablando de manera realista, todos los servlets extienden la HttpServlet
clase. [3] Por lo tanto, "servlet" se utiliza a menudo como abreviatura de "servlet HTTP". [4] Por lo tanto, un servlet se puede utilizar para agregar contenido dinámico a un servidor web utilizando la plataforma Java . [5] El contenido generado es comúnmente HTML , pero puede ser otros datos como XML y, más comúnmente, JSON .
La API de Servlet de Jakarta ha sido reemplazada, hasta cierto punto [ cita requerida ], por dos tecnologías Java estándar para servicios web:
Un objeto recibe una solicitud y genera una respuesta en función de esa solicitud. El paquete básico define objetos Java para representar solicitudes y respuestas Servlet
de servlets, así como objetos para reflejar los parámetros de configuración y el entorno de ejecución del servlet.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 HTTP de GenericServlet
. Este paquete incluye objetos de administració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 . [6] Existen varias formas de crear un servlet y utilizar el mapeo de URL con un servlet. Antes de la especificación servlet 3.0 (Tomcat 7.0), configurar el web.xml para mapear un servlet a una URL era la única opción. Para las aplicaciones que utilizan la especificación servlet 3.0 o posterior, la @WebServlet
anotación se puede utilizar para mapear 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 necesita 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 administrar 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.
Los servlets se pueden generar automáticamente a partir de Jakarta Server Pages (JSP) mediante el compilador de Jakarta Server Pages . La diferencia entre los servlets y JSP es que los servlets normalmente incorporan HTML dentro del código Java, mientras que las JSP incorporan código Java en HTML. En general, cuando se utilizan JSP, la incorporación de código Java en JSP se considera una mala práctica. [8] En cambio, un mejor enfoque sería trasladar la lógica de back-end de JSP al código Java en Servlet
. [8] Esto garantiza que Servlet
solo sea responsable del procesamiento, y que JSP solo sea responsable de presentar el HTML, [8] lo que permite una clara separación de preocupaciones y la 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 poco común, el marco web MVC de nivel superior en Jakarta EE ( Faces ) aún utiliza explícitamente la tecnología de servlets 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 variante 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 se puso a disposición en el sitio web de JavaSoft. Esta fue la primera versión alfa del servidor web Java (JWS; entonces conocido por su nombre en código Jeeves ) [11] que finalmente se lanzaría como producto el 5 de junio de 1997. [12]
En su blog en java.net , Jim Driscoll, veterano de Sun y líder de GlassFish, 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 Jakarta EE se convirtiera en una especificación.
La especificación Servlet1 fue creada por Pavni Diwanji [17] [18] mientras trabajaba en Sun Microsystems , y la versión 1.0 se finalizó en junio de 1997. A partir de la versión 2.2, la especificación se desarrolló bajo el Java Community Process .
Hay tres métodos que son fundamentales para el ciclo de vida de un servlet: init()
, service()
y destroy()
. Todos los servlets los implementan 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 está realizando y la envía a un método apropiado para gestionar 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 normalmente da como resultado un error que se devuelve al solicitante.destroy()
método que deja fuera de servicio al servlet. 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()
método del servlet para ceder cualquier recurso, como controladores de archivos, que estén asignados para el 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 HttpServlet
la clase envía solicitudes a los métodos doGet()
, doPost()
, doPut()
, doDelete()
, etc., según la solicitud HTTP. En el ejemplo siguiente, service()
se reemplaza y no distingue a qué método de solicitud HTTP sirve.
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 { private Integer sharedCounter ; @Override public void init ( final ServletConfig config ) lanza ServletException { super.init ( config ); getServletContext (). log ( " init ( ) llamado" ); sharedCounter = 0 ; } @Override protected void service ( final HttpServletRequest request , final HttpServletResponse response ) lanza ServletException , IOException { getServletContext (). log ( "service() called" ); int localCounter ; synchronousd ( sharedCounter ) { sharedCounter ++ ; localCounter = sharedCounter ; } response.getWriter (). write ( " Incrementando el conteo a " + localCounter ); // accediendo a una variable local response.getWriter (). flush (); // vaciando la respuesta } @Override public void destroy () { getServletContext (). log ( "destroy() llamado" ); } }
La especificación de la tecnología Servlet se ha implementado en muchos productos. Consulte una lista de implementaciones en la página del contenedor web .
También existen otros tipos de contenedores de servlets, como aquellos para servlets SIP, por ejemplo, SailFin .
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 de Java Servlet Development Kit 2.0 en abril de 1998.