Un Jakarta Servlet (anteriormente Java Servlet) es un componente de software de Java que amplía las capacidades de un servidor . A pesar de que los servlets pueden responder a muchos tipos de peticiones, que más comúnmente implementan contenedores web para alojar aplicaciones web en servidores web y por lo tanto califican como un servlet en el servidor web de la API . Estos servlets web son la contraparte de Java a otras tecnologías de contenido web dinámico como PHP y ASP.NET .
Autor (es) original (es) | Pavni Diwanji |
---|---|
Desarrollador (es) | Fundación Eclipse |
Versión inicial | Diciembre de 1996 |
Lanzamiento estable | 5.0 / 7 de septiembre de 2020 |
Repositorio | |
Escrito en | Java |
Plataforma | Yakarta EE 9 |
Tamaño | 2,56 MB |
Tipo | Componente de software para API web |
Licencia | Licencia pública de Eclipse |
Sitio web | jakarta |
Introducción
Un Jakarta Servlet procesa o almacena una clase Java en Jakarta EE que se ajusta a la API de Jakarta Servlet, [1] 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 . Por tanto, "servlet" se utiliza a menudo como abreviatura de "servlet HTTP". [2] 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 es comúnmente HTML , pero puede 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 mapeo de URL .
La API de Jakarta Servlet, hasta cierto punto, ha sido reemplazada por dos tecnologías estándar de Java para servicios web:
- los servicios web RESTful de Yakarta (JAX-RS 2.0) útiles para los servicios AJAX, JSON y REST, y
- los servicios web XML de Jakarta (JAX-WS) útiles para los servicios web SOAP .
Para implementar y ejecutar un servlet, se debe utilizar 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, mapear una URL a un servlet en particular y garantizar que el solicitante de la URL tenga los derechos de acceso correctos.
La API de Servlet , contenida en la jerarquía de paquetes de Javajavax.servlet
, define las interacciones esperadas del contenedor web y un servlet. [2]
A 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 de servlet genéricos, incluidos los objetos de administración de sesiones 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 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 incrustan HTML dentro del código Java, mientras que los JSP incrustan código Java en HTML. Si bien el uso directo de servlets para generar HTML (como se muestra en el siguiente ejemplo) se ha vuelto poco común, el marco web MVC de nivel superior en Jakarta EE ( JSF ) todavía usa 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 usar servlets junto con JSP en un patrón llamado " Modelo 2 ", que es un sabor del modelo-vista-controlador .
La versión actual de Servlet es 4.0. [3]
Historia
La API de Java Servlet se anunció públicamente por primera vez en la conferencia inaugural de JavaOne en mayo de 1996. [4] [5] 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 ) [6] que finalmente se enviaría como producto el 5 de junio de 1997. [7]
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. [8] 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. [9] [10] [11] 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 [12] [13] 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 API de servlet | Liberado | Especificación | Plataforma | Cambios importantes |
---|---|---|---|---|
Servlet de Yakarta 5.0.0 M1 | 12 de junio de 2020 | 5,0 | Yakarta EE 9 | API movida del paquete javax.servlet ajakarta.servlet |
Jakarta Servlet 4.0.3 | 13 de agosto de 2019 | 4.0 | Yakarta EE 8 | Renombrado de la marca comercial "Java" |
Java Servlet 4.0 | Septiembre de 2017 | JSR 369 | Java EE 8 | HTTP / 2 |
Java Servlet 3.1 | Mayo 2013 | JSR 340 | Java EE 7 | E / S sin bloqueo, mecanismo de actualización del protocolo HTTP ( WebSocket ) [14] |
Java Servlet 3.0 | Diciembre de 2009 | JSR 315 | Java EE 6, Java SE 6 | Conectabilidad, facilidad de desarrollo, servlet asíncrono, seguridad, carga de archivos |
Java Servlet 2.5 | Septiembre de 2005 | JSR 154 | Java EE 5, Java SE 5 | Requiere Java SE 5, admite anotaciones |
Java Servlet 2.4 | Noviembre de 2003 | JSR 154 | J2EE 1.4, J2SE 1.3 | web.xml usa un esquema XML |
Java Servlet 2.3 | Agosto de 2001 | JSR 53 | J2EE 1.3, J2SE 1.2 | Además de Filter |
Java Servlet 2.2 | Agosto de 1999 | JSR 902 , JSR 903 | J2EE 1.2, J2SE 1.2 | Se convierte en parte de J2EE, introdujo aplicaciones web independientes en archivos .war |
Java Servlet 2.1 | Noviembre de 1998 | 2.1a | Sin especificar | Primera especificación oficial, agregada RequestDispatcher ,ServletContext |
Java Servlet 2.0 | Diciembre de 1997 | N / A | JDK 1.1 | Parte de abril de 1998 Java Servlet Development Kit 2.0 [15] |
Java Servlet 1.0 | Diciembre de 1996 | N / A | Parte de junio de 1997 Java Servlet Development Kit (JSDK) 1.0 [9] |
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 del servlet , el contenedor web inicializa la instancia del servlet llamando al init()método, pasando un objeto que implementa la javax.servlet.ServletConfiginterfaz. Este objeto de configuración permite que el servlet acceda a los parámetros de inicialización de nombre-valor desde la aplicación web.
- Después de la inicialización, la instancia de servlet puede atender las solicitudes de los clientes. Cada solicitud se atiende en su propio hilo independiente. El contenedor web llama al
service()
método del servlet para cada solicitud. Elservice()
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 resulta en un error que se devuelve al solicitante. - Finalmente, el contenedor web llama al
destroy()
método que deja fuera de servicio el servlet. Eldestroy()
método, comoinit()
, 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.
- Suponga que un usuario solicita visitar una URL .
- Luego, el navegador genera una solicitud HTTP para esta URL.
- Luego, esta solicitud se envía al servidor correspondiente.
- El servidor web recibe la solicitud HTTP y la reenvía al contenedor de servlets.
- El contenedor asigna esta solicitud a un servlet en particular.
- El servlet se recupera y carga dinámicamente en el espacio de direcciones del contenedor.
- El contenedor invoca el
init()
método del servlet.- Este método se invoca solo cuando el servlet se carga por primera vez en la memoria.
- Es posible pasar los parámetros de inicialización al servlet para que se configure a sí mismo.
- 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 direcciones del contenedor y está disponible para procesar cualquier otra solicitud HTTP recibida de los clientes.
- Se
service()
llama al método para cada solicitud HTTP.
- Se
- El contenedor puede, en algún momento, decidir descargar el servlet de su memoria.
- Los algoritmos mediante los cuales se toma esta decisión son específicos de cada contenedor.
- El contenedor llama al
destroy()
método del servlet para ceder cualquier recurso, como los manejadores de archivos, que están asignados al servlet; los datos importantes se pueden guardar en un almacén permanente. - La memoria asignada para el servlet y sus objetos se puede recolectar como basura.
Ejemplo
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 la HttpServlet
clase distribuye peticiones 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.
import java.io.IOException ;import javax.servlet.ServletConfig ; import javax.servlet.ServletException ; import javax.servlet.http.HttpServlet ; import javax.servlet.http.HttpServletRequest ; import javax.servlet.http.HttpServletResponse ;public class ServletLifeCycleExample extiende HttpServlet { private Integer sharedCounter ; @Override public void init ( configuración final de ServletConfig ) lanza ServletException { super . init ( config ); getServletContext (). log ( "init () llamado" ); sharedCounter = 0 ; } @Override protected void service ( solicitud HttpServletRequest final , respuesta HttpServletResponse final ) lanza ServletException , IOException { getServletContext (). log ( "servicio () llamado" ); int localCounter ; sincronizado ( SharedCounter ) { sharedCounter ++ ; localCounter = sharedCounter ; } respuesta . getWriter (). write ( "Incrementando el recuento a" + localCounter ); // acceder a una variable local } @Override public void destroy () { getServletContext (). log ( "destroy () llamado" ); } }
Servidores de contenedores
La especificación para la tecnología Servlet se ha implementado en muchos productos. Consulte una lista de implementaciones en la página del contenedor web.
Referencias
- ^ "Servlet (API de especificación Java (TM) EE 7)" . oracle.com . Consultado el 25 de julio de 2018 .
- ^ a b "Servlet Essentials - Capítulo 1" . novocode.com . Archivado desde el original el 18 de diciembre de 2017.
- ^ https://jcp.org/en/jsr/detail?id=369
- ^ Freedman, Matt (26 de junio de 1996). "Informe de la conferencia JavaOne" . JavaWorld .
- ^ Diwanji, Pavani; Connelly, Dave; Wagle, Prasad (29 de mayo de 1996). "Java Server y Servlets" (PDF) . Servidores y extensiones de servidor . JavaOne 1996. Archivado (PDF) desde el original el 16 de agosto de 2000 . Consultado el 1 de febrero de 2020 .
- ^ Chang, Phil Inje (1 de julio de 1997). "Entrevista: El equipo de Java Web Server te da el flaco" . JavaWorld . Consultado el 25 de julio de 2018 .
- ^ Chang, Phil Inje (1 de junio de 1997). "¡Java Web Server se envía!" . JavaWorld . Consultado el 25 de julio de 2018 .
- ^ "Historial de servlet | community.oracle.com" . Weblogs.java.net. 2005-12-10 . Consultado el 14 de junio de 2013 .
- ^ a b Hunter, Jason (marzo de 2000). "Línea de tiempo del servlet" . Más allá de la programación de servlets de Java . Conferencia O'Reilly sobre Java. O'Reilly Media .
- ^ "Servidor Web Java" . Javasoft . Sun Microsystems . Archivado desde el original el 11 de enero de 1998 . Consultado el 1 de febrero de 2020 .
- ^ "Servidor Web Java (tm)" . Sun Microsystems . Archivado desde el original el 6 de febrero de 2002 . Consultado el 1 de febrero de 2020 .
- ^ "Pavni Diwanji" . Instituto de seguridad familiar en línea . Consultado el 12 de noviembre de 2016 .
- ^ Patente estadounidense 5928323 , Gosling, James A .; Pavni Diwanji & David W. Connelly, "Aparato y método para generar información dinámicamente con objetos de software del lado del servidor", publicado el 27 de julio de 1999, publicado el 27 de julio de 1999, asignado a Sun Microsystems
- ^ "¿Qué hay de nuevo en Servlet 3.1? - Java EE 7 avanzando (Arun Gupta, Miles to go ...)" . oracle.com . Consultado el 22 de noviembre de 2016 .
- ^ Crawford, William; Hunter, Jason (noviembre de 1998). "Prefacio". Programación Java Servlet (1ª ed.). O'Reilly Media . pag. ix – x. ISBN 978-1-56592-391-1.
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 de Java Servlet Development Kit 2.0 en abril de 1998.
enlaces externos
- Página web oficial
- Servlets.com