サーブレット構成

サーブレット環境では、代替として、または 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 コンテナーを初期化するために自動的に使用されるようにします。AbstractDispatcherServletInitializer という名前の WebApplicationInitializer の抽象基本クラスの実装により、サーブレットマッピングと 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 にマップされます。

AbstractDispatcherServletInitializer の isAsyncSupported 保護メソッドは、DispatcherServlet とそれにマッピングされたすべてのフィルターで非同期サポートを有効にする単一の場所を提供します。デフォルトでは、このフラグは true に設定されています。

最後に、DispatcherServlet 自体をさらにカスタマイズする必要がある場合は、createDispatcherServlet メソッドをオーバーライドできます。