Spring MVC DispatcherServlet mapping / vs / *

时间:2014-05-22 18:16:49

标签: spring spring-mvc servlets

<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>

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 个答案:

答案 0 :(得分:4)

根据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中提供静态内容。而是提供了一个特殊的处理程序,它可以从目录/类路径中的可配置路径模式加载静态资源。您需要为此功能使用<mvc:resources/>标记。但是,如果您仍然希望使用容器提供的Servlet来提供您需要使用的资源 弹簧配置中的<mvc:default-servlet-handler/>。您可以阅读有关此方法及其概则/缺点的更多信息here - 第15.12.4节