默认 Servlet

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

此处理程序将所有请求转发到默认 Servlet。因此,它必须在所有其他 URL HandlerMappings 的顺序中保持最后。如果您使用 <mvc:annotation-driven>,则会出现这种情况。或者,如果您设置了自己的自定义 HandlerMapping 实例,请务必将其 order 属性设置为低于 DefaultServletHttpRequestHandler 的值,即 Integer.MAX_VALUE

以下示例显示了如何使用默认设置启用该功能

  • Java

  • Kotlin

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		configurer.enable();
	}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {

	override fun configureDefaultServletHandling(configurer: DefaultServletHandlerConfigurer) {
		configurer.enable()
	}
}

以下示例显示了如何在 XML 中实现相同的配置

<mvc:default-servlet-handler/>

覆盖 / Servlet 映射的注意事项是,必须按名称而不是按路径检索默认 Servlet 的 RequestDispatcherDefaultServletHttpRequestHandler 尝试在启动时使用大多数主要 Servlet 容器(包括 Tomcat、Jetty、GlassFish、JBoss、Resin、WebLogic 和 WebSphere)的已知名称列表自动检测容器的默认 Servlet。如果默认 Servlet 已使用不同的名称进行自定义配置,或者正在使用默认 Servlet 名称未知的不同 Servlet 容器,则必须显式提供默认 Servlet 的名称,如下例所示

  • Java

  • Kotlin

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		configurer.enable("myCustomDefaultServlet");
	}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {

	override fun configureDefaultServletHandling(configurer: DefaultServletHandlerConfigurer) {
		configurer.enable("myCustomDefaultServlet")
	}
}

以下示例显示了如何在 XML 中实现相同的配置

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