Anotación @WebServlet con Tomcat 7

Resuelto Dvora asked hace 13 años • 3 respuestas

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 @WebServletanotació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?

Dvora avatar Jun 30 '11 20:06 Dvora
Aceptado

Siempre que esté seguro de que está utilizando Tomcat 7 o una versión más reciente, la aplicación web web.xmldebe 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.xmldebe verse como se muestra a continuación (asegúrese de eliminar alguna DOCTYPEtambié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 /notificationspermitirá que el servlet solo escuche solicitudes exactamente en esa ruta. No se activa en solicitudes con una ruta adicional como /notifications/listo 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 @WebServletdeberí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
BalusC avatar Jul 02 '2011 20:07 BalusC

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.

Herbert avatar Sep 15 '2014 09:09 Herbert

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>
Josue Ruiz Salazar avatar Jun 22 '2016 00:06 Josue Ruiz Salazar