@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 {
И это не сработает. Может кто-нибудь, пожалуйста, скажите мне, что я сделал неправильно?
- Как определить и в web-файле без сервлета 3.0?
- Остановить запланированный таймер при выключении tomcat
- Tomcat 7 и JSTL
- Как исправить: «Не найдено подходящего драйвера для ошибки jdbc: mysql: // localhost / dbname» при использовании пулов?
- Имя не связано в этом контексте
- java.lang.ClassNotFoundException: HttpServletRequest
- Экспорт в Excel JSF и PrimeFaces
- Как установить контекстный путь веб-приложения в Tomcat 7.0
- Предоставление ресурсов из файлов jar в веб-приложениях (Tomcat7)
- jar не загружен. См. Раздел Servlet Spec 2.3, раздел 9.7.2. Класс нарушения: javax / servlet / Servlet.class
- Tomcat 7 - Плагин Maven?
- Tomcat 7 "SEVERE: дочерний контейнер не сработал во время запуска"
- org.apache.tomcat.util.bcel.classfile.ClassFormatException: недопустимый тег байта в постоянном пуле: 15 - Tomcat 7, JDK incompatibilty?
При условии, что вы уверены, что используете 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