Tomcat 7的@WebServlet注释

在我的应用程序中,我有一个在web.xml中定义的servlet:

<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 { 

它不起作用。 有人能告诉我我做错了什么吗?

假设您确定您使用的是Tomcat 7或更新的版本,则必须声明webapp的web.xml符合Servlet 3.0规范,才能让Tomcat扫描并处理注释。 否则,Tomcat将仍然以与web.xml的Servlet版本匹配的回退方式运行。 Servlet API注释的支持只是在Servlet 3.0(Tomcat 7)中添加的。

所以,你的web.xml的根声明必须如下所示(确保你从web.xml删除任何DOCTYPE ,否则它仍然会被解释为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"> 

此外,url格式也有一些细微差别。 URL模式/notifications将使servlet仅在该path上监听请求。 它不会踢出像/notifications/list类的额外path的请求。 URL pattern /notifications/*会使servlet侦听具有额外path信息的请求。

最小的@WebServlet注释应该如此

 @WebServlet("/notifications/*") 

其余的属性是可选的,因此并不是必须使servlet平等地运行。

也可以看看:

  • 我们的servlets wiki页面

人们也可能想要检查具有相同名称的注释的两个类:

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

和:

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

在这种情况下,其中一个servlet将无法工作。 如果您不使用该名称,请将其保留,如@BalusC所示。 我得到了一个奇怪的行为,即一个servlet在更改和编译之后才工作,而不是在编译之后没有更改。

此外,为了使用这些注释并编译你的代码,你必须在你的pom.xml中导入相应的依赖项,但是正如所提供的,你的“Servlet 3.0”兼容服务器已经有了这个。

 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency>