Jakarta-Servlet - Jakarta Servlet

Jakarta-Servlet
Originalautor(en) Pavni Diwanji
Entwickler Eclipse-Stiftung
Erstveröffentlichung Dezember 1996 ; Vor 24 Jahren ( 1996-12 )
Stabile Version
5.0 / 7. September 2020 ; vor 10 Monaten ( 2020-09-07 )
Repository Bearbeite dies bei Wikidata
Geschrieben in Java
Plattform Jakarta EE 9
Größe 2,56 MB
Typ Softwarekomponente für Web-API
Lizenz Öffentliche Eclipse-Lizenz
Webseite jakarta .ee /spezifikationen / servlet /5 .0 /
Lebensdauer einer JSP- Datei

Ein Jakarta Servlet (ehemals Java Servlet) ist eine Java- Softwarekomponente , die die Fähigkeiten eines Servers erweitert . Obwohl Servlets auf viele Arten von Anforderungen antworten können, implementieren sie am häufigsten Webcontainer zum Hosten von Webanwendungen auf Webservern und qualifizieren sich daher als serverseitige Servlet- Web-API . Solche Web-Servlets sind das Java- Gegenstück zu anderen dynamischen Webinhaltstechnologien wie PHP und ASP.NET .

Einführung

Ein Jakarta-Servlet verarbeitet oder speichert eine Java-Klasse in Jakarta EE , die der Jakarta-Servlet-API entspricht, einem Standard zum Implementieren von Java-Klassen, die auf Anforderungen antworten. Servlets könnten im Prinzip über jedes Client-Server- Protokoll kommunizieren , werden jedoch am häufigsten mit HTTP verwendet . Daher wird "Servlet" oft als Abkürzung für "HTTP-Servlet" verwendet. Somit kann ein Softwareentwickler ein Servlet verwenden, um einem Webserver unter Verwendung der Java-Plattform dynamischen Inhalt hinzuzufügen . Der generierte Inhalt ist normalerweise HTML , kann aber auch andere Daten wie XML und häufiger JSON sein. Servlets können den Status in Sitzungsvariablen über viele Servertransaktionen hinweg beibehalten , indem sie HTTP-Cookies oder URL-Mapping verwenden .

Die Jakarta Servlet API wurde teilweise durch zwei Standard-Java-Technologien für Webservices ersetzt:

Zu implementieren und ein Servlet ausführen, wird ein Web - Container verwendet werden. Ein Webcontainer (auch Servlet-Container genannt) ist im Wesentlichen die Komponente eines Webservers, die mit den Servlets interagiert. Der Web-Container ist dafür verantwortlich, den Lebenszyklus von Servlets zu verwalten, eine URL einem bestimmten Servlet zuzuordnen und sicherzustellen, dass der URL-Anforderer die richtigen Zugriffsrechte hat.

Das Servlet API , in der enthaltenen Java - Paket - Hierarchie javax.servlet, definiert die erwarteten Interaktionen des Web - Containers und ein Servlet.

A Servletist ein Objekt , das eine Anfrage empfängt und basierend auf dieser Anfrage eine Antwort generiert. Das grundlegende Servlet-Paket definiert Java-Objekte, um Servlet-Anforderungen und -Antworten darzustellen, sowie Objekte, die die Konfigurationsparameter und die Ausführungsumgebung des Servlets widerspiegeln. Das Paket javax.servlet.httpdefiniert HTTP- spezifische Unterklassen der generischen Servlet-Elemente, einschließlich Sitzungsverwaltungsobjekten, die mehrere Anforderungen und Antworten zwischen dem Webserver und einem Client verfolgen. Servlets können als Webanwendung in eine WAR-Datei gepackt werden .

Servlets können vom Jakarta Server Pages-Compiler automatisch aus Jakarta Server Pages (JSP) generiert werden . Der Unterschied zwischen Servlets und JSP besteht darin, dass Servlets normalerweise HTML in Java-Code einbetten, während JSPs Java-Code in HTML einbetten. Während die direkte Verwendung von Servlets zum Generieren von HTML (wie im Beispiel unten gezeigt) selten geworden ist, verwendet das übergeordnete MVC-Webframework in Jakarta EE ( JSF ) immer noch explizit die Servlet-Technologie für die Low-Level-Request/Response-Behandlung über die . Eine etwas ältere Verwendung ist die Verwendung von Servlets in Verbindung mit JSPs in einem Muster namens " Model 2 ", das eine Variante des Model-View-Controllers ist . FacesServlet

Die aktuelle Servlet-Version ist 5.0.

Geschichte

Die Java Servlet API wurde erstmals auf der ersten JavaOne- Konferenz im Mai 1996 öffentlich angekündigt . Etwa zwei Monate nach den Ankündigungen auf der Konferenz wurde die erste öffentliche Implementierung auf der JavaSoft-Website zur Verfügung gestellt. Dies war die erste Alpha des Java Web Server (JWS; damals bekannt unter seinem Codenamen Jeeves ), die schließlich am 5. Juni 1997 als Produkt ausgeliefert werden sollte.

In seinem Blog auf java.net beschreibt der Sun-Veteran und GlassFish-Leiter Jim Driscoll die Geschichte der Servlet-Technologie. James Gosling dachte zuerst an Servlets in den frühen Tagen von Java , aber das Konzept wurde erst im Dezember 1996 zu einem Produkt, als Sun JWS auslieferte. Dies war, bevor das, was heute der Jakarta EE ist , in eine Spezifikation umgewandelt wurde.

Die Servlet1-Spezifikation wurde von Pavni Diwanji während ihrer Arbeit bei Sun Microsystems erstellt und die Version 1.0 im Juni 1997 fertiggestellt. Ab Version 2.2 wurde die Spezifikation im Rahmen des Java Community Process entwickelt .

Servlet-API-Verlauf
Servlet-API-Version Freigegeben Spezifikation Plattform Wichtige Änderungen
Jakarta-Servlet 5.0.0 M1 12. Juni 2020 5.0 Jakarta EE 9 API vom Paket javax.servletnach . verschobenjakarta.servlet
Jakarta-Servlet 4.0.3 13. August 2019 4.0 Jakarta EE 8 Umbenannt von der Marke "Java"
Java-Servlet 4.0 September 2017 JSR 369 Java EE 8 HTTP/2
Java-Servlet 3.1 Mai 2013 JSR 340 Java EE 7 Nicht blockierende E/A, HTTP-Protokoll-Upgrade-Mechanismus ( WebSocket )
Java-Servlet 3.0 Dezember 2009 JSR 315 Java EE 6, Java SE 6 Pluggability, einfache Entwicklung, Async-Servlet, Sicherheit, Datei-Upload
Java-Servlet 2.5 September 2005 JSR 154 Java EE 5, Java SE 5 Erfordert Java SE 5, unterstützt Annotation
Java-Servlet 2.4 November 2003 JSR 154 J2EE 1.4, J2SE 1.3 web.xml verwendet XML-Schema
Java-Servlet 2.3 August 2001 JSR 53 J2EE 1.3, J2SE 1.2 Zugabe von Filter
Java-Servlet 2.2 August 1999 JSR 902 , JSR 903 J2EE 1.2, J2SE 1.2 Wird Teil von J2EE, führt unabhängige Webanwendungen in .war-Dateien ein
Java-Servlet 2.1 November 1998 2.1a Nicht spezifiziert Erste offizielle Spezifikation, hinzugefügt RequestDispatcher,ServletContext
Java-Servlet 2.0 Dezember 1997 N / A JDK 1.1 Teil von April 1998 Java Servlet Development Kit 2.0
Java-Servlet 1.0 Dezember 1996 N / A Teil von Juni 1997 Java Servlet Development Kit (JSDK) 1.0

Lebenszyklus eines Servlets

Drei Methoden sind für den Lebenszyklus eines Servlets von zentraler Bedeutung. Dies sind init(), service(), und destroy(). Sie werden von jedem Servlet implementiert und zu bestimmten Zeiten vom Server aufgerufen.

  • Während der Initialisierungsphase des Servlet- Lebenszyklus initialisiert der Web-Container die Servlet-Instanz, indem er die init()Methode aufruft und ein Objekt übergibt, das die javax.servlet.ServletConfigSchnittstelle implementiert . Dieses Konfigurationsobjekt ermöglicht dem Servlet den Zugriff auf Name-Wert- Initialisierungsparameter von der Webanwendung.
  • Nach der Initialisierung kann die Servlet-Instanz Client-Anfragen bedienen. Jede Anfrage wird in einem eigenen separaten Thread bedient. Der Webcontainer ruft service()bei jeder Anfrage die Methode des Servlets auf. Die service()Methode bestimmt die Art der gestellten Anfrage und leitet sie an eine geeignete Methode weiter, um die Anfrage zu bearbeiten. Der Entwickler des Servlets muss eine Implementierung für diese Methoden bereitstellen. Wenn eine Methode angefordert wird, die nicht vom Servlet implementiert ist, wird die Methode der Elternklasse aufgerufen, was normalerweise dazu führt, dass ein Fehler an den Anforderer zurückgegeben wird.
  • Schließlich ruft der Webcontainer die destroy()Methode auf, die das Servlet außer Betrieb nimmt. Die destroy()Methode, wie init(), wird nur einmal im Lebenszyklus eines Servlets aufgerufen.

Das Folgende ist ein typisches Benutzerszenario dieser Methoden.

  1. Angenommen, ein Benutzer möchte eine URL besuchen .
    • Der Browser generiert dann eine HTTP-Anfrage für diese URL.
    • Diese Anfrage wird dann an den entsprechenden Server gesendet.
  2. Die HTTP-Anfrage wird vom Webserver empfangen und an den Servlet-Container weitergeleitet.
    • Der Container ordnet diese Anfrage einem bestimmten Servlet zu.
    • Das Servlet wird dynamisch abgerufen und in den Adressraum des Containers geladen.
  3. Der Container ruft die init()Methode des Servlets auf.
    • Diese Methode wird nur aufgerufen, wenn das Servlet zum ersten Mal in den Speicher geladen wird.
    • Es ist möglich, Initialisierungsparameter an das Servlet zu übergeben, damit es sich selbst konfigurieren kann.
  4. Der Container ruft die service()Methode des Servlets auf.
    • Diese Methode wird aufgerufen, um die HTTP-Anforderung zu verarbeiten.
    • Das Servlet kann Daten lesen, die in der HTTP-Anforderung bereitgestellt wurden.
    • Das Servlet kann auch eine HTTP-Antwort für den Client formulieren.
  5. Das Servlet verbleibt im Adressraum des Containers und steht für die Verarbeitung aller anderen von Clients empfangenen HTTP-Anforderungen zur Verfügung.
    • Die service()Methode wird für jede HTTP-Anfrage aufgerufen.
  6. Der Container kann irgendwann entscheiden, das Servlet aus seinem Speicher zu entladen.
    • Die Algorithmen, mit denen diese Entscheidung getroffen wird, sind für jeden Container spezifisch.
  7. Der Container ruft die destroy()Methode des Servlets auf , um alle Ressourcen freizugeben, wie z. B. Datei-Handles, die dem Servlet zugewiesen sind; wichtige Daten können in einem persistenten Speicher gespeichert werden.
  8. Der für das Servlet und seine Objekte zugewiesene Speicher kann dann durch die Garbage Collection erfasst werden.

Beispiel

Das folgende Beispiel-Servlet gibt aus, wie oft seine service()Methode aufgerufen wurde.

Beachten Sie, dass dies HttpServleteine Unterklasse von ist GenericServlet, eine Implementierung der ServletSchnittstelle.

Die service()Methode der HttpServletKlasse sendet Anfragen an die Methoden doGet(), doPost(), doPut(), doDelete()usw.; entsprechend der HTTP-Anfrage. Im folgenden Beispiel service()wird es überschrieben und unterscheidet nicht, welche HTTP-Anforderungsmethode es bedient.

import java.io.IOException;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class ServletLifeCycleExample extends HttpServlet {
    private Integer sharedCounter;

    @Override
    public void init(final ServletConfig config) throws ServletException {
        super.init(config);
        getServletContext().log("init() called");
        sharedCounter = 0;
    }

    @Override
    protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
        getServletContext().log("service() called");
        int localCounter;
        synchronized (sharedCounter) {
            sharedCounter++;
            localCounter = sharedCounter;
        }
        response.getWriter().write("Incrementing the count to " + localCounter);  // accessing a local variable
    }

    @Override
    public void destroy() {
        getServletContext().log("destroy() called");
    }
}

Container-Server

Die Spezifikation für die Servlet-Technologie ist in vielen Produkten implementiert. Eine Liste der Implementierungen finden Sie auf der Webcontainerseite .

Verweise

Externe Links