61 votes

Annotation @WebServlet avec tomcat7

Dans mon application, j'ai eu un servlet qui a été défini comme ceci dans le fichier 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é tomcat7, 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. Est-ce que quelqu'un pourrait me dire ce que j'ai fait de mal?

112voto

BalusC Points 498232

La webapp de l' web.xml doit être déclaré conforme Servlet 3.0 afin d'obtenir Tomcat pour numériser et traiter les annotations.

Ainsi, la racine de la déclaration de votre web.xml doit ressembler à ceci.

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

Ensuite, il y a une différence mineure dans le modèle d'URL. Le modèle d'URL /notifications permettra à la servlet en écoute uniquement sur les demandes sur ce chemin. Il n'est pas un coup de pied dans sur demande avec un supplément de chemin comme /notifications/list ou quelque chose. Le modèle d'URL /notifications/* permettra à la servlet écouter sur demande avec supplément de chemin d'accès des informations aussi bien.

Le minimum @WebServlet annotation devrait donc ressembler à ceci

@WebServlet("/notifications/*")

Le reste des attributs sont optionnels et ne sont donc pas obligatoires pour obtenir la servlet fonctionner aussi.

6voto

Herbert Points 641

On peut également vouloir vérifier pour avoir deux classes avec des annotations avec le 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, il faut le laisser, à l'instar de @BalusC suggère. J'ai eu l'étrange comportement que l'un des servlets seulement travaillé à droite après le changement et de le compiler, mais pas après la compilation sans modifications.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X