2014-05-22 67 views
3
<servlet> 
    <servlet-name>springmvcdemo</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>springmvcdemo</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

VSSpring MVC的DispatcherServlet的映射/ VS/*

<servlet> 
    <servlet-name>springmvcdemo</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>springmvcdemo</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

我知道有被複制的問題,但我仍然感到困惑。我的理解是,當使用/ *時,每個請求都會經過這個servlet(這意味着所有的.jsp,.html等都會在這裏結束)。 /將使這個servlet成爲默認的servlet(如果有確切的URL安裝,返回)但是在我看來,使用/每個請求時,無論如何都仍然通過DispatcherServlet。我無法直接打開任何.jsp文件。有人可以向我解釋更多嗎?

+1

在你的兩個例子中,web.xml的配置是一樣的 – fmodos

回答

3

根據Servlet specification,如果沒有顯式的servlet匹配請求,則映射「/」意味着默認的servlet含義,那麼這個默認的servlet將服務於請求。例如,在Tomcat服務器公共配置web.xml中定義了一個名爲「default」的servlet,它由所有應用程序繼承。這個servlet提供靜態內容,如css,圖像等,這些靜態內容通常不會映射到應用程序web.xml中。同樣,還有一個特殊的Servlet處理對jsp文件的請求(所有以* .jsp結尾的請求自然需要編譯爲Servlet,然後才能處理請求)。因此,如果您將默認servlet覆蓋爲應用程序web.xml中的任何其他servlet,那麼所有未由其他servlet處理的請求都發送到此servlet,並且如果此Servlet無法提供請求,它將不起作用。

如果您聲明Spring調度程序servlet是默認的Servlet,那麼您將無法從容器提供的Servlet中提供靜態內容。相反,提供了一個特殊的處理程序,可以從目錄/ classpath中的可配置路徑模式加載靜態資源。您需要爲此功能使用<mvc:resources/>標記。但是,如果您仍想使用容器提供的Servlet來提供服務資源,則需要在彈簧配置中使用 <mvc:default-servlet-handler/>。你可以閱讀更多關於這種方法和它的prons/cons here - 第15.12.4節