Spring MVC 允许将 DispatcherServlet 映射到 /(从而覆盖容器的默认 Servlet 的映射),同时仍然允许静态资源请求由容器的默认 Servlet 处理(有 Spring 的 静态资源 处理,感觉这个功能不会用到)。它配置了一个 DefaultServletHttpRequestHandler,其 URL 映射为 /**,相对于其他 URL 映射而言,其优先级最低。

    这个处理程序将所有的请求转发给默认的 Servlet。因此,它必须在所有其他 URL HandlerMappings 的顺序中保持最后。如果你使用<mvc:annotation-driven>,情况就是这样。另外,如果你设置了你自己的自定义 HandlerMapping 实例,请确保将其顺序属性设置为低于DefaultServletHttpRequestHandler 的值,即 Integer.MAX_VALUE。

    下面的例子显示了如何通过使用默认设置来启用该功能:

    1. @Configuration
    2. @EnableWebMvc
    3. public class WebConfig implements WebMvcConfigurer {
    4. @Override
    5. public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    6. configurer.enable();
    7. }
    8. }

    下面是等效的 XML 配置:

    1. <mvc:default-servlet-handler/>

    重写 /Servlet 映射的注意事项是,默认 Servlet 的 RequestDispatcher 必须通过名称而不是路径来检索。DefaultServletHttpRequestHandler 试图在启动时自动检测容器的默认 Servlet,使用大多数主要 Servlet 容器(包括 Tomcat、Jetty、GlassFish、JBoss、Resin、WebLogic 和 WebSphere)的已知名称列表。如果默认的 Servlet 被定制配置了不同的名字,或者如果使用的是不同的 Servlet 容器,而默认的 Servlet 名字未知,那么你必须明确地提供默认 Servlet 的名字,如下例所示:

    1. @Configuration
    2. @EnableWebMvc
    3. public class WebConfig implements WebMvcConfigurer {
    4. @Override
    5. public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    6. configurer.enable("myCustomDefaultServlet");
    7. }
    8. }

    下面是同等的 XML 配置:

    1. <mvc:default-servlet-handler default-servlet-name="myCustomDefaultServlet"/>