Anotación @WebServlet con Tomcat 7
En mi aplicación, tenía un servlet que estaba definido así en 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>
Después de pasar a utilizar Tomcat 7, me gustaría utilizar la @WebServlet
anotación que hará el trabajo.
Así es como lo hice:
@WebServlet( name="NotificationServlet", displayName="Notification Servlet", urlPatterns = {"/notification"}, loadOnStartup=1)
public class NotificationServlet extends HttpServlet {
Y no funciona. ¿Alguien podría decirme qué hice mal?
Siempre que esté seguro de que está utilizando Tomcat 7 o una versión más reciente, la aplicación web web.xml
debe declararse conforme a las especificaciones de Servlet 3.0 para que Tomcat escanee y procese las anotaciones. De lo contrario, Tomcat seguirá ejecutándose en un modo alternativo que coincida con la versión de Servlet en web.xml
. El soporte para anotaciones API de servlet solo se agregó en Servlet 3.0 (Tomcat 7).
Por lo tanto, la declaración raíz de su web.xml
debe verse como se muestra a continuación (asegúrese de eliminar alguna DOCTYPE
también web.xml
; de lo contrario, aún se interpretará como 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">
Además, hay una pequeña diferencia en el patrón de URL. El patrón de URL /notifications
permitirá que el servlet solo escuche solicitudes exactamente en esa ruta. No se activa en solicitudes con una ruta adicional como /notifications/list
o algo así. El patrón de URL /notifications/*
también permitirá que el servlet escuche solicitudes con información de ruta adicional.
La anotación mínima @WebServlet
debería verse así
@WebServlet("/notifications/*")
El resto de atributos son opcionales y por tanto no obligatorios para que el servlet funcione igualmente.
Ver también:
- Nuestra página wiki de servlets
Es posible que también desee verificar si hay dos clases con anotaciones con el mismo nombre:
@WebServlet(name = "Foo", urlPatterns = {"/foo"})
public class Foo extends HttpServlet {
//...
}
Y:
@WebServlet(name = "Foo", urlPatterns = {"/bar"})
public class Bar extends HttpServlet {
//...
}
En estos casos, uno de los servlets no funcionará. Si no usa el nombre, omítalo, como sugiere @BalusC. Obtuve el comportamiento extraño de que uno de los servlets solo funcionó inmediatamente después de cambiarlo y compilarlo, pero no después de la compilación sin cambios.
Además, para utilizar estas anotaciones y compilar su código, debe importar la dependencia correspondiente en su pom.xml, pero según lo previsto, su servidor compatible con "Servlet 3.0" ya la tiene.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>