Was sind die Unterschiede zwischen Servlet 2.5 und 3?

Lesezeit: 5 Minuten

Benutzer-Avatar
Max A.

Ich führe J2EE-Code aus, der Servlet 2.5 entspricht, und frage mich, was die Hauptunterschiede zwischen 2.5 und 3 sind. Verweise auf offizielle Dokumente von Sun und persönliche Erfahrungen sind sehr willkommen.

Wenn ich mich vorerst nicht um 3 kümmern sollte, sag es einfach. Vielen Dank!

  • +1 Ich warte nur auf Antworten 🙂

    – Atorras

    28. Oktober 2009 um 17:41 Uhr

Benutzer-Avatar
Morgano

AKTUALISIEREN

Nur als Update und um es deutlicher zu machen, dies sind die Hauptunterschiede zwischen Servlets 2.5 und 3 (ich versuche nicht, erschöpfend zu sein, ich erwähne nur die interessantesten Teile):

Anmerkungen zum Deklarieren von Servlets, Filtern und Listenern (einfache Entwicklung)

In Servlets 2.5 müssen Sie diesen hinzufügen, um ein Servlet mit einem Init-Parameter zu deklarieren web.xml:

<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>my.server.side.stuff.MyAwesomeServlet</servlet-class>
    <init-param>
        <param-name>configFile</param-name>
        <param-value>config.xml</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/path/to/my/servlet</url-pattern>
</servlet-mapping>

In Servlets 3, web.xml ist optional und Sie können Annotationen anstelle von XML verwenden. Dasselbe Beispiel:

@WebServlet(name="myServlet",
    urlPatterns={"/path/to/my/servlet"},
    initParams={@InitParam(name="configFile", value="config.xml")})
public class MyAwesomeServlet extends HttpServlet { ... }

Für Filter müssen Sie dies hinzufügen web.xml in Servlets 2.5:

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>my.server.side.stuff.MyAwesomeServlet</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/path/to/my/filter</url-pattern>
</filter-mapping>

Entspricht der Verwendung von Anmerkungen in Servlets 3:

@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }

Für einen Listener (in diesem Fall ein ServletContextListener) in Servlets 2.5:

<listener>
    <listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>

Das gleiche mit Anmerkungen:

@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }

Modularisierung von web.xml (Pluggability)

  • In Servlets 2.5 gibt es nur einen monolithischen web.xml Datei.
  • In Servlets 3 kann jedes “ladbare” Glas eine haben web-fragment.xml in seinem META-INF Verzeichnis, das Servlets, Filter usw. angibt. Dies soll es Bibliotheken und Frameworks ermöglichen, ihre eigenen Servlets oder andere Objekte anzugeben.

Dynamische Registrierung von Servlets, Filtern und Listenern zum Zeitpunkt der Kontextinitialisierung (Pluggability)

In Servlets 3, a ServletContextListener können dynamisch Servlets, Filter und Listener hinzufügen, indem die folgenden Methoden hinzugefügt werden SevletContext: addServlet(), addFilter() und addListener()

Asynchrone Unterstützung

Beispiel: Angenommen, ein Servlet-Container hat fünf Threads in seinem Thread-Pool und es gibt einen zeitaufwändigen Prozess, der pro Anfrage ausgeführt werden muss (wie eine komplexe SQL-Abfrage).

  • Mit Servlets 2.5 würden diesem Servlet-Container die verfügbaren Threads ausgehen, wenn er fünf Anfragen gleichzeitig erhält und die fünf verfügbaren Threads mit dem Prozess beginnen, da die Threads erst zurückkehren würden service() (oder doGet(), doPost()usw.) wird von Anfang bis Ende ausgeführt und gibt eine Antwort zurück.

  • Mit Servlets 3.0 kann dieser langwierige Prozess an einen anderen Thread delegiert und beendet werden service() vor dem Senden der Antwort (die Antwort wird jetzt vom neuesten Thread gesendet). Auf diese Weise kann der Thread neue Antworten erhalten.

Ein Beispiel für asynchrone Unterstützung:

Servlets 2.5:

public class MyAwesomeServlet extends HttpSerlvet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        // ...

        runSlowProcess();
        // no async support, thread will be free when runSlowProcess() and
        // doGet finish

        // ...
    }

}

Servlets 3:

@WebServlet(name="myServlet",
             urlPatterns={"/mySlowProcess"},
             asyncSupported=true) // asyncSupported MUST be specified for
                                  // servlets that support asynchronous
                                  // processing
public class MyAwesomeServlet extends HttpSerlvet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {


        // an AsyncContext is created, now the response will be completed
        // not when doGet finalizes its execution, but when
        // myAsyncContext.complete() is called.
        AsyncContext myAsyncContext = request.startAsync(request, response);

        // ...

        // myAsyncContext is passed to another thread
        delegateExecutionToProcessingThread(myAsyncContext);

        // done, now this thread is free to serve another request
    }

}

// ... and somewhere in another part of the code:

public class MyProcessingObject {

    public void doSlowProcess() {

        // ...

        runSlowProcess();
        myAsyncContext.complete(); // request is now completed.

        // ...

    }

}

Die Schnittstelle AsyncContext hat auch Methoden, um das Anforderungsobjekt und das Antwortobjekt abzurufen und Listener hinzuzufügen, um sie zu benachrichtigen, wenn ein Prozess beendet ist.

Programmatische Anmeldung und Abmeldung (Sicherheitsverbesserungen)

In Servlets 3 die Schnittstelle HttpServletRequest wurden zwei neue Methoden hinzugefügt: login(username, password) und logout().

Für weitere Details werfen Sie einen Blick auf die Java-EE-6-API.

  • Es ist erwähnenswert, dass Servlet 3.0 bereits im Dezember 2009 veröffentlicht wurde. Die Frage und die derzeit akzeptierte Antwort sind älter als diese.

    – eis

    12. August 2013 um 13:48 Uhr

  • @ServletFilter@WebFilter und @WebServletContextListener@WebListener in den offiziellen Spezifikationen AFAICT.

    – Lapo

    26. April 2018 um 10:31 Uhr

Servlet 3.0 wurde noch nicht veröffentlicht, aber es sieht so aus, als wäre es sehr nah dran. Die wichtigsten Änderungen in 3.0 sind: Pluggability, Ease of Development, Async Servlet, Security. Ob diese für Sie wichtig sind, kann ich nicht sagen.

Die bedeutendste davon ist wahrscheinlich die Unterstützung für asynchrone Servlets. Hier ist ein Artikel der das ausführlich beschreibt. Die vollständige Spezifikation kann heruntergeladen werden hier.

  • Heilige Scheiße, das ist großartig. Das async-Zeug sieht toll aus, danke für die Info. Ich habe gerade etwas sehr ähnliches codiert.

    – Maxi A.

    28. Oktober 2009 um 18:43 Uhr

  • @adi es wurde im Dezember 2009 veröffentlicht ( jcp.org/aboutJava/communityprocess/final/jsr315 )

    – mauhiz

    21. Januar 2014 um 2:53 Uhr

  • AKTUALISIEREN Servlet 3.1 spez erschienen 2013-05. Sehen Was gibt’s Neues.

    – Basilikum Bourque

    3. Januar 2015 um 1:45 Uhr

Benutzer-Avatar
Pascal Thivent

Wie Don erwähnte, sind die Hauptbereiche der Verbesserungen und Ergänzungen:

  • Pluggability (Modularisierung von web.xml)
  • Einfache Entwicklung (Anmerkungen, Generika, Konvention über Konfiguration)
  • Asynchrone Servlet-Unterstützung (für Programmierung im Comet-Stil, asynchroner Web-Proxy, asynchrone Webdienste)
  • Sicherheitsverbesserungen (programmatische Anmeldung/Abmeldung)
  • Andere (HttpOnly Cookie, Sitzungsverfolgung, EJB in WAR-Datei)

Sehen Sie sich die Javaone 2008-Präsentation an “Java Servlet 3.0 API: Was ist neu und aufregend” für Details.

Dieser Link enthält genügend Informationen zu Servlet 3

Servlet 3 unterstützt die zu entfernende Anmerkung web.xml

@WebServlet
@WebServletContextListener
@ServletFilter
@InitParam

1274670cookie-checkWas sind die Unterschiede zwischen Servlet 2.5 und 3?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy