Quelles sont les différences entre Servlet 2.5 et 3?

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 docs 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, dis-le simplement. Merci!

METTRE À JOUR

Juste comme une mise à jour et pour être plus explicite, ce sont les principales différences entre les servlets 2.5 et 3 (je ne cherche pas à être exhaustif, je ne fais que mentionner les parties les plus intéressantes):

Annotations pour déclarer les servlets, les filtres et les écouteurs (facilité de développement)

Dans les servlets 2.5, pour déclarer un servlet avec un paramètre init, vous devez l’append à web.xml :

 myServlet my.server.side.stuff.MyAwesomeServlet  configFile config.xml    myServlet /path/to/my/servlet  

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 append ceci dans web.xml dans les servlets 2.5:

  myFilter my.server.side.stuff.MyAwesomeServlet   myFilter /path/to/my/filter  

Equivalent à l’aide d’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:

  my.server.side.stuff.MyAwesomeListener  

La même chose en utilisant des annotations:

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

Modularisation de web.xml (Pluggability)

  • Dans les servlets 2.5, il n’y a qu’un seul fichier web.xml monolithique.
  • Dans les servlets 3, chaque fichier jar “loadable” peut avoir un fichier web-fragment.xml dans son répertoire META-INF , spécifiant des servlets, des filtres, etc. Cela permet aux bibliothèques et aux frameworks de spécifier leurs propres servlets ou autres objects.

Enregistrement dynamic des servlets, des filtres et des écouteurs au moment de l’initialisation du contexte (pluggability)

Dans les servlets 3, un ServletContextListener peut append dynamicment des servlets, des filtres et des écouteurs en utilisant les méthodes suivantes ajoutées à SevletContext : addServlet() , addFilter() et addListener()

Prise en charge asynchrone

Exemple: Dites qu’un conteneur de servlets contient cinq threads dans son pool de threads, et qu’un processus fastidieux doit être exécuté par requête (comme une requête SQL complexe).

  • Avec les servlets 2.5, ce conteneur de servlets serait à court de threads disponibles s’il reçoit cinq requêtes en même temps et que les cinq threads disponibles commencent à exécuter le processus, car les threads ne retourneraient pas avant que service() (ou doGet() , doPost() , etc.) est exécuté du début à la fin et renvoie une réponse.

  • Avec les servlets 3.0, ce processus à long terme peut être délégué à un autre thread et terminer le 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 également des méthodes pour obtenir l’object de requête, l’object de réponse et append des écouteurs pour les avertir lorsqu’un processus est terminé.

Ouverture de session programmatique et déconnexion (améliorations de la sécurité)

Dans les servlets 3, l’interface HttpServletRequest a été ajoutée avec deux nouvelles méthodes: login(username, password) et logout() .

Pour plus de détails, consultez l’ API Java EE 6 .

Servlet 3.0 n’a pas encore été publié, mais il semble que ce soit très proche. Les modifications les plus importantes de la version 3.0 sont les suivantes: Pluggability, Facilité de développement, Servlet Async, Sécurité. Il est impossible pour moi de dire si cela est important pour vous ou non.

Le plus important d’entre eux est probablement le support des Servlets asynchrones. Voici un 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éliorations et d’ajouts sont les suivants:

  • Pluggability (modularisation de web.xml)
  • Facilité de développement (annotations, génériques, convention sur la configuration)
  • Prise en charge des servlets asynchrones (pour la programmation de style comète, proxy Web asynchrone, services Web asynchrones)
  • Améliorations de la sécurité (connexion / déconnexion programmatique)
  • Autres (cookie HttpOnly, suivi de session, fichier EJB dans WAR)

Découvrez la présentation Javaone 2008 ” Java Servlet 3.0 API: Nouveautés et passionnantes ” pour plus de détails.

Ce lien donnera suffisamment d’informations sur Servlet 3

Servlet 3 prend en charge l’annotation pour éliminer web.xml

 @WebServlet @WebServletContextListener @ServletFilter @InitParam