@ WebServlet adnotacja z Tomcat 7

W mojej aplikacji miałem servlet, który został zdefiniowany tak w 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>

Po przejściu do korzystania z Tomcat 7, chciałbym użyć adnotacji @WebServlet, która wykona zadanie.
Oto jak to zrobiłem:

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

I to nie działa. Czy ktoś mógłby mi powiedzieć, co zrobiłem źle?

Author: HDJEMAI, 2011-06-30

3 answers

Pod warunkiem, że jesteś pewien, że używasz Tomcat 7 lub nowszy, aplikacja webapp web.xml musi być zadeklarowana zgodność Servlet 3.0 spec w celu uzyskania Tomcat do skanowania i przetwarzania adnotacji. W przeciwnym razie Tomcat nadal będzie działał w modusie awaryjnym pasującym do wersji Servleta w web.xml. Obsługa adnotacji API servleta została dodana dopiero w Servlet 3.0 (Tomcat 7).

Tak więc główna deklaracja twojego {[2] } musi wyglądać jak poniżej (upewnij się, że usuniesz również DOCTYPE z web.xml, w przeciwnym razie nadal będzie interpretowany jako 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">

Ponadto istnieje niewielka różnica w wzorze adresu URL. Wzorzec URL /notifications pozwoli serwletowi nasłuchiwać tylko żądań na dokładnie tej ścieżce. Nie działa na żądania z dodatkową ścieżką jak /notifications/list czy coś takiego. Wzorzec URL /notifications/* pozwoli serwletowi nasłuchiwać żądań z dodatkowymi informacjami o ścieżce.

Minimalna @WebServlet adnotacja powinna więc wyglądać tak

@WebServlet("/notifications/*")

Reszta atrybutów to opcjonalne, a więc nie obowiązkowe, aby servlet działał jednakowo.

Zobacz też:

 107
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:25

Można również sprawdzić, czy istnieją dwie klasy z adnotacją o tej samej nazwie:

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

I:

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

W tym przypadku jeden z serwletów nie będzie działał. Jeśli nie używasz nazwy, zostaw ją, jak sugeruje @BalusC. Mam dziwne zachowanie, że jeden z serwletów działał tylko zaraz po zmianie i kompilacji, ale nie po kompilacji bez zmian.

 5
Author: Herbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-15 09:07:28

Dodatkowo, aby użyć tych adnotacji i skompilować swój kod, musisz zaimportować odpowiednią zależność do pom.xml, ale zgodnie z podanym powodem Twój serwer zgodny z Servlet 3.0 już to ma.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>
 2
Author: Josue Ruiz Salazar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-22 00:15:46