2010-06-10 86 views
9

我使用Spring 2.5 MVC並想添加另一個第三方Servlet。問題是,Spring MVC捕獲所有請求,所以Servlet沒有收到任何請求。這裏一個web.xml段:如何阻止Spring MVC阻止所有其他Servlet?

用SpringMVC org.springframework.web.servlet.DispatcherServlet

<servlet-mapping> 
    <servlet-name>SpringMVC</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

<servlet> 
    <description>This is the servlet needed for cache.type servlet, returns the packed resources</description> 
    <display-name>PackServlet</display-name> 
    <servlet-name>PackServlet</servlet-name> 
    <servlet-class>net.sf.packtag.servlet.PackServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>PackServlet</servlet-name> 
    <url-pattern>*.pack</url-pattern> 
</servlet-mapping> 

的/ *是真正需要的映射應用程序,一個包是:標籤(該第三方Servlet)確實需要基於文件擴展名的映射。 有什麼可能告訴Spring不要處理請求? 感謝和問候。

回答

14

其實你不需要春天做任何事情,servlet容器可以解決這個給你。

匹配發送請求的servlet取決於由url-pattern定義的匹配規則。沒有2個servlet可能有相同的模式,但它們可能有重疊的模式。然後4個規則:

1)完全匹配優先於通配符匹配 2)更長的路徑模式在更短的模式 3)路徑匹配優先於文件類型匹配 4)/匹配任何沒有匹配

優先
<servlet-mapping> 
    <servlet-name>PackServlet</servlet-name> 
    <url-pattern>*.pack</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>SpringMVC</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

如果使用/ *作爲SpringMVC,它可能會匹配最長的路徑。通過刪除*,您一定會遵循默認servlet的servlet規範,並且符合規則4.

Here you can find some more details

+0

你的結尾,嘗試糾正這些有用的人可能會複製粘貼此片段 – Lombo 2010-06-10 11:02:59

+0

@Lombo:Thanks,Great spot。 – 2010-06-10 11:23:06