預設 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"/>