2014-05-22 68 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节