同一个servlet有多个url-pattern

41

我需要将同一个servlet映射到两个不同的URL上。我使用Netbeans 7.0.1管理整个项目,因此我使用其友好界面修改了web.xml文件。Netbeans创建的内容如下:

<servlet-mapping>
    <servlet-name>fred</servlet-name>
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>/url</url-pattern>
</servlet-mapping>

这段代码在tomcat 5.5中不会出现任何错误,但只有第二个模式起作用,而第一个模式被忽略。

我通过搜索发现,对于tomcat来说正确的方式是这样的:

<servlet-mapping>
    <servlet-name>fred</servlet-name>
    <url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>fred</servlet-name>
    <url-pattern>/url</url-pattern>
</servlet-mapping>

所以,我的问题是:这是Tomcat的一个漏洞吗?其他容器接受什么语法?

2个回答

51

我认为这更多与Servlet规范有关,而不是容器本身的问题。您的NetBeans似乎正在使用2.5规范来构建Servlet映射,因此您会收到

<servlet-mapping>
   <servlet-name>fred</servlet-name>
   <url-pattern>*.jsp</url-pattern>
   <url-pattern>/url</url-pattern>
</servlet-mapping>

这里可以阅读更多相关资料,它说:

之前的servlet方案只允许在过滤器映射中使用单个URL模式。对于映射到多个URL的过滤器,这会导致整个映射子句不必要地重复。


我认为,如果Tomcat使用旧规范(2.4)并且不接受新语法,那么它至少应该给出一个错误提示。或者NetBeans应该使用旧语法以便拥有兼容的web.xml。难道不是吗?新的容器是否接受具有多个servlet-mapping条目的旧语法? - eppesuig
1
@eppesuig 我非常确定它们大多数都是向后兼容的 :) 而且2.5 Servlet规范XSD肯定允许这样做。 - Aravind A
如果您对答案感到满意,可以通过点击问题旁边的勾号接受它,或者如果这些回答在任何方面对您有所帮助,您也可以点赞。接受答案将提高您在该论坛中的声誉。 - Aravind A
我最好检查一下所有的设置。发现我在NetBeans中有所有的Tomcat服务器,即Tomcat 5.5、Tomcat 6和Tomcat 7。但是我无法选择Tomcat 5.5作为测试应用程序的服务器。似乎我的项目有一个名为Java EE 5的属性,因此它不能与实现Servlet 2.4的容器一起使用。这是因为Java EE 5意味着Servlet 2.5。因此,我倾向于认为NetBeans创建的web.xml必须只满足Servlet 2.5。在这种情况下,我认为唯一的错误在于Tomcat 5。我将向Tomcat作者报告此问题。 - eppesuig

1

Tomcat容器将支持3种url模式:

  1. 完整字符序列
  2. /*
  3. *.扩展名(星号代表任何内容)

/*仅建议用于单一框架

如果使用多个框架,则建议使用.*


URL模式#2可以是/somestring/*,其中somestring可以包含/字符。第四个模式,单独的/,指定应用程序的默认servlet。Servlet规范3.1支持使用""(空字符串)的第五个模式。有关详细信息,请查看您的servlet版本下的主题映射规范中的适当Servlet规范。 - MikeOnline

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