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!
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.
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.
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
+1 Ich warte nur auf Antworten 🙂
– Atorras
28. Oktober 2009 um 17:41 Uhr