web-dev-qa-db-fra.com

Annotation @WebServlet avec Tomcat 7

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?

60
Dvora

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.

Voir également:

110
BalusC

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.

6
Herbert

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>
2
Josue Ruiz Salazar