使用Tomcat 7的@WebServlet注释

Dvo*_*ora 60 annotations servlets servlet-3.0 tomcat7

在我的应用程序中,我有一个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>
Run Code Online (Sandbox Code Playgroud)

在使用Tomcat 7之后,我想使用@WebServlet将完成这项工作的注释.
这是我做的方式:

@WebServlet( name="NotificationServlet", displayName="Notification Servlet", urlPatterns = {"/notification"}, loadOnStartup=1)
public class NotificationServlet extends HttpServlet {
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 111

如果您确定使用的是Tomcat 7或更新版本,则web.xml必须声明webapp 符合Servlet 3.0规范,以便让Tomcat扫描并处理注释.否则Tomcat仍将以与Servlet版本匹配的后备模式运行web.xml.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">
Run Code Online (Sandbox Code Playgroud)

此外,URL模式存在细微差别.URL模式/notifications将允许servlet仅在该路径上侦听请求.它不会对带有额外路径的请求产生影响/notifications/list.URL模式/notifications/*将让servlet监听具有额外路径信息的请求.

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

@WebServlet("/notifications/*")
Run Code Online (Sandbox Code Playgroud)

其余属性是可选的,因此不一定要使servlet平等运行.

也可以看看:

  • @Aniket:你说维基百科上的信息比Oracle自己的Servlet规范文档中的信息更可靠吗?为什么呢? (4认同)
  • 使用`@WebServlet`注释时,根本不必使用`web.xml`.它没有`web.xml`. (3认同)
  • @NicolasZozol:这已经是默认了. (2认同)

Her*_*ert 6

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

@WebServlet(name = "Foo", urlPatterns = {"/foo"})
public class Foo extends HttpServlet {
    //...
}
Run Code Online (Sandbox Code Playgroud)

和:

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

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