DispatcherServlet

Spring MVC,如同許多其他 Web 框架,是圍繞著前端控制器模式設計的,其中一個中央 Servlet,即 DispatcherServlet,提供了一個用於請求處理的共享演算法,而實際工作則由可配置的委派組件執行。這種模型很靈活,並支援多樣化的工作流程。

DispatcherServlet,如同任何 Servlet,需要根據 Servlet 規範使用 Java 配置或在 web.xml 中宣告和映射。反過來,DispatcherServlet 使用 Spring 配置來發現它需要的委派組件,以進行請求映射、視圖解析、例外處理、以及更多

以下 Java 配置範例註冊並初始化 DispatcherServlet,Servlet 容器會自動偵測到它(請參閱 Servlet 配置

  • 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 並覆寫特定方法(請參閱 Context 階層 下的範例)。
對於程式化使用案例,GenericWebApplicationContext 可以用作 AnnotationConfigWebApplicationContext 的替代方案。 有關詳細資訊,請參閱 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 不是掛鉤到 Servlet 容器的生命週期,而是使用 Spring 配置來引導自身和嵌入式 Servlet 容器。 FilterServlet 宣告會在 Spring 配置中偵測到,並註冊到 Servlet 容器。 有關更多詳細資訊,請參閱 Spring Boot 文件