63

在我的应用程序中,我有一个 servlet,它在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 {

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

4

3 回答 3

113

如果您确定您使用的是 Tomcat 7 或更新版本,则必须将 webappweb.xml声明为符合 Servlet 3.0 规范,以便让 Tomcat 扫描和处理注释。否则 Tomcat 仍会以与web.xml. 仅在 Servlet 3.0 (Tomcat 7) 中添加了对 servlet API 注释的支持。

因此,您的根声明web.xml必须如下所示(确保您也DOCTYPE从中删除任何web.xml内容,否则它仍将被解释为 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 只监听该路径上的请求。它不会启动带有额外路径之类的请求/notifications/list。URL 模式/notifications/*也会让 servlet 监听带有额外路径信息的请求。

因此,最小@WebServlet注释应如下所示

@WebServlet("/notifications/*")

其余属性是可选的,因此对于使 servlet 发挥同等作用并不是强制性的。

也可以看看:

于 2011-07-02T20:36:44.750 回答
6

人们可能还想检查两个类是否具有同名的注释:

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

和:

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

在这种情况下,其中一个 servlet 将不起作用。如果您不使用该名称,请忽略它,就像@BalusC 建议的那样。我得到了一个奇怪的行为,即其中一个 servlet 仅在更改和编译它之后才起作用,但在没有更改的编译之后就不起作用。

于 2014-09-15T09:07:28.070 回答
2

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

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>
于 2016-06-22T00:15:46.833 回答