Servlets @使用Tomcat 7的WebServlet注释

Servlets @使用Tomcat 7的WebServlet注释,servlets,annotations,tomcat7,servlet-3.0,Servlets,Annotations,Tomcat7,Servlet 3.0,在我的应用程序中,我有一个servlet,在web.xml中定义如下: 通知Servlet 通知servlet com.XXX.servlet.NotificationServlet 1. 通知servlet /通知/* 在使用Tomcat 7之后,我想使用@WebServlet注释来完成这项工作。 我是这样做的: @WebServlet( name="NotificationServlet", displayName="Notification Servlet", urlPatterns

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


通知Servlet
通知servlet
com.XXX.servlet.NotificationServlet
1.
通知servlet
/通知/*
在使用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版本相匹配的回退模式运行。对ServletAPI注释的支持仅在Servlet3.0(Tomcat7)中添加

因此,
web.xml
的根声明必须如下所示(确保也从
web.xml
中删除任何
DOCTYPE
,否则它仍将被解释为Servlet 2.3!)

其余的属性是可选的,因此不必强制让servlet平等地运行

另见:

    • 可能还需要检查是否有两个具有相同名称注释的类:

      @WebServlet(name=“Foo”,urlPatterns={”/Foo})
      公共类Foo扩展了HttpServlet{
      //...
      }
      
      以及:

      @WebServlet(name=“Foo”,urlPatterns={”/bar})
      公共类栏扩展了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>
      
      
      javax.servlet
      javax.servlet-api
      3.0.1
      假如
      
      由于这个问题,我能够摆脱这么多样板XML。注释万岁!您可能需要添加
      。在使用
      @WebServlet
      注释时,您根本不必使用
      web.xml
      。它不需要
      web.xml
      @destan:没错。但是,如果您有一个,如OP的情况,它必须至少为3.0。你最终需要一个,因为不是所有的东西都可以注释。@Aniket:那么你说维基百科上的信息比Oracle自己的Servlet规范文档中的信息更可靠?确切的原因是什么?我有一种奇怪的感觉,servlet在刚刚被更改、编译并重新部署到glassfish 4时工作。当我重新编译而没有更改并部署时,它不起作用。我添加了metadata complete=“false”属性并最小化了webservlet注释,现在它可以工作了。但其他servlet一直在工作。如果你否决了投票,请留下评论,否则没有人能够回应、纠正或从中吸取教训。非常感谢。
      @WebServlet("/notifications/*")
      
      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.0.1</version>
          <scope>provided</scope>
      </dependency>