默认 Servlet
Spring MVC 允许将 DispatcherServlet 映射到 /(从而覆盖容器默认 Servlet 的映射),同时仍允许由容器默认 Servlet 处理静态资源请求。它配置了一个 DefaultServletHttpRequestHandler,其 URL 映射为 /**,并且相对于其他 URL 映射具有最低优先级。
此处理器将所有请求转发到默认 Servlet。因此,它必须在所有其他 URL HandlerMappings 的顺序中保持最后。如果您使用 <mvc:annotation-driven>,则情况就是如此。或者,如果您设置了自己的自定义 HandlerMapping 实例,请确保将其 order 属性设置为低于 DefaultServletHttpRequestHandler 的值,后者是 Integer.MAX_VALUE。
以下示例展示了如何使用默认设置启用该功能
-
Java
-
Kotlin
-
Xml
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
@Configuration
class WebConfiguration : WebMvcConfigurer {
override fun configureDefaultServletHandling(configurer: DefaultServletHandlerConfigurer) {
configurer.enable()
}
}
<mvc:default-servlet-handler/>
覆盖 / Servlet 映射的注意事项是,必须通过名称而不是路径来检索默认 Servlet 的 RequestDispatcher。DefaultServletHttpRequestHandler 在启动时会尝试自动检测容器的默认 Servlet,它使用大多数主要 Servlet 容器(包括 Tomcat、Jetty、GlassFish、JBoss、WebLogic 和 WebSphere)的已知名称列表。如果默认 Servlet 已通过不同的名称自定义配置,或者正在使用默认 Servlet 名称未知的不同 Servlet 容器,那么您必须显式提供默认 Servlet 的名称,如以下示例所示
-
Java
-
Kotlin
-
Xml
@Configuration
public class CustomDefaultServletConfiguration implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable("myCustomDefaultServlet");
}
}
@Configuration
class CustomDefaultServletConfiguration : WebMvcConfigurer {
override fun configureDefaultServletHandling(configurer: DefaultServletHandlerConfigurer) {
configurer.enable("myCustomDefaultServlet")
}
}
<mvc:default-servlet-handler default-servlet-name="myCustomDefaultServlet"/>