Аннотацию @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 ответа:
при условии, что вы уверены, что используете 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>