DispatcherServlet

Spring MVC は、他の多くの Web フレームワークと同様に、フロントコントローラーパターンを中心に設計されており、主要な Servlet である DispatcherServlet がリクエスト処理の共有アルゴリズムを提供し、実際の作業は構成可能なデリゲートコンポーネントによって実行されます。このモデルは柔軟で、多様なワークフローをサポートします。

DispatcherServlet は、他の Servlet と同様に、Java 構成を使用するか、web.xml でサーブレット仕様に従って宣言およびマップする必要があります。次に、DispatcherServlet は Spring 構成を使用して、リクエストマッピング、ビュー解決、例外処理などに必要なデリゲートコンポーネントを検出します。

次の Java 構成の例では、DispatcherServlet を登録および初期化します。これは、サーブレットコンテナーによって自動検出されます(サーブレット構成を参照)。

  • Java

  • Kotlin

public class MyWebApplicationInitializer implements WebApplicationInitializer {

	@Override
	public void onStartup(ServletContext servletContext) {

		// Load Spring web application configuration
		AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
		context.register(AppConfig.class);

		// Create and register the DispatcherServlet
		DispatcherServlet servlet = new DispatcherServlet(context);
		ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
		registration.setLoadOnStartup(1);
		registration.addMapping("/app/*");
	}
}
class MyWebApplicationInitializer : WebApplicationInitializer {

	override fun onStartup(servletContext: ServletContext) {

		// Load Spring web application configuration
		val context = AnnotationConfigWebApplicationContext()
		context.register(AppConfig::class.java)

		// Create and register the DispatcherServlet
		val servlet = DispatcherServlet(context)
		val registration = servletContext.addServlet("app", servlet)
		registration.setLoadOnStartup(1)
		registration.addMapping("/app/*")
	}
}
ServletContext API を直接使用することに加えて、AbstractAnnotationConfigDispatcherServletInitializer を継承し、特定のメソッドをオーバーライドすることもできます(コンテキスト階層の例を参照)。
プログラムによるユースケースでは、AnnotationConfigWebApplicationContext の代わりに GenericWebApplicationContext を使用できます。詳細については、GenericWebApplicationContext javadoc を参照してください。

web.xml 構成の次の例は、DispatcherServlet を登録および初期化します。

<web-app>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/app-context.xml</param-value>
	</context-param>

	<servlet>
		<servlet-name>app</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value></param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>app</servlet-name>
		<url-pattern>/app/*</url-pattern>
	</servlet-mapping>

</web-app>
Spring Boot は、異なる初期化シーケンスに従います。Spring Boot は、サーブレットコンテナーのライフサイクルにフックするのではなく、Spring 構成を使用して、自身と組み込みサーブレットコンテナーをブートストラップします。Filter および Servlet 宣言は、Spring 構成で検出され、サーブレットコンテナーに登録されます。詳細については、Spring Boot ドキュメントを参照してください。