Je roule du code J2EE qui adhère à Servlet 2.5 et je me demande quelles sont les principales différences entre 2.5 et 3. Les pointeurs vers les documents officiels de Sun et les expériences personnelles sont les plus appréciés.
Si je ne devais pas me préoccuper de 3 pour le moment, dites-le. Merci!
MISE À JOUR
À titre de mise à jour et pour être plus explicite, ce sont les principales différences entre les servlets 2.5 et 3 (je n'essaie pas d'être exhaustif, je ne fais que mentionner les parties les plus intéressantes):
Dans les servlets 2.5, pour déclarer une servlet avec un paramètre init, vous devez l'ajouter à 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>
Dans les servlets 3, web.xml est facultatif et vous pouvez utiliser des annotations au lieu de XML. Le même exemple:
@WebServlet(name="myServlet",
urlPatterns={"/path/to/my/servlet"},
initParams={@InitParam(name="configFile", value="config.xml")})
public class MyAwesomeServlet extends HttpServlet { ... }
Pour les filtres, vous devez l'ajouter dans web.xml dans les 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>
Équivalent en utilisant des annotations dans les servlets 3:
@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }
Pour un écouteur (dans ce cas un ServletContextListener), dans les servlets 2.5:
<listener>
<listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>
La même chose en utilisant des annotations:
@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }
Dans les servlets 3, un ServletContextListener
peut ajouter dynamiquement des servlets, des filtres et des écouteurs en utilisant les méthodes suivantes ajoutées à SevletContext
: addServlet()
, addFilter()
et addListener()
Exemple: disons qu'un conteneur de servlet a cinq threads dans son pool de threads et qu'il y a un processus long à exécuter par requête (comme une requête SQL complexe).
Avec les servlets 2.5, ce conteneur de servlets manquerait de threads disponibles s'il recevait cinq demandes en même temps et que les cinq threads disponibles commençaient à faire le processus, car les threads ne reviendraient pas avant service()
(ou doGet()
, doPost()
, etc.) est exécutée du début à la fin et renvoie une réponse.
Avec les servlets 3.0, ce processus de longue durée peut être délégué à un autre thread et terminer service()
avant d'envoyer la réponse (la réponse sera désormais envoyée par le dernier thread). De cette façon, le thread est libre de recevoir de nouvelles réponses.
Un exemple de prise en charge asynchrone:
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.
// ...
}
}
L'interface AsyncContext
dispose également de méthodes pour obtenir l'objet de demande, l'objet de réponse et ajouter des écouteurs pour les informer lorsqu'un processus est terminé.
Dans les servlets 3, l'interface HttpServletRequest
a été ajoutée à deux nouvelles méthodes: login(username, password)
et logout()
.
Pour plus de détails, jetez un œil à Java EE 6 API .
Servlet 3.0 n'est pas encore sorti, mais il semble qu'il soit très proche. Les modifications les plus importantes de la version 3.0 sont les suivantes: connectabilité, facilité de développement, servlet Async, sécurité. Il est impossible pour moi de dire si ces éléments sont importants pour vous.
Le plus important d'entre eux est probablement la prise en charge des servlets asynchrones. Voici n article qui décrit cela en détail. La spécification complète peut être téléchargée ici .
Comme Don l'a mentionné, les principaux domaines d'amélioration et d'ajouts sont les suivants:
Consultez la présentation Javaone 2008 " Java Servlet 3.0 API: Quoi de neuf et d'excitant " pour plus de détails.
Ce lien donnera suffisamment d'informations sur Servlet
Servlet 3 prend en charge l'annotation pour éliminer web.xml
@WebServlet
@WebServletContextListener
@ServletFilter
@InitParam