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 ServletContextListener
hinzufü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 AsyncContext
verfü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 HttpServletRequest
zwei neue Methoden hinzugefügt: login(username, password)
und logout()
.
Weitere Informationen finden Sie in der Java EE 6-API .