使用Tomcat 7的@WebServlet注释

时间:2011-06-30 13:41:00

标签: servlets annotations tomcat7 servlet-3.0

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

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

3 个答案:

答案 0 :(得分:109)

如果您确定使用的是Tomcat 7或更高版本,则必须声明webapp的web.xml符合Servlet 3.0规范,以便让Tomcat扫描并处理注释。否则,Tomcat仍将以与web.xml中的Servlet版本匹配的后备模式运行。 Servlet API注释的支持仅在Servlet 3.0(Tomcat 7)中添加。

因此,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平等运行。

另见:

答案 1 :(得分:6)

有人可能还想检查两个带有相同名称注释的类:

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

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

在这种情况下,其中一个servlet将无法运行。如果您不使用该名称,请将其保留,如@BalusC建议的那样。我得到了一个奇怪的行为,其中一个servlet只在更改和编译后才能正常工作,但在编译后没有更改就没有。

答案 2 :(得分:2)

此外,为了使用这些注释并编译代码,您必须在pom.xml中导入相应的依赖项,但是如提供的那样导致您的&#34; Servlet 3.0&#34;兼容服务器已经有这个。

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