2009-10-15 34 views
1

我有两个Servlet的ExtensionServlet和PatternServlet以及一个静态html页面。 HTML代码如下。servlet-mapping中的歧义

<html> 
    <head> 
     <title> 
      Resolve servlet ambiguity 
     </title> 
    </head> 
    <body> 
     <form action="servlets/form.col" method="POST"> 
      <input type="submit" value="Goto Servlet"> 
     </form> 
    </body> 
</html> 

部署描述符如下。

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" > 
    <servlet> 
     <servlet-name>Extension Servlet</servlet-name> 
     <servlet-class>ExtensionServlet</servlet-class>  
     <servlet-name>Pattern Servlet</servlet-name> 
     <servlet-class>PatternServlet</servlet-class> 
    </servlet> 
    <servlet-mapping>  
     <servlet-name>Extension Servlet</servlet-name> 
     <url-pattern>*.col</url-pattern> 
     <servlet-name>Pattern Servlet</servlet-name> 
     <url-pattern>/servlets/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

当我点击的HTML页面的按钮,它会导致“PatternServlet”。如果我在部署描述符重新排列如下servlet的顺序,它进入“ExtensionServlet”

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" > 
    <servlet> 
     <servlet-name>Pattern Servlet</servlet-name> 
     <servlet-class>PatternServlet</servlet-class> 
     <servlet-name>Extension Servlet</servlet-name> 
     <servlet-class>ExtensionServlet</servlet-class> 
    </servlet> 
    <servlet-mapping>   
     <servlet-name>Pattern Servlet</servlet-name> 
     <url-pattern>/servlets/*</url-pattern> 
     <servlet-name>Extension Servlet</servlet-name> 
     <url-pattern>*.col</url-pattern> 
    </servlet-mapping> 
</web-app> 

谁能请解释这种现象?

Tomcat的 6.0.20 JVM 1.6.0_15-B03

回答

4

您的模式是否缩短以下内容?

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" > 
    <servlet> 
     <servlet-name>Pattern Servlet</servlet-name> 
     <servlet-class>PatternServlet</servlet-class> 
    </servlet> 
    <servlet> 
     <servlet-name>Extension Servlet</servlet-name> 
     <servlet-class>ExtensionServlet</servlet-class> 
    </servlet> 
    <servlet-mapping>     
     <servlet-name>Pattern Servlet</servlet-name> 
     <url-pattern>/servlets/*</url-pattern> 
    </servlet-mapping>     
    <servlet-mapping>     
     <servlet-name>Extension Servlet</servlet-name> 
     <url-pattern>*.col</url-pattern> 
    </servlet-mapping> 
</web-app> 

在你的版本中,我认为你只定义了一个servlet。

当tomcat遇到几个匹配请求的定义(就像你的情况),它使用第一个。

+0

是的。谢谢!我的错!! – bdhar 2009-10-15 11:20:17

1

这看起来并不像一个合法的部署描述符给我。模式不需要这样的东西:

<servlet> 
    <servlet-name>Extension Servlet</servlet-name> 
    <servlet-class>ExtensionServlet</servlet-class>   
</servlet> 
<servlet> 
    <servlet-name>Pattern Servlet</servlet-name> 
    <servlet-class>PatternServlet</servlet-class> 
</servlet> 
<servlet-mapping>   
    <servlet-name>Extension Servlet</servlet-name> 
    <url-pattern>*.col</url-pattern> 
</servlet-mapping>   
<servlet-mapping>   
    <servlet-name>Pattern Servlet</servlet-name> 
    <url-pattern>/servlets/*</url-pattern> 
</servlet-mapping> 
+0

是的。谢谢!我的错!! – bdhar 2009-10-15 11:19:44

2

当Tomcat收到请求时,它使用配置的servlet映射选择一个单独的servlet执行。如果请求的URL匹配多个映射,则选择最佳匹配,忽略其他映射。

通过规范,路径前缀模式映射优于扩展映射。这意味着,在您的示例中,“/ servlets/”上的映射应该胜过“ .col”上的映射,并且该请求始终应该导致执行Pattern servlet。您重新排列声明时出现的意外行为是因为您的描述符不正确,正如其他答案已经指出的那样。尝试使用正确的描述符,如David Rabinowitz所建议的描述符。

+0

谢谢弗利里先生。我也更正了我的描述符。而且,我在哪里可以找到规范,它提供了有关选择这种servlet映射和首选项的信息? – bdhar 2009-10-16 05:39:19