Was sind die Unterschiede zwischen Servlet 2.5 und 3?

91

Ich verwende J2EE-Code, der Servlet 2.5 entspricht, und frage mich, was die Hauptunterschiede zwischen 2.5 und 3 sind. Hinweise auf offizielle Sun-Dokumente und persönliche Erfahrungen werden am meisten geschätzt.

Wenn ich mich vorerst nicht mit 3 beschäftigen sollte, sag es einfach. Vielen Dank!

Max A.
quelle
2
+1
Ich

Antworten:

149

AKTUALISIEREN

Nur als Update und um genauer zu sein, 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)

Um in Servlets 2.5 ein Servlet mit einem Init-Parameter zu deklarieren, müssen Sie dies zu web.xml hinzufügen :

<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 ist web.xml optional und Sie können Anmerkungen anstelle von XML verwenden. Das gleiche 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 in web.xml in Servlets 2.5 hinzufügen :

<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>

Äquivalent unter 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 einen 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 eine monolithische web.xml- Datei.
  • In Servlets 3 kann jedes "ladbare" JAR eine web-fragment.xml in seinem META-INF- Verzeichnis haben, die Servlets, Filter usw. angibt. Auf diese Weise können Bibliotheken und Frameworks ihre eigenen Servlets oder andere Objekte angeben.

Dynamische Registrierung von Servlets, Filtern und Listenern zur Kontextinitialisierungszeit (Pluggability)

In Servlets 3, ein ServletContextListenerhinzufügen kann dynamisch Servlets, Filter und Zuhörer mit den folgenden Methoden hinzugefügt SevletContext: addServlet(), addFilter()undaddListener()

Asynchrone Unterstützung

Beispiel: Angenommen, ein Servlet-Container hat fünf Threads in seinem Thread-Pool, und pro Anforderung muss ein zeitaufwändiger Prozess ausgeführt werden (wie bei einer komplexen SQL-Abfrage).

  • Mit Servlets 2.5 diese Servlet - Containern laufen würden aus verfügbaren Threads , wenn es zur gleichen Zeit fünf Anfragen erhält und die fünf verfügbar Threads starten Sie den Prozess zu tun, weil die Fäden bis nicht zurückkehren würden service()(oder doGet(), doPost()usw.) wird von Anfang ausgeführt zu beenden und gibt eine Antwort zurück.

  • Mit Servlets 3.0 kann dieser Langzeitprozess an einen anderen Thread delegiert und service()vor dem Senden der Antwort beendet werden (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 AsyncContextverfügt auch über Methoden zum Abrufen des Anforderungsobjekts und des Antwortobjekts sowie zum Hinzufügen von Listenern, um sie zu benachrichtigen, wenn ein Prozess abgeschlossen ist.

Programmatisches An- und Abmelden (Sicherheitsverbesserungen)

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

Weitere Informationen finden Sie in der Java EE 6-API .

Morgano
quelle
3
Es ist erwähnenswert, dass Servlet 3.0 bereits im Dezember 2009 veröffentlicht wurde. Die Frage und die aktuell akzeptierte Antwort sind älter als diese.
Eis
1
@ServletFilter@WebFilterund @WebServletContextListener@WebListenerin offiziellen Spezifikationen AFAICT.
Lapo
21

Servlet 3.0 wurde noch nicht veröffentlicht, aber es sieht so aus, als ob es sehr nahe ist. Die wichtigsten Änderungen in 3.0 sind: Steckbarkeit, einfache Entwicklung, asynchrones Servlet, Sicherheit. Ob diese für Sie wichtig sind oder nicht, kann ich nicht sagen.

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

Dónal
quelle
Heiliger Mist, das ist großartig. Das asynchrone Zeug sieht fantastisch aus, danke für die Info. Ich habe gerade etwas sehr Ähnliches programmiert.
Max A.
@adi es wurde im Dezember 2009 veröffentlicht ( jcp.org/aboutJava/communityprocess/final/jsr315 )
Mauhiz
4
UPDATE Servlet 3.1-Spezifikation veröffentlicht 2013-05. Sehen Sie, was es Neues gibt .
Basil Bourque
13

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

  • Steckbarkeit (Modularisierung von web.xml)
  • Einfache Entwicklung (Anmerkungen, Generika, Konvention über Konfiguration)
  • Unterstützung für asynchrone Servlets (für die Programmierung im Kometenstil, asynchroner Webproxy, asynchrone Webdienste)
  • Sicherheitsverbesserungen (programmatische Anmeldung / Abmeldung)
  • Andere (HttpOnly Cookie, Sitzungsverfolgung, EJB in WAR-Datei)

Weitere Informationen finden Sie in der Javaone 2008-Präsentation " Java Servlet 3.0 API: Was ist neu und aufregend? ".

Pascal Thivent
quelle