webservlet servlet ejemplo servlets annotations tomcat7 servlet-3.0

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.