2009-10-15 31 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