DispatcherServlet
Spring MVC,像许多其他 web 框架一样,是围绕前控制器模式设计的,其中一个中央 Servlet
,即 DispatcherServlet
,提供了一个共享的请求处理算法,而实际的工作由可配置的委托组件执行。这个模型灵活且支持多样化的工作流程。
DispatcherServlet
和任何 Servlet
一样,需要根据 Servlet 规范通过 Java 配置或在 web.xml
中进行声明和映射。反过来,DispatcherServlet
使用 Spring 配置来发现它所需的委托组件,以进行请求映射、视图解析、异常处理,以及更多。
以下 Java 配置示例注册并初始化 DispatcherServlet
,该 Servlet 由 Servlet 容器自动检测(请参见 Servlet Config):
- 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
并重写特定方法(请参见 上下文层次结构 下的示例)。
对于程序化使用案例,可以使用 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 容器。Filter
和 Servlet
声明在 Spring 配置中被检测并注册到 Servlet 容器中。有关更多详细信息,请参见 Spring Boot 文档。
章节摘要
📄️ 上下文层次结构
DispatcherServlet 期望一个 WebApplicationContext(一个普通 ApplicationContext 的扩展)用于其自身的配置。WebApplicationContext 与 ServletContext 以及它所关联的 Servlet 之间有一个链接。它还绑定到 ServletContext,以便应用程序可以使用 RequestContextUtils 上的静态方法查找 WebApplicationContext,如果它们需要访问它。
📄️ 特殊 Bean 类型
在 Reactive 栈中查看等效项
📄️ Web MVC 配置
请参阅 Reactive 技术栈中的等效内容
📄️ Servlet 配置
在 Servlet 环境中,您可以选择以编程方式配置 Servlet 容器,作为 web.xml 文件的替代或与其结合使用。以下示例注册了一个 DispatcherServlet:
📄️ 处理
在 Reactive 栈中查看等效项
📄️ 路径匹配
Servlet API 将完整的请求路径暴露为 requestURI,并进一步将其细分为 contextPath、servletPath 和 pathInfo,这些值根据 Servlet 的映射方式而有所不同。基于这些输入,Spring MVC 需要确定用于映射处理程序的查找路径,该路径应排除 contextPath 和任何 servletMapping 前缀(如果适用)。
📄️ 拦截
所有 HandlerMapping 实现都支持处理程序拦截,这在您想要在请求之间应用功能时非常有用。一个 HandlerInterceptor 可以实现以下内容:
📄️ 异常
在 Reactive 堆栈中查看等效内容
📄️ 视图分辨率
在 Reactive 栈中查看等效项
📄️ 区域设置
Spring 架构的大部分部分支持国际化,Spring web MVC 框架也是如此。 DispatcherServlet 允许您通过使用客户端的区域设置自动解析消息。这是通过 LocaleResolver 对象完成的。
📄️ 主题
您可以应用 Spring Web MVC 框架主题来设置应用程序的整体外观,从而增强用户体验。主题是一组静态资源,通常是样式表和图像,影响应用程序的视觉风格。
📄️ 多部分解析器
在 Reactive 栈中查看等效项
📄️ 日志记录
在 Reactive 栈中查看等效项