Ciclo de vida de JSP: Fases y diagrama explicados

⚡ Resumen inteligente

El ciclo de vida de JSP describe cómo un contenedor traduce una página a un servlet, la compila, carga la clase, crea una instancia, la inicializa, atiende todas las solicitudes a través del método de servicio generado y, finalmente, la destruye.

  • 🔄 Siete fases: La traducción, la compilación, la carga de clases, la instanciación, la inicialización, el procesamiento de solicitudes y la destrucción se ejecutan en ese orden fijo.
  • 📄 Traducción: El contenedor valida la página y luego escribe un Java archivo fuente, por lo que demo.jsp se convierte en demo_jsp.java antes de que se ejecute nada.
  • ⚙️ Compilación: El código fuente generado se compila en demo_jsp.class, que Tomcat guarda en su directorio de trabajo junto con el archivo .java.
  • 🚀 Tres métodos: jspInit() prepara la página una sola vez, _jspService() responde a cada solicitud y jspDestroy() libera los recursos al final.
  • 🚫 Una regla: _jspService() es generado por el contenedor y nunca debe ser escrito ni sobrescrito por el autor de la página.
  • 🗃️ Gancho de limpieza: Sobrescribir jspDestroy() es el lugar correcto para cerrar las conexiones a la base de datos y abrir archivos.

Fases del ciclo de vida de JSP desde la traducción hasta la destrucción

¿Qué es el ciclo de vida de JSP?

Ciclo de vida JSP Se define como la traducción de una página JSP a un servlet, ya que una página JSP debe convertirse en un servlet antes de poder procesar solicitudes de servicio. El ciclo de vida comienza con la creación de la página JSP y finaliza con la destrucción de la instancia de servlet generada a partir de ella.

Debido a que la clase generada es un servlet ordinario, todo lo que ya sabes sobre el servlet se aplica.tract sigue vigente. El Java El código que escribe el contenedor es el que realmente se ejecuta; el archivo JSP es solo el código fuente que usted mantiene.

Diferentes fases del ciclo de vida de JSP

Cuando el navegador solicita una página JSP, el motor JSP primero comprueba si necesita compilarla. Si la página JSP nunca se ha compilado o si se ha modificado desde la última compilación, el motor JSP la compila.

El proceso de compilación de una página JSP consta de tres pasos:

  • Análisis de JSP
  • Convertir JSP en servlet
  • Compilando el servlet

Diagrama del ciclo de vida JSP

El ciclo de vida de JSP se muestra en el diagrama a continuación, que traces una sola página desde el archivo fuente hasta la clase que ejecuta el contenedor.

Diagrama del ciclo de vida de JSP que muestra la traducción, compilación, carga, instanciación, inicialización, procesamiento de solicitudes y destrucción.

Los siguientes pasos explican el ciclo de vida de JSP:

  1. Traducción de página JSP
  2. Compilación de la página JSP (compilación de la página JSP en _jsp.java)
  3. Carga de clases (_jsp.java se convierte en el archivo de clase _jsp.class)
  4. Instanciación (se crea un objeto del servlet generado)
  5. Inicialización (el contenedor invoca el método jspInit())
  6. Procesamiento de la solicitud (el contenedor invoca el método _jspService()).
  7. Destruir (el método jspDestroy() es invocado por el contenedor)

Explicación de las fases del ciclo de vida de JSP

Analicemos cada uno de los puntos anteriores con más detalle.

1) Traducción de la página JSP:

A Java El archivo servlet se genera a partir de un archivo fuente JSP. Este es el primer paso del ciclo de vida de JSP. En la fase de traducción, el contenedor valida la corrección sintáctica de la página JSP y los archivos de etiquetas.

  • El contenedor JSP interpreta las directivas y acciones estándar, y las acciones personalizadas que hacen referencia a las bibliotecas de etiquetas (todas forman parte de la página JSP y están cubiertas en el elementos JSP tutorial) utilizado en esta página JSP.
  • En la descripción gráfica anterior, demo.jsp se traduce a demo_jsp.java en el primer paso.

Veamos un ejemplo de “demo.jsp”, como se muestra a continuación:

Demostración.jsp

<html>
<head>
<title>Demo JSP</title>
</head>
<%
int demvar=0;%>
<body>
Count is:
<% Out.println(demovar++); %>
<body>
</html>

Nota sobre el listado anterior: Se reproduce exactamente como se publicó para que coincida con la captura de pantalla del servlet generado que sigue. Dos errores ortográficos no compilarán si se copian textualmente: la variable se declara como demvar pero impreso como demovary el objeto de salida implícito es out en minúsculas, no OutCorrige ambos errores antes de ejecutar la página tú mismo.

Code Explicación de Demo.jsp

Code Línea 1: etiqueta de inicio html

Code Línea 2: Etiqueta de cabecera

Code Líneas 3-4: Etiqueta de título, por ejemplo Demo JSP, y etiqueta de cierre de encabezado.

Code Líneas 5-6: Etiqueta de scriptlet donde se inicializa la variable demo.

Code Líneas 7-8: En la etiqueta body, un texto que se imprimirá en la salida (Count es: )

Code Línea 9: Etiqueta Scriptlet donde intentamos imprimir la variable demovar con su valor incrementado.

Code Líneas 10-11: Se cierran las etiquetas Body y HTML.

La página JSP de demostración se convierte en el servlet demo_jsp que se muestra en el código a continuación.

Se generó el código fuente del servlet demo_jsp.java a partir de demo.jsp durante la traducción.

Code Explicación para Demo_jsp.java

Code Línea 1: La clase servlet demo_jsp extiende la clase padre HttpServlet.

Code Líneas 2-3: Sobrescribiendo el método de servicio de la JSP, es decir, _jspService, que tiene como parámetros los objetos HttpServletRequest y HttpServletResponse.

Code Línea 4: Método de apertura

Code Línea 5: Llamando al método getWriter() del objeto de respuesta para obtener una impresiónWriter objeto (imprime una representación formateada de los objetos en un flujo de salida de texto)

Code Línea 6: Llamada al método setContentType del objeto de respuesta para establecer el tipo de contenido.

Code Línea 7: Usando el método write() de PrintWriter objeto para analizar html

Code Línea 8: Inicializando la variable demovar a 0

Code Línea 9: Llamando al método write() de PrintWriter objeto para analizar el texto

Code Línea 10: Llamada al método print() de la función PrintWriter objeto para incrementar la variable demovar de 0 + 1 = 1. Por lo tanto, la salida será 1.

Code Línea 11: Usando el método write() de PrintWriter objeto para analizar html

Salida:

A continuación, el navegador muestra el contador, tal y como se puede ver en la captura de pantalla que aparece más abajo.

Salida del navegador de demo.jsp que imprime Count is: 1

  • Aquí puedes ver que en la captura de pantalla la salida es 1, porque demvar se inicializa a 0 y luego se incrementa a 0 + 1 = 1.

En el ejemplo anterior,

  • demo.jsp es una página JSP donde se inicializa e incrementa una variable. Esta página JSP se convierte en un servlet (demo_jsp.class), donde el motor JSP carga la página y la convierte en contenido de servlet.
  • Cuando se produce la conversión, todo el texto de la plantilla se convierte en instrucciones println() y todos los elementos JSP se convierten en Java código.

Así es como se traduce una página JSP simple en una clase de servlet.

2) Compilación de la página JSP

  • El generado Java El archivo servlet se compila en un Java clase servlet
  • La traducción de la Java La conversión de la página de origen a su clase de implementación puede ocurrir en cualquier momento entre el despliegue de la página JSP en el contenedor y el procesamiento de la página JSP.
  • En la descripción gráfica anterior, demo_jsp.java se compila en un archivo de clase llamado demo_jsp.class.
  • En Apache Tomcat ambos artefactos se escriben en el directorio de trabajo del servidor, en work/Catalina/localhost/<app>/org/apache/jsp, que es el primer lugar donde buscar cuando hay que diagnosticar un error de traducción

3) Carga de clases

  • La clase servlet que se ha generado a partir del código fuente JSP ahora se carga en el contenedor.

4) Creación de instancias

  • En este paso se genera el objeto, es decir, la instancia de la clase.
  • El contenedor gestiona una o más instancias de esta clase en respuesta a solicitudes y otros eventos. Normalmente, un contenedor JSP se construye utilizando un contenedor de servlets. Un contenedor JSP es una extensión de un contenedor de servlets, ya que ambos admiten JSP y servlets.
  • La interfaz JspPage, proporcionada por el contenedor, declara los métodos jspInit() y jspDestroy().
  • Existe una interfaz HttpJspPage que gestiona las solicitudes HTTP y que también contiene el método de servicio. Su firma depende del protocolo, por lo que el contenedor genera dicho método en lugar de solicitar al autor de la página que lo declare.

5) Inicialización

public void jspInit()
{
	//initializing the code
}
  • El método jspInit() inicializa la instancia del servlet que se generó a partir del JSP y es invocado por el contenedor en esta fase.
  • Una vez creada la instancia, el método init se invoca inmediatamente después.
  • Se llama solo una vez durante el ciclo de vida de una JSP, y el método para la inicialización se declara como se muestra arriba.

6) Procesamiento de solicitudes

void _jspservice(HttpServletRequest request HttpServletResponse response)
{
	//handling all request and responses
}
  • El método _jspService() es invocado por el contenedor para todas las solicitudes generadas por la página JSP durante su ciclo de vida.
  • Para esta fase, la página debe pasar por todas las fases anteriores, y solo entonces se podrá invocar el método de servicio.
  • Pasa los objetos de solicitud y respuesta.
  • Este método no se puede sobrescribir, ya que el contenedor lo escribe durante la traducción.
  • El método se muestra arriba. Es responsable de gestionar todos los métodos HTTP, es decir, GET, POST y los demás.

7) Destruir

public void _jspdestroy()
{
            //all clean up code
}
  • El método jspDestroy() también es invocado por el contenedor.
  • Este método se llama cuando el contenedor decide que ya no necesita la instancia del servlet para atender las solicitudes.
  • Una vez realizada la llamada al método destroy, el servlet está listo para la recolección de basura.
  • Este es el final del ciclo de vida.
  • Podemos sobrescribir jspDestroy() cuando realizamos cualquier tarea de limpieza, como liberar conexiones a la base de datos o cerrar archivos abiertos.

Una nota importante a tener en cuenta: desde Jakarta EE 9 en adelante, estos tipos viven en el jakarta.servlet.jsp paquete en lugar de javax.servlet.jspPor lo tanto, las importaciones antiguas deben actualizarse cuando una aplicación se traslada a un servidor actual.

Preguntas Frecuentes

Tienen el mismo ciclo de vida después de la traducción. Un JSP agrega dos fases al principio, traducción y compilación, que convierten la página en un archivo fuente y una clase de servlet. Desde la carga de la clase en adelante, el servlettract se aplica sin cambios.

En el directorio de trabajo del servidor, en work/Catalina/localhost/ /org/apache/jsp. Tanto el código fuente .java generado como el archivo .class compilado terminan allí, por lo que home.jsp se convierte en home_jsp.java y home_jsp.class.

El contenedor lo genera a partir del cuerpo de la página durante la traducción. Su firma depende del protocolo de solicitud, por lo que la especificación lo excluye de la interfaz JspPage y prohíbe a los autores de la página declararlo ellos mismos.

El servlet generado ya implementa init() para almacenar su ServletConfig y luego llama a jspInit(). Los autores de las páginas sobrescriben jspInit() para que la configuración del contenedor nunca se omita, que es precisamente el riesgo que conlleva una sobrescritura manual de init().

La precompilación traduce y compila cada página en el momento de la compilación o el despliegue, en lugar de hacerlo en la primera solicitud. Elimina el retraso inicial, detecta los errores de traducción antes del lanzamiento y permite el despliegue sin un compilador en el servidor.

Sigue siendo compatible con Jakarta Server Pages. El cambio principal radica en el espacio de nombres del paquete: a partir de Jakarta EE 9, la API pasó de javax.servlet.jsp a jakarta.servlet.jsp, por lo que las importaciones antiguas deben reescribirse antes de ejecutarse en un servidor actual.

Los asistentes de IA leen la pila _jsp.java generada tracy mapean un error de compilación a la línea del scriptlet que lo causó, que es la parte más difícil de los errores de traducción. También marcan los scriptlets que pertenecen a un archivo de etiquetas o a un servlet.

Sí. Copilot genera scriptlets, bloques JSTL, manejo de formularios y clases de servlet coincidentes a partir de un comentario. RevVea la salida para el espacio de nombres del paquete jakarta y para los scriptlets que deberían ser lenguaje de expresiones, ya que las sugerencias a menudo siguen tutoriales más antiguos.

Resumir este post con: