web-dev-qa-db-fra.com

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

89
Max A.

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

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

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 { ... }

Modularisation de web.xml (Pluggability)

  • Dans les servlets 2.5, il n'y a qu'un seul fichier monolithique web.xml .
  • Dans les servlets 3, chaque pot "chargeable" peut avoir un web-fragment.xml dans son META-INF répertoire spécifiant les servlets, filtres, etc. Ceci permet aux bibliothèques et frameworks de spécifier leurs propres servlets ou autres objets.

Enregistrement dynamique des servlets, filtres et écouteurs au moment de l'initialisation du contexte (Pluggability)

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

Prise en charge asynchrone

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

Connexion et déconnexion programmatiques (améliorations de la sécurité)

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 .

144
morgano

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 .

21
Dónal

Comme Don l'a mentionné, les principaux domaines d'amélioration 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 Async (pour la programmation de style comète, proxy Web async, services Web async)
  • Améliorations de la sécurité (connexion/déconnexion programmatique)
  • Autres (cookie HttpOnly, suivi de session, EJB dans le fichier WAR)

Consultez la présentation Javaone 2008 " Java Servlet 3.0 API: Quoi de neuf et d'excitant " pour plus de détails.

13
Pascal Thivent

Ce lien donnera suffisamment d'informations sur Servlet

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

@WebServlet
@WebServletContextListener
@ServletFilter
@InitParam
1
Ravi Parekh