Аннотацию @WebServlet с Tomcat 7


в моем приложении у меня был сервлет, который был определен так в 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>

после перехода на использование Tomcat 7, я хотел бы использовать @WebServlet аннотация, которая будет выполнять эту работу.
Вот как я это сделал:

@WebServlet( name="NotificationServlet", displayName="Notification Servlet", urlPatterns = {"/notification"}, loadOnStartup=1)
public class NotificationServlet extends HttpServlet {

и это не работает. Может кто-нибудь, пожалуйста, скажите мне, что я сделал не так?

3 56

3 ответа:

при условии, что вы уверены, что используете Tomcat 7 или новее, веб-приложение web.xml должен быть объявлен соответствовать спецификации сервлетов 3.0 для того, чтобы получить Tomcat, чтобы сканировать и обрабатывать аннотации. В противном случае Tomcat все равно будет работать в резервном модусе, соответствующем версии сервлета в web.xml. Поддержка аннотаций API сервлетов была добавлена только в Servlet 3.0 (Tomcat 7).

Итак, корневая декларация вашего web.xml должно выглядеть как показано ниже (убедитесь, что вы удалите все DOCTYPE от web.xml тоже, иначе он все равно будет интерпретироваться как сервлет 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">

кроме того, есть небольшая разница в шаблоне URL. Шаблон URL /notifications позволит сервлету только слушать запросы именно по этому пути. Это не удар в запросах с дополнительным путем, как /notifications/list или что-то. Шаблон URL /notifications/* позволит сервлету прослушивать запросы с дополнительной информацией о пути.

минимальные @WebServlet аннотация должна выглядеть так это

@WebServlet("/notifications/*")

остальные атрибуты являются необязательными и, следовательно, не обязательными для того, чтобы сервлет функционировал одинаково.

Читайте также:

можно также проверить наличие двух классов с аннотациями с одинаковым именем:

@WebServlet(name = "Foo", urlPatterns = {"/foo"})
public class Foo extends HttpServlet {
    //...
}

и:

@WebServlet(name = "Foo", urlPatterns = {"/bar"})
public class Bar extends HttpServlet {
    //...
}

в этом случае один из сервлетов не будет работать. Если вы не используете имя, оставьте его, как предлагает @BalusC. Я получил странное поведение, что один из сервлетов работал только сразу после изменения и компиляции, но не после компиляции без изменений.

кроме того, для использования этих аннотаций и компиляции кода необходимо импортировать соответствующую зависимость в pom.xml, но, как предусмотрено причиной ваш "сервлет 3.0" совместимый сервер уже имеет это.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>