Dans mon application, j'ai eu un servlet qui a été défini comme ceci dans le web.xml:
<servlet>
<display-name>Notification Servlet</display-name>
<servlet-name>NotificationServlet</servlet-name>
<servlet-class>com.XXX.servlet.NotificationServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>NotificationServlet</servlet-name>
<url-pattern>/notification/*</url-pattern>
</servlet-mapping>
Après avoir utilisé Tomcat 7, j'aimerais utiliser le @WebServlet
annotation 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. Est-ce que quelqu'un pourrait me dire ce que j'ai fait de mal?
Si vous êtes sûr d'utiliser Tomcat 7 ou une version plus récente, la web.xml
De l'application Web doit être déclarée conforme à la spécification Servlet 3.0 afin de permettre à Tomcat d'analyser et de traiter les annotations. Sinon, Tomcat fonctionnera toujours dans un mode de repli 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).
Ainsi, la déclaration racine de votre web.xml
Doit ressembler à celle ci-dessous (assurez-vous de supprimer également DOCTYPE
de web.xml
, Sinon il sera interprété comme Servlet 2.3!).
<web-app
xmlns="http://Java.Sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
En outre, il existe une différence mineure dans le modèle d'URL. Le modèle d'URL /notifications
Permettra au servlet d'écouter uniquement les demandes se trouvant exactement sur ce chemin. Il ne prend pas en compte les demandes avec un chemin supplémentaire tel que /notifications/list
Ou quelque chose du genre. Le modèle d'URL /notifications/*
Permettra également au servlet d'écouter les demandes avec des informations de chemin supplémentaires.
L'annotation minimale @WebServlet
Devrait donc ressembler à ceci
@WebServlet("/notifications/*")
Le reste des attributs est facultatif et n'est donc pas obligatoire pour que la servlet fonctionne de manière égale.
On peut aussi vouloir vérifier s'il y a 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 de côté, comme le suggère @BusC. J'ai eu le comportement étrange que l'une des servlets ne fonctionnait que juste après l'avoir modifiée et compilée, mais pas après la compilation sans modifications.
De plus, pour utiliser ces annotations et compiler votre code, vous devez importer la dépendance correspondante dans votre pom.xml, mais comme prévu, votre serveur conforme à "Servlet 3.0" en dispose déjà.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>