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 ドキュメントを参照してください。 |