Annotation @WebServlet avec Tomcat 7

Dans mon application, j’avais un servlet qui était défini comme ceci dans le fichier web.xml :

 Notification Servlet NotificationServlet com.XXX.servlet.NotificationServlet 1   NotificationServlet /notification/*  

Après avoir déménagé pour utiliser Tomcat 7, j’aimerais utiliser l’annotation @WebServlet qui fera le travail.
Voici comment je l’ai fait:

 @WebServlet( name="NotificationServlet", displayName="Notification Servlet", urlPatterns = {"/notification"}, loadOnStartup=1) public class NotificationServlet extends HttpServlet { 

Et ça ne marche pas. Quelqu’un pourrait-il me dire ce que j’ai fait de mal?

Si vous êtes sûr d’utiliser Tomcat 7 ou une version plus récente, web.xml doit être déclaré conforme à la spécification Servlet 3.0 pour que Tomcat puisse parsingr et traiter les annotations. Sinon, Tomcat s’exécutera toujours dans un mode de remplacement correspondant à la version du Servlet dans web.xml . La prise en charge des annotations de l’API de servlet n’a été ajoutée que dans Servlet 3.0 (Tomcat 7).

Donc, la déclaration racine de votre web.xml doit ressembler à celle ci-dessous (assurez-vous de supprimer également DOCTYPE de web.xml , sinon, elle sera toujours interprétée comme Servlet 2.3!).

  

En outre, il existe une différence mineure dans le modèle d’URL. Le modèle d’URL /notifications permet à la servlet d’écouter uniquement les requêtes sur ce chemin. Il ne démarre pas sur les requêtes avec un chemin supplémentaire tel que /notifications/list ou quelque chose. Le modèle d’URL /notifications/* laissera le servlet écouter les requêtes avec des informations supplémentaires sur le chemin.

L’annotation minimale @WebServlet devrait donc ressembler à ceci:

 @WebServlet("/notifications/*") 

Les autres atsortingbuts sont facultatifs et ne sont donc pas obligatoires pour que la servlet fonctionne de la même manière.

Voir également:

  • La page wiki de nos servlets

On peut aussi vouloir vérifier d’avoir deux classes avec des annotations du même nom:

 @WebServlet(name = "Foo", urlPatterns = {"/foo"}) public class Foo extends HttpServlet { //... } 

Et:

 @WebServlet(name = "Foo", urlPatterns = {"/bar"}) public class Bar extends HttpServlet { //... } 

Dans ce cas, l’un des servlets ne fonctionnera pas. Si vous n’utilisez pas le nom, laissez-le comme pour @BalusC. J’ai eu le comportement étrange que l’une des servlets ne fonctionnait que juste après la modification et la compilation, mais pas après la compilation sans modifications.

De plus, pour utiliser ces annotations et comstackr votre code, vous devez importer la dépendance correspondante dans votre fichier pom.xml, mais comme cela est prévu, votre serveur compatible “Servlet 3.0” dispose déjà de cette fonctionnalité.

  javax.servlet javax.servlet-api 3.0.1 provided