Servlet de Yakarta

Compartir Imprimir Citar
Vida de un archivo JSP

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:

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.

Historia de la API de Servlet
Versión de Servlet APILiberadoEspecificaciónPlataformaCambios importantes
Yakarta Servlet 6.031 de mayo, 20226.0Yakarta EE 10eliminar las características deprecatadas e implementar las mejoras solicitadas
Yakarta Servlet 5.09 de octubre de 20205.0Yakarta EE 9API movido del paquete javax.servlet a jakarta.servlet
Yakarta Servlet 4.0.3Sep 10, 20194.0Yakarta EE 8Renombrado de la marca "Java"
Java Servlet 4.0Sep 2017JSR 369Java EE 8HTTP/2
Java Servlet 3.1Mayo de 2013JSR 340Java EE 7Mecanismo de actualización del protocolo HTTP (WebSocket)
Java Servlet 3.0Diciembre de 2009JSR 315Java EE 6, Java SE 6Pluggability, Ease of development, Async Servlet, Security, File Uploading
Java Servlet 2.5Septiembre de 2005JSR 154Java EE 5, Java SE 5Requiere Java SE 5, soporta anotación
Java Servlet 2.4Noviembre de 2003JSR 154J2EE 1.4, J2SE 1.3web.xml utiliza XML Schema
Java Servlet 2.3Agosto de 2001JSR 53J2EE 1.3, J2SE 1.2Adición de Filter
Java Servlet 2.2Agosto de 1999JSR 902, JSR 903J2EE 1.2, J2SE 1.2Forma parte de J2EE, introdujo aplicaciones web independientes en archivos.war
Java Servlet 2.1Noviembre de 19982.1aNo especificadaPrimera especificación oficial, añadido RequestDispatcher, ServletContext
Java Servlet 2.0Diciembre de 1997JDK 1.1Parte de abril de 1998 Java Servlet Development Kit 2.0
Java Servlet 1.0Diciembre de 1996Parte 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.

El siguiente es un escenario de usuario típico de estos métodos.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.