JSP-Lebenszyklus: Phasen & Diagramm erklärt

⚡ Intelligente Zusammenfassung

Der JSP-Lebenszyklus beschreibt, wie ein Container eine Seite in ein Servlet übersetzt, sie kompiliert, die Klasse lädt, eine Instanz erstellt, diese initialisiert, jede Anfrage über die generierte Service-Methode bedient und sie schließlich zerstört.

  • 🔄 Sieben Phasen: Übersetzung, Kompilierung, Laden von Klassen, Instanziierung, Initialisierung, Anfrageverarbeitung und Zerstörung erfolgen in dieser festgelegten Reihenfolge.
  • 📄 Übersetzung: Der Container validiert die Seite und schreibt anschließend eine Java Die Quelldatei demo.jsp wird also zu demo_jsp.java, bevor irgendetwas ausgeführt wird.
  • ⚙️ Zusammenstellung: Der generierte Quellcode wird zu demo_jsp.class kompiliert, das Tomcat zusammen mit der .java-Datei in seinem Arbeitsverzeichnis speichert.
  • 🚀 Drei Methoden: jspInit() bereitet die Seite einmalig vor, _jspService() beantwortet jede Anfrage und jspDestroy() gibt die Ressourcen am Ende frei.
  • 🚫 Eine Regel: _jspService() wird vom Container generiert und darf vom Seitenautor niemals geschrieben oder überschrieben werden.
  • 🗃️ Aufräumhaken: Das Überschreiben von jspDestroy() ist der richtige Weg, um Datenbankverbindungen zu schließen und geöffnete Dateien zu öffnen.

JSP-Lebenszyklusphasen von der Übersetzung bis zur Zerstörung

Was ist der JSP-Lebenszyklus?

JSP-Lebenszyklus Die Umwandlung einer JSP-Seite in ein Servlet wird als deren Übersetzung definiert, da eine JSP-Seite in ein Servlet konvertiert werden muss, bevor sie Serviceanfragen verarbeiten kann. Der Lebenszyklus beginnt mit der Erstellung der JSP-Seite und endet mit der Zerstörung der daraus generierten Servlet-Instanz.

Da es sich bei der generierten Klasse um ein gewöhnliches Servlet handelt, gilt alles, was Sie bereits über Servlets wissen.tracDas gilt weiterhin. Java Der vom Container generierte Code wird tatsächlich ausgeführt; die JSP-Datei ist lediglich der von Ihnen zu pflegende Quellcode.

Verschiedene Phasen des JSP-Lebenszyklus

Wenn der Browser eine JSP-Datei anfordert, prüft die JSP-Engine zunächst, ob die Seite kompiliert werden muss. Falls die JSP-Datei noch nie kompiliert wurde oder seit der letzten Kompilierung geändert wurde, kompiliert die JSP-Engine die Seite.

Der Kompilierungsprozess einer JSP-Seite umfasst drei Schritte:

  • Parsen von JSP
  • JSP in Servlet umwandeln
  • Kompilieren des Servlets

JSP-Lebenszyklusdiagramm

Der JSP-Lebenszyklus ist im folgenden Diagramm dargestellt, welches traces ist eine einzelne Seite von der Quelldatei bis hin zur Klasse, die der Container ausführt.

JSP-Lebenszyklusdiagramm mit Übersetzung, Kompilierung, Laden, Instanziierung, Initialisierung, Anfrageverarbeitung und Zerstörung

Die folgenden Schritte erläutern den Lebenszyklus von JSP:

  1. Übersetzung der JSP-Seite
  2. Kompilierung der JSP-Seite (Kompilierung der JSP-Seite in _jsp.java)
  3. Klassenladen (_jsp.java wird in die Klassendatei _jsp.class konvertiert)
  4. Instanziierung (ein Objekt des generierten Servlets wird erstellt)
  5. Initialisierung (die jspInit()-Methode wird vom Container aufgerufen)
  6. Anfrageverarbeitung (die Methode _jspService() wird vom Container aufgerufen)
  7. Zerstören (die Methode jspDestroy() wird vom Container aufgerufen)

Phasen des JSP-Lebenszyklus erklärt

Lassen Sie uns jeden der oben genannten Punkte genauer betrachten.

1) Übersetzung der JSP-Seite:

A Java Aus einer JSP-Quelldatei wird eine Servlet-Datei generiert. Dies ist der erste Schritt im JSP-Lebenszyklus. In der Übersetzungsphase prüft der Container die syntaktische Korrektheit der JSP-Seite und der zugehörigen Tag-Dateien.

  • Der JSP-Container interpretiert die Standarddirektiven und -aktionen sowie die benutzerdefinierten Aktionen, die auf Tag-Bibliotheken verweisen (sie sind alle Teil der JSP-Seite und werden im Abschnitt „…“ behandelt). JSP-Elemente Tutorial), das auf dieser JSP-Seite verwendet wird.
  • In der obigen bildlichen Darstellung wird demo.jsp im ersten Schritt in demo_jsp.java übersetzt.

Nehmen wir als Beispiel die Datei „demo.jsp“, wie unten dargestellt:

Demo.jsp

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

Anmerkung zum obigen Eintrag: Es wird exakt so wiedergegeben, wie es veröffentlicht wurde, damit es mit dem nachfolgenden generierten Servlet-Screenshot übereinstimmt. Zwei Rechtschreibfehler führen bei unveränderter Kopie zu einem Kompilierungsfehler – die Variable ist wie folgt deklariert: demvar aber gedruckt als demovarund das implizite Ausgabeobjekt ist out in Kleinbuchstaben, nicht OutKorrigieren Sie beides, bevor Sie die Seite selbst ausführen.

Code Erläuterung zu Demo.jsp

Code Zeile 1: HTML-Starttag

Code Zeile 2: Kopf-Etikett

Code Zeile 3–4: Titel-Tag, z. B. „Demo JSP“, und schließender Head-Tag

Code Zeile 5 – 6: Scriptlet-Tag, in dem die Variable demo initialisiert wird

Code Zeile 7 – 8: Im Body-Tag ein Text, der in der Ausgabe gedruckt werden soll (Anzahl ist: )

Code Zeile 9: Scriptlet-Tag, in dem wir versuchen, die Variable demovar mit ihrem inkrementierten Wert auszugeben.

Code Zeile 10 – 11: Body- und HTML-Tags geschlossen

Die Demo-JSP-Seite wird in das im folgenden Code gezeigte demo_jsp-Servlet umgewandelt.

Der generierte Servlet-Quellcode demo_jsp.java wurde während der Übersetzung aus demo.jsp erzeugt.

Code Erläuterung zu Demo_jsp.java

Code Zeile 1: Die Servlet-Klasse demo_jsp erweitert die Elternklasse HttpServlet.

Code Zeile 2–3: Überschreiben der Service-Methode der JSP, d. h. _jspService, die HttpServletRequest- und HttpServletResponse-Objekte als Parameter hat.

Code Zeile 4: Öffnungsmethode

Code Zeile 5: Aufruf der Methode getWriter() des Antwortobjekts, um eine Ausgabe zu erhaltenWriter Objekt (gibt eine formatierte Darstellung von Objekten in einem Textausgabestrom aus)

Code Zeile 6: Aufruf der setContentType-Methode des Antwortobjekts zum Festlegen des Inhaltstyps

Code Zeile 7: Verwendung der write()-Methode der Print-KlasseWriter Objekt zum Parsen von HTML

Code Zeile 8: Initialisierung der Demovar-Variablen mit 0

Code Zeile 9: Aufruf der write()-Methode der Print-KlasseWriter Objekt zum Parsen des Textes

Code Zeile 10: Aufruf der print()-Methode der Print-KlasseWriter Das Objekt erhöht die Variable demovar von 0 + 1 = 1. Daher ist die Ausgabe 1.

Code Zeile 11: Verwendung der write()-Methode der Print-KlasseWriter Objekt zum Parsen von HTML

Ausgang:

Anschließend wird im Browser der Zähler angezeigt, wie der untenstehende Screenshot zeigt.

Browserausgabe von demo.jsp: Anzahl ist: 1

  • Hier sieht man im Screenshot, dass die Ausgabe 1 ist, da demvar mit 0 initialisiert und dann auf 0 + 1 = 1 inkrementiert wird.

Im obigen Beispiel ist

  • demo.jsp ist eine JSP-Seite, in der eine Variable initialisiert und inkrementiert wird. Diese JSP-Seite wird in ein Servlet (demo_jsp.class) umgewandelt, wobei die JSP-Engine die JSP-Seite lädt und in Servlet-Inhalt umwandelt.
  • Bei der Konvertierung wird der gesamte Vorlagentext in println()-Anweisungen umgewandelt und alle JSP-Elemente werden in … konvertiert. Java Code.

So wird eine einfache JSP-Seite in eine Servlet-Klasse übersetzt.

2) Kompilierung der JSP-Seite

  • Das erzeugte Java Die Servlet-Datei wird kompiliert in eine Java Servlet-Klasse
  • Die Übersetzung der Java Die Übergabe der Quellseite an ihre Implementierungsklasse kann jederzeit zwischen dem Deployment der JSP-Seite im Container und der Verarbeitung der JSP-Seite erfolgen.
  • In der obigen bildlichen Darstellung wird demo_jsp.java in eine Klassendatei demo_jsp.class kompiliert.
  • Auf Apache Tomcat werden beide Artefakte im Arbeitsverzeichnis des Servers geschrieben. work/Catalina/localhost/<app>/org/apache/jspDas ist der erste Ort, an dem man nachsehen sollte, wenn ein Übersetzungsfehler diagnostiziert werden muss.

3) Klassenladen

  • Die aus dem JSP-Quellcode generierte Servlet-Klasse wird nun in den Container geladen.

4) Instanziierung

  • In diesem Schritt wird das Objekt, also die Instanz der Klasse, erzeugt.
  • Der Container verwaltet eine oder mehrere Instanzen dieser Klasse als Reaktion auf Anfragen und andere Ereignisse. Typischerweise wird ein JSP-Container mithilfe eines Servlet-Containers erstellt. Ein JSP-Container ist eine Erweiterung eines Servlet-Containers, da beide Container JSP und Servlets unterstützen.
  • Die vom Container bereitgestellte JspPage-Schnittstelle deklariert die Methoden jspInit() und jspDestroy().
  • Es gibt eine Schnittstelle namens `HttpJspPage`, die HTTP-Anfragen verarbeitet und die zugehörige Service-Methode enthält. Ihre Signatur hängt vom Protokoll ab, weshalb der Container diese Methode generiert, anstatt den Seitenautor zur Deklaration aufzufordern.

5) Initialisierung

public void jspInit()
{
	//initializing the code
}
  • Die Methode jspInit() initialisiert die aus der JSP generierte Servlet-Instanz und wird in dieser Phase vom Container aufgerufen.
  • Sobald die Instanz erstellt ist, wird unmittelbar danach die init-Methode aufgerufen.
  • Sie wird nur einmal während des Lebenszyklus einer JSP aufgerufen, und die Initialisierungsmethode wird wie oben gezeigt deklariert.

6) Anfragebearbeitung

void _jspservice(HttpServletRequest request HttpServletResponse response)
{
	//handling all request and responses
}
  • Die Methode _jspService() wird vom Container für alle Anfragen aufgerufen, die von der JSP-Seite während ihres Lebenszyklus ausgelöst werden.
  • Für diese Phase muss die Seite alle oben genannten Phasen durchlaufen, erst dann kann die Servicemethode aufgerufen werden.
  • Es übergibt die Anfrage- und Antwortobjekte.
  • Diese Methode kann nicht überschrieben werden, da sie vom Container während der Übersetzung geschrieben wird.
  • Die Methode ist oben dargestellt. Sie ist für die Verarbeitung aller HTTP-Methoden zuständig, d. h. GET, POST und alle anderen.

7) Zerstören

public void _jspdestroy()
{
            //all clean up code
}
  • Die Methode jspDestroy() wird ebenfalls vom Container aufgerufen.
  • Diese Methode wird aufgerufen, wenn der Container entscheidet, dass er die Servlet-Instanz nicht mehr zur Bearbeitung von Anfragen benötigt.
  • Sobald die destroy-Methode aufgerufen wurde, ist das Servlet bereit für die Garbage Collection.
  • Dies ist das Ende des Lebenszyklus.
  • Wir können jspDestroy() überschreiben, wenn wir Aufräumarbeiten durchführen, wie z. B. das Freigeben von Datenbankverbindungen oder das Schließen geöffneter Dateien.

Eine Anmerkung zur Namensgebung, die es wert ist, beibehalten zu werden: Ab Jakarta EE 9 leben diese Typen in der jakarta.servlet.jsp Paket statt javax.servlet.jspÄltere Importe müssen daher aktualisiert werden, wenn eine Anwendung auf einen aktuellen Server verschoben wird.

Häufig gestellte Fragen

Nach der Übersetzung durchlaufen sie denselben Lebenszyklus. Eine JSP-Datei fügt zwei Phasen hinzu: Übersetzung und Kompilierung. Dadurch wird die Seite in eine Servlet-Quelldatei und eine Klasse umgewandelt. Ab dem Laden der Klasse läuft das Servlet.tract gilt unverändert.

Im Arbeitsverzeichnis des Servers, in work/Catalina/localhost/ /org/apache/jsp. Sowohl der generierte .java-Quellcode als auch die kompilierte .class-Datei landen dort, sodass home.jsp zu home_jsp.java und home_jsp.class wird.

Der Container generiert die Signatur während der Übersetzung aus dem Seiteninhalt. Da ihre Signatur vom Anfrageprotokoll abhängt, ist sie in der Spezifikation nicht in der JspPage-Schnittstelle enthalten und es ist Seitenautoren untersagt, sie selbst zu deklarieren.

Das generierte Servlet implementiert bereits `init()`, um seine Servlet-Konfiguration zu speichern, und ruft anschließend `jspInit()` auf. Seitenautoren überschreiben `jspInit()`, damit die Container-Einrichtung niemals übersprungen wird – genau das ist das Risiko einer manuellen Überschreibung von `init()`.

Die Vorkompilierung übersetzt und kompiliert jede Seite zur Build- oder Deployment-Zeit anstatt erst beim ersten Aufruf. Dadurch entfällt die Verzögerung beim ersten Zugriff, Übersetzungsfehler werden vor der Veröffentlichung sichtbar, und die Bereitstellung ist ohne Compiler auf dem Server möglich.

Es wird weiterhin als Jakarta Server Pages unterstützt. Die wichtigste Änderung betrifft den Paket-Namensraum: Ab Jakarta EE 9 wurde die API von javax.servlet.jsp nach jakarta.servlet.jsp verschoben, daher müssen ältere Importe vor der Ausführung auf einem aktuellen Server neu geschrieben werden.

KI-Assistenten lesen den generierten _jsp.java-Stack. tracSie ordnen einen Kompilierungsfehler der fehlerhaften Scriptlet-Zeile zu, was den schwierigsten Teil der Fehlersuche bei Übersetzungsfehlern darstellt. Außerdem kennzeichnen sie Scriptlets, die in eine Tag-Datei oder ein Servlet gehören.

Ja. Copilot generiert aus einem Kommentar Scriptlets, JSTL-Blöcke, Formularverarbeitung und passende Servlet-Klassen. RevSehen Sie sich die Ausgabe für den Jakarta-Paket-Namensraum und für Skripte an, die die Ausdruckssprache verwenden sollten, da die Vorschläge oft älteren Tutorials folgen.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: