@WebServlet аннотация с Tomcat 7

В моем приложении у меня был сервлет, который был определен следующим образом в web.xml :

 Notification Servlet NotificationServlet com.XXX.servlet.NotificationServlet 1   NotificationServlet /notification/*  

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

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

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

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

Итак, корневое объявление вашего web.xml должно выглядеть следующим образом (убедитесь, что вы удалили любой DOCTYPE из web.xml , иначе он все равно будет интерпретироваться как Servlet 2.3!).

  

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

Таким образом, минимальная аннотация @WebServlet должна выглядеть так:

 @WebServlet("/notifications/*") 

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

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

  • Страница наших сервлетов wiki

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

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

А также:

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

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

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

  javax.servlet javax.servlet-api 3.0.1 provided  при  javax.servlet javax.servlet-api 3.0.1 provided  ,  javax.servlet javax.servlet-api 3.0.1 provided  
  • Tomcat 7.0.73 не работает с java 9
  • сервер tomcat не запускает сервер и приложение в STS
  • Tomcat 7 - Servlet 3.0: неверный тег байта в постоянном пуле
  • Источник впрыска Джерси 2 для многочастных форм
  • INFO: Нет типов Spring WebApplicationInitializer, обнаруженных на пути к classам
  • Давайте будем гением компьютера.