Servlet de Yakarta
Un Servlet de Jakarta (anteriormente 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, califican como una API web de servlet del lado del servidor. Dichos servlets web son la contrapartida de Java a otras tecnologías de contenido web dinámico como PHP y ASP.NET.
Introducción
Un Jakarta Servlet procesa o almacena una clase Java en Jakarta EE que se ajusta a la API de Jakarta Servlet, 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 usan con mayor frecuencia con HTTP. Por lo tanto, "servlet" se utiliza a menudo como abreviatura de "servlet HTTP". Por lo tanto, un desarrollador de software puede usar un servlet para agregar contenido dinámico a un servidor web usando la plataforma Java. El contenido generado suele ser HTML, pero pueden ser otros datos como XML y, más comúnmente, JSON. Los servlets pueden mantener el estado de las variables de sesión en muchas transacciones del servidor mediante el uso de cookies HTTP o la asignación de direcciones URL.
La API de servlet de Jakarta, hasta cierto punto, ha sido reemplazada por dos tecnologías estándar de Java para servicios web:
- los servicios web de Yakarta RESTful (JAX-RS 2.0) útiles para los servicios de AJAX, JSON y REST, y
- los Yakarta XML Web Services (JAX-WS) útiles para SOAP Web Services.
Para implementar y ejecutar un servlet, se debe usar un contenedor web. Un contenedor web (también conocido como contenedor de servlets) es esencialmente el componente de un servidor web que interactúa con los servlets. El contenedor web es responsable de administrar el ciclo de vida de los servlets, asignando una URL a un servlet en particular y asegurando que el solicitante de la URL tenga los derechos de acceso correctos.
La API de Servlet, contenida en la jerarquía de paquetes de Java javax.servlet
, define las interacciones esperadas del contenedor web y un servlet.
Un Servlet
es un objeto que recibe una solicitud y genera una respuesta basada en esa solicitud. El paquete básico de 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. El paquete javax.servlet.http
define subclases específicas de HTTP de los elementos genéricos del servlet, incluidos los objetos de gestión de sesión que rastrean múltiples solicitudes y respuestas entre el servidor web y un cliente. Los servlets se pueden empaquetar en un archivo WAR como una aplicación web.
Los servlets se pueden generar automáticamente desde 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 los JSP incorporan código Java en HTML. 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 Jakarta EE (JSF) todavía usa explícitamente la tecnología de servlet para el manejo de solicitudes/respuestas de bajo nivel a través de < código>FacesServlet. Un uso un poco más antiguo es usar servlets junto con JSP en un patrón llamado 'Modelo 2', que es una variante del modelo-vista-controlador.
Historia
La API de Java Servlet se anunció públicamente por primera vez en la conferencia inaugural de JavaOne en mayo de 1996. 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. Esta fue la primera versión alfa de Java Web Server (JWS; entonces conocido por su nombre en clave Jeeves) que finalmente se enviaría como producto el 5 de junio de 1997.
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. 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. Esto fue antes de que lo que ahora es el Jakarta EE se convirtiera en una especificación.
La especificación Servlet1 fue creada por Pavni Diwanji 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.
Versión de Servlet API | Liberado | Especificación | Plataforma | Cambios importantes |
---|---|---|---|---|
Yakarta Servlet 6.0 | 31 de mayo, 2022 | 6.0 | Yakarta EE 10 | eliminar las características deprecatadas e implementar las mejoras solicitadas |
Yakarta Servlet 5.0 | 9 de octubre de 2020 | 5.0 | Yakarta EE 9 | API movido del paquete javax.servlet a jakarta.servlet |
Yakarta Servlet 4.0.3 | Sep 10, 2019 | 4.0 | Yakarta EE 8 | Renombrado de la marca "Java" |
Java Servlet 4.0 | Sep 2017 | JSR 369 | Java EE 8 | HTTP/2 |
Java Servlet 3.1 | Mayo de 2013 | JSR 340 | Java EE 7 | Mecanismo de actualización del protocolo HTTP (WebSocket) |
Java Servlet 3.0 | Diciembre de 2009 | JSR 315 | Java EE 6, Java SE 6 | Pluggability, Ease of development, Async Servlet, Security, File Uploading |
Java Servlet 2.5 | Septiembre de 2005 | JSR 154 | Java EE 5, Java SE 5 | Requiere Java SE 5, soporta anotación |
Java Servlet 2.4 | Noviembre de 2003 | JSR 154 | J2EE 1.4, J2SE 1.3 | web.xml utiliza XML Schema |
Java Servlet 2.3 | Agosto de 2001 | JSR 53 | J2EE 1.3, J2SE 1.2 | Adición de Filter |
Java Servlet 2.2 | Agosto de 1999 | JSR 902, JSR 903 | J2EE 1.2, J2SE 1.2 | Forma parte de J2EE, introdujo aplicaciones web independientes en archivos.war |
Java Servlet 2.1 | Noviembre de 1998 | 2.1a | No especificada | Primera especificación oficial, añadido RequestDispatcher , ServletContext |
Java Servlet 2.0 | Diciembre de 1997 | — | JDK 1.1 | Parte de abril de 1998 Java Servlet Development Kit 2.0 |
Java Servlet 1.0 | Diciembre de 1996 | — | Parte de junio de 1997 Java Servlet Development Kit (JSDK) 1.0 |
Ciclo de vida de un servlet
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 son invocados en momentos específicos por el servidor.
- Durante la etapa de inicialización del ciclo de vida servlet, el contenedor web inicializa la instancia servlet llamando al método init(), pasando un objeto implementando el javax. Servlet. Interfaz ServletConfig. Este objeto de configuración permite al servlet acceder a los parámetros de inicialización de valor de nombre de la aplicación web.
- Después de la inicialización, la instancia servlet puede atender las solicitudes de clientes. Cada solicitud se sirve en su propio hilo separado. El contenedor web llama
service()
método del servlet para cada solicitud. Elservice()
método determina el tipo de solicitud que se hace y lo 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 hace una solicitud para un método que no es implementado por el servlet, se llama el método de la clase padre, por lo general resulta que un error se devuelve al solicitante. - Finalmente, el contenedor web llama al
destroy()
método que saca el servlet del servicio. Eldestroy()
método, comoinit()
, se llama sólo una vez en el ciclo de vida de un servlet.
El siguiente es un escenario de usuario típico de estos métodos.
- Supongamos que un usuario solicita visitar una URL.
- El navegador entonces genera una solicitud HTTP para esta URL.
- Esta solicitud se envía al servidor apropiado.
- La solicitud HTTP es recibida por el servidor web y enviada al contenedor de servlet.
- El contenedor mapea esta solicitud a un servlet en particular.
- El servlet se recupera dinámicamente y se carga en el espacio de dirección del contenedor.
- El contenedor invoca el
init()
método del servlet.- Este método se invoca sólo cuando el servlet se carga primero en la memoria.
- Es posible pasar los parámetros de inicialización al servlet para que pueda configurarse.
- El contenedor invoca el
service()
método del servlet.- Este método se llama para procesar la solicitud HTTP.
- El servlet puede leer datos que se han proporcionado en la solicitud HTTP.
- El servlet también puede formular una respuesta HTTP para el cliente.
- El servlet permanece en el espacio de dirección del contenedor y está disponible para procesar cualquier otra solicitud HTTP recibida de los clientes.
- El
service()
método se requiere para cada solicitud HTTP.
- El
- El contenedor puede, en algún momento, decidir descargar el servlet de su memoria.
- Los algoritmos por los que se toma esta decisión son específicos para cada contenedor.
- El contenedor llama al servlet
destroy()
método para renunciar a los recursos tales como mangos de archivos que se asignan para el servlet; datos importantes pueden ser guardados a una tienda persistente. - La memoria asignada para el servlet y sus objetos puede ser recogida basura.
Ejemplo
El siguiente servlet de ejemplo muestra cuántas veces se llamó a su método service()
.
Tenga en cuenta que HttpServlet
es una subclase de GenericServlet
, una implementación de la interfaz Servlet
.
El método service()
de la clase HttpServlet
envía solicitudes a los métodos doGet()
, doPost()
, doPut()
, doDelete()
, y así sucesivamente; de acuerdo con la solicitud HTTP. En el siguiente ejemplo, service()
se anula y no distingue qué método de solicitud HTTP sirve.
importación java.io.IOExcepcion;importación jakarta.servlet.ServletConfig;importación jakarta.servlet.ServletException;importación jakarta.servlet.http.HtpServlet;importación jakarta.servlet.http.HtpServletRequest;importación jakarta.servlet.http.HtpServletResponse;público clase ServletLifeCycleExample extensiones HtpServlet {} privado Integer sharedCounter; @Override público vacío init()final ServletConfig config) lanzamientos ServletException {} super.init()config); getServletContext().log()"init() called"); sharedCounter = 0; } @Override protegida vacío servicio()final HtpServletRequest solicitud, final HtpServletResponse respuesta) lanzamientos ServletException, IOException {} getServletContext().log()"servicio() llamado"); int localCounter; sincronizado ()sharedCounter) {} sharedCounter++; localCounter = sharedCounter; } respuesta.getWriter().escribir()"Incrementando la cuenta a " + localCounter); // acceso a una variable local } @Override público vacío destruir() {} getServletContext().log()"destruy() called"); }}
Servidores de contenedores
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 hay otros tipos de contenedores de servlets, como los de servlets SIP, por ejemplo, SailFin.
Contenido relacionado
Analizador de Earley
Cola de dos extremos
Distribución de linux