
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 .
Introducción
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 GenericServletclase; sin embargo, hablando de manera realista, todos los servlets extienden la HttpServletclase. [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:
- Los servicios web RESTful de Jakarta (JAX-RS 2.0), útiles para servicios AJAX, JSON y REST, y
- Los servicios web XML de Jakarta (JAX-WS) son útiles para los servicios web SOAP .
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 Servletde 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.httpdefine 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 @WebServletanotació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 Servletsolo 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 .
Historia
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 .
Ciclo de vida de un servlet
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.
- Durante la etapa de inicialización del ciclo de vida del servlet , el contenedor web inicializa la instancia del servlet llamando al método init(), [21] pasando un objeto que implementa la interfaz javax.servlet.ServletConfig. 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 del servlet puede atender las solicitudes de los clientes. Cada solicitud se atiende en su propio subproceso independiente. El contenedor web llama al
service()método del servlet para cada solicitud. Elservice()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. - Por último, el contenedor web llama al
destroy()método que deja fuera de servicio al 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.
- Supongamos que un usuario solicita visitar una URL .
- A continuación, el navegador genera una solicitud HTTP para esta URL.
- Luego, esta solicitud se envía al servidor apropiado.
- El servidor web recibe la solicitud HTTP y la reenvía al contenedor de servlets.
- El contenedor asigna esta solicitud a un servlet particular.
- El servlet se recupera dinámicamente y se carga 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 parámetros de inicialización al servlet para que pueda configurarse 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.
- El
service()método se llama para cada solicitud HTTP.
- El
- 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 para cada contenedor.
- El contenedor llama al
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. - La memoria asignada para el servlet y sus objetos puede luego ser recolectada como basura.
Ejemplo
El siguiente servlet de ejemplo imprime cuántas veces service()se llamó a su método.
Tenga en cuenta que HttpServletes una subclase de GenericServlet, una implementación de la Servletinterfaz.
El service()método de HttpServletla 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() llamado" ); 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" ); } }
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 existen otros tipos de contenedores de servlets, como los de los servlets SIP, por ejemplo, SailFin .
Véase también
- Protocolo Apache JServ (AJP)
Citas
- ^ ab Murach & Urban 2014, pp. 170–171, §2 Habilidades esenciales de servlets y JSP - Perspectiva - Resumen.
- ^ "Servlet (API de especificación Java(TM) EE 7)". oracle.com . Consultado el 25 de julio de 2018 .
- ^ Murach y Urban 2014, págs. 128-129, §2 Habilidades esenciales sobre servlets y JSP: cómo crear y mapear un servlet.
- ^ ab "Servlet Essentials - Capítulo 1". novocode.com . Archivado desde el original el 18 de diciembre de 2017.
- ^ Murach & Urban 2014, págs. 40–42, §1 Comience bien: el servlet para el procesamiento back-end.
- ^ Murach y Urban 2014, p. 87, §2 Habilidades esenciales de servlets y JSP.
- ^ Murach & Urban 2014, p. 74, §1 Empezar bien: otras habilidades para trabajar con aplicaciones web.
- ^ abc Murach & Urban 2014, pp. 46–47, §1 Comience bien: el JSP para la segunda página.
- ^ Freedman, Matt (26 de junio de 1996). «Informe de la conferencia JavaOne». JavaWorld . Archivado desde el original el 26 de julio de 2018. Consultado el 25 de julio de 2018 .
- ^ Diwanji, Pavani; Connelly, Dave; Wagle, Prasad (29 de mayo de 1996). "Java Server and 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 la información". JavaWorld . Archivado desde el original el 2018-07-26 . Consultado el 2018-07-25 .
- ^ Chang, Phil Inje (1 de junio de 1997). "¡Ya está disponible Java Web Server!". JavaWorld . Archivado desde el original el 26 de julio de 2018. Consultado el 25 de julio de 2018 .
- ^ "Historial de servlets | community.oracle.com". Weblogs.java.net. 10 de diciembre de 2005. Archivado desde el original el 15 de agosto de 2020. Consultado el 14 de junio de 2013 .
- ^ ab Hunter, Jason (marzo de 2000). "Servlet Timeline". Más allá de la programación de servlets en Java . Conferencia de O'Reilly sobre Java. O'Reilly Media .[ enlace muerto permanente ]
- ^ "Java Web Server". Javasoft . Sun Microsystems . Archivado desde el original el 11 de enero de 1998 . Consultado el 1 de febrero de 2020 .
- ^ "Java Web Server(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 Internet . Archivado desde el original el 26 de julio de 2018. Consultado el 12 de noviembre de 2016 .
- ^ Patente estadounidense 5928323, Gosling, James A.; Diwanji, Pavni y Connelly, David W., "Aparato y método para generar información dinámicamente con objetos de software del lado del servidor", publicada el 27 de julio de 1999, expedida el 27 de julio de 1999, asignada a Sun Microsystems
- ^ "¿Qué novedades hay en Servlet 3.1? - Java EE 7 avanza (Arun Gupta, Miles to go ...)". oracle.com . Consultado el 22 de noviembre de 2016 .
- ^ Crawford, William; Hunter, Jason (noviembre de 1998). "Prefacio". Programación de servlets en Java (1.ª ed.). O'Reilly Media . pág. ix–x. ISBN 978-1-56592-391-1Cubrimos
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.
- ^ Murach y Urban 2014, págs. 160-163, §15 Cómo desarrollar servlets: más habilidades para trabajar con servlets.
Referencias
- Murach, Joel; Urban, Michael (2014). Servlets de Java y JSP de Murach . ISBN 978-1-890774-78-3.
Enlaces externos
- Sitio web oficial
- Servlets.com Archivado el 25 de julio de 2018 en Wayback Machine
