@WebServlet аннотация с Tomcat 7 - PullRequest
60 голосов
/ 30 июня 2011

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

109 голосов
/ 03 июля 2011

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

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

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

Минимальная @WebServlet аннотация должна выглядеть следующим образом

@WebServlet("/notifications/*")

Остальные атрибуты являются необязательными и, следовательно, не обязательны для обеспечения одинаковой работы сервлета.

Смотри также:

6 голосов
/ 15 сентября 2014

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

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

И

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

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

2 голосов
/ 22 июня 2016

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

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