Servlets @使用Tomcat 7的WebServlet注释
在我的应用程序中,我有一个servlet,在web.xml中定义如下: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
通知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>