servlets - webservlet - ejemplo servlet java netbeans
@WebServlet anotaciĆ³n con Tomcat 7 (3)
Además, para usar estas anotaciones y compilar su código, debe importar la dependencia correspondiente en su pom.xml, pero como se indica, su servidor "Servlet 3.0" ya lo tiene.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
En mi aplicación, tenía un servlet que se definió 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 anotación @WebServlet
que hará el trabajo.
Esta es la forma en que lo hice:
@WebServlet( name="NotificationServlet", displayName="Notification Servlet", urlPatterns = {"/notification"}, loadOnStartup=1)
public class NotificationServlet extends HttpServlet {
Y no funciona. ¿Podría alguien decirme qué hice mal?
Siempre que esté seguro de que está utilizando Tomcat 7 o posterior, el web.xml
de la aplicación debe declararse conforme a la especificación Servlet 3.0 para que Tomcat escanee y procese las anotaciones. De lo contrario, Tomcat se ejecutará en un modo alternativo que coincida con la versión de Servlet en web.xml
. El soporte para las anotaciones de la API de servlet solo se agregó en Servlet 3.0 (Tomcat 7).
Por lo tanto, la declaración de raíz de su web.xml
debe verse a continuación (asegúrese de eliminar cualquier DOCTYPE
de web.xml
también, de lo contrario, 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 /notifications
URL permitirá que el servlet solo escuche las solicitudes exactamente en esa ruta. No entra en las solicitudes con una ruta adicional como /notifications/list
o algo así. El patrón de URL /notifications/*
permitirá que el servlet también escuche en solicitudes con información de ruta adicional.
La anotación mínima de @WebServlet
debería verse así
@WebServlet("/notifications/*")
El resto de los atributos son opcionales y, por lo tanto, no son obligatorios para que el servlet funcione de la misma manera.
Ver también:
- Nuestra página wiki servlets
También es posible que desee comprobar 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, déjelo fuera, como sugiere @BalusC. Obtuve el extraño comportamiento de que uno de los servlets solo funcionó justo después de cambiarlo y compilarlo, pero no después de la compilación sin cambios.