@ 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?
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ż:
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.
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>
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