Servlet 配置

在 Servlet 環境中,您可以選擇以程式設計方式配置 Servlet 容器,作為 web.xml 檔案的替代方案或與之結合使用。以下範例註冊了 DispatcherServlet

  • Java

  • Kotlin

import org.springframework.web.WebApplicationInitializer;

public class MyWebApplicationInitializer implements WebApplicationInitializer {

	@Override
	public void onStartup(ServletContext container) {
		XmlWebApplicationContext appContext = new XmlWebApplicationContext();
		appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");

		ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
		registration.setLoadOnStartup(1);
		registration.addMapping("/");
	}
}
import org.springframework.web.WebApplicationInitializer

class MyWebApplicationInitializer : WebApplicationInitializer {

	override fun onStartup(container: ServletContext) {
		val appContext = XmlWebApplicationContext()
		appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml")

		val registration = container.addServlet("dispatcher", DispatcherServlet(appContext))
		registration.setLoadOnStartup(1)
		registration.addMapping("/")
	}
}

WebApplicationInitializer 是 Spring MVC 提供的一個介面,可確保您的實作被偵測到並自動用於初始化任何 Servlet 3 容器。WebApplicationInitializer 的抽象基底類別實作名為 AbstractDispatcherServletInitializer,透過覆寫方法來指定 servlet 對應和 DispatcherServlet 配置的位置,使註冊 DispatcherServlet 變得更加容易。

對於使用基於 Java 的 Spring 配置的應用程式,建議使用此方法,如下列範例所示

  • Java

  • Kotlin

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

	@Override
	protected Class<?>[] getRootConfigClasses() {
		return null;
	}

	@Override
	protected Class<?>[] getServletConfigClasses() {
		return new Class<?>[] { MyWebConfig.class };
	}

	@Override
	protected String[] getServletMappings() {
		return new String[] { "/" };
	}
}
class MyWebAppInitializer : AbstractAnnotationConfigDispatcherServletInitializer() {

	override fun getRootConfigClasses(): Array<Class<*>>? {
		return null
	}

	override fun getServletConfigClasses(): Array<Class<*>>? {
		return arrayOf(MyWebConfig::class.java)
	}

	override fun getServletMappings(): Array<String> {
		return arrayOf("/")
	}
}

如果您使用基於 XML 的 Spring 配置,則應直接從 AbstractDispatcherServletInitializer 擴充,如下列範例所示

  • Java

  • Kotlin

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

	@Override
	protected WebApplicationContext createRootApplicationContext() {
		return null;
	}

	@Override
	protected WebApplicationContext createServletApplicationContext() {
		XmlWebApplicationContext cxt = new XmlWebApplicationContext();
		cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
		return cxt;
	}

	@Override
	protected String[] getServletMappings() {
		return new String[] { "/" };
	}
}
class MyWebAppInitializer : AbstractDispatcherServletInitializer() {

	override fun createRootApplicationContext(): WebApplicationContext? {
		return null
	}

	override fun createServletApplicationContext(): WebApplicationContext {
		return XmlWebApplicationContext().apply {
			setConfigLocation("/WEB-INF/spring/dispatcher-config.xml")
		}
	}

	override fun getServletMappings(): Array<String> {
		return arrayOf("/")
	}
}

AbstractDispatcherServletInitializer 也提供了一種方便的方式來新增 Filter 實例,並讓它們自動對應到 DispatcherServlet,如下列範例所示

  • Java

  • Kotlin

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

	// ...

	@Override
	protected Filter[] getServletFilters() {
		return new Filter[] {
			new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
	}
}
class MyWebAppInitializer : AbstractDispatcherServletInitializer() {

	// ...

	override fun getServletFilters(): Array<Filter> {
		return arrayOf(HiddenHttpMethodFilter(), CharacterEncodingFilter())
	}
}

每個篩選器都以基於其具體類型的預設名稱新增,並自動對應到 DispatcherServlet

AbstractDispatcherServletInitializerisAsyncSupported 受保護方法提供了一個單一位置,可以在 DispatcherServlet 和對應到它的所有篩選器上啟用非同步支援。預設情況下,此旗標設定為 true

最後,如果您需要進一步自訂 DispatcherServlet 本身,您可以覆寫 createDispatcherServlet 方法。