名为[create_subscription]和[servlet.create]的Servlet都被映射到了不允许的url-pattern[/create]。

3
我正在使用Tomcat 7和Eclipse在JDK 7中创建这个简单的servlet应用程序。但是当我将war文件复制到Tomcat时,我无法启动它并且出现以下错误:
“create_subscription”和“servlet.create”的servlet都被映射到了不允许的url-pattern“/create”。
web.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>CC</display-name>
  <welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

<servlet>
  <servlet-name>create_subscription</servlet-name>
  <servlet-class>servlet.create</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>create_subscription</servlet-name>
  <url-pattern>/create</url-pattern>
</servlet-mapping>

</web-app>
3个回答

9
如果在web.xml和注释中同时声明了相同的映射,那么在较新版本的Tomcat中将出现此精确错误。

2
注释似乎是原因。如果您正在使用STS进行开发,则会将URL模式作为类上方的注释放置。只需从web.xml中删除<servlet-mapping>部分,现在就可以正常工作了。 - Deepak G M

1

检查您的servlet类。它应该有@WebServlet("/xyz")。

注释掉这一行,然后它应该可以正常工作。

或者您可以使用以下方式:@WebServlet(value="/create",name="create_subscription")

实际上,当您使用@WebServlet("/xyz")时,它会将servlet名称视为完全限定的servlet名称。因此,Tomcat认为您有两个servlet映射到一个URL,这就是为什么它会给出错误的原因。


0

我怀疑可能会有另一个servlet.create的条目,你能查看war包中的web.xml吗?

如果一切正常,可能需要将包声明从servlet.create更改为其他内容,例如com.test,并重新运行。

至于为什么不能将2个servlet映射到完全相同的URL模式

Servlet规范没有明确说明这一点,但是一些服务器不允许这样做。此外,具有完全相同URL的两个servlet没有意义,因为与servlet匹配的URL在第一个匹配处停止。

Servlet 2.4规范PDF,请参见第85页及以上。


谢谢Sudhakar,我查看了我的war文件中的web.xml,它在那里,并且只有一个servlet。我在Eclipse中创建了另一个项目,并再次编写了相同的程序,现在它可以工作了。我不知道为什么,一切都与之前的项目相同(我检查了很多次),但这个工作而之前的那个却不行! - Suanmeiguo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接