配置前端控制器
一、DispatcherServlet 详解
在使用 Spring MVC 框架构建 Web 应用时,DispatcherServlet
是整个请求处理流程的核心。本文将深入解析DispatcherServlet
的作用、工作原理及其在 Spring MVC 架构中的关键地位。
1.DispatcherServlet 是什么?
DispatcherServlet
是 Spring MVC 框架的前端控制器(Front Controller),它是一个 Servlet(继承自HttpServlet
),负责接收所有 HTTP 请求并协调整个请求处理流程。其核心作用类似于一个中央调度器,将请求分发给合适的处理器(Controller)进行处理,并管理视图渲染和响应返回。
在 web.xml 中的典型配置如下:
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/dispatcher-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
2.DispatcherServlet 的工作原理
⑴. 核心设计模式:前端控制器模式
DispatcherServlet
采用前端控制器模式(Front Controller Pattern),所有请求都由同一个 Servlet 接收和处理。这种模式的优势在于:
- 统一请求入口,简化应用架构
- 便于实现通用功能(如权限检查、日志记录)
- 降低组件间耦合度
⑵. 请求处理流程
当客户端发送 HTTP 请求时,DispatcherServlet
的处理流程大致如下:
- 接收请求:所有匹配
url-pattern
的请求都被发送到DispatcherServlet
- 映射处理器:通过
HandlerMapping
找到处理该请求的 Controller - 调用处理器:通过
HandlerAdapter
调用 Controller 的处理方法 - 处理业务逻辑:Controller 执行相应的业务逻辑并返回
ModelAndView
- 解析视图:通过
ViewResolver
将逻辑视图名解析为具体的 View - 渲染视图:将 Model 数据填充到 View 中并返回响应给客户端
这个流程可以用以下时序图表示:
客户端请求 -> DispatcherServlet -> HandlerMapping -> Controller <- ModelAndView <- ViewResolver <- View
3.DispatcherServlet 的关键组件
DispatcherServlet
的强大功能依赖于多个协作组件,这些组件在初始化时会自动注册或通过配置文件显式注册:
⑴. HandlerMapping(处理器映射器)
负责将请求映射到具体的处理器(Controller)。常见实现:
BeanNameUrlHandlerMapping
:按 Bean 名称映射 URLRequestMappingHandlerMapping
:基于@RequestMapping
注解映射(Spring MVC 默认)
⑵. HandlerAdapter(处理器适配器)
负责调用具体的处理器。常见实现:
SimpleControllerHandlerAdapter
:处理实现Controller
接口的处理器RequestMappingHandlerAdapter
:处理基于注解的处理器(Spring MVC 默认)
⑶. HandlerExceptionResolver(异常处理器)
处理请求处理过程中抛出的异常。常见实现:
SimpleMappingExceptionResolver
:将异常映射到视图ExceptionHandlerExceptionResolver
:处理@ExceptionHandler
注解的方法
⑷. ViewResolver(视图解析器)
将逻辑视图名解析为具体的 View 对象。常见实现:
InternalResourceViewResolver
:解析 JSP 视图ThymeleafViewResolver
:解析 Thymeleaf 模板JsonViewResolver
:返回 JSON 格式响应
⑸. LocaleResolver(区域解析器)
解析客户端的区域信息,用于国际化支持。常见实现:
AcceptHeaderLocaleResolver
:基于 HTTP 请求头的 Accept-LanguageCookieLocaleResolver
:基于 Cookie 保存区域信息
⑹. ThemeResolver(主题解析器)
解析应用的主题。常见实现:
FixedThemeResolver
:固定主题CookieThemeResolver
:基于 Cookie 的主题
⑺. MultipartResolver(文件上传解析器)
处理文件上传请求。常见实现:
StandardServletMultipartResolver
:基于 Servlet 3.0 的文件上传CommonsMultipartResolver
:基于 Apache Commons FileUpload
4.DispatcherServlet 的初始化过程
当 Web 应用启动时,DispatcherServlet
会进行初始化,主要步骤包括:
-
创建 WebApplicationContext:
- 加载 Spring 配置文件(如
dispatcher-servlet.xml
或 Java 配置类) - 创建并注册 Spring MVC 所需的各种组件
- 加载 Spring 配置文件(如
-
初始化策略组件:
- 检查并注册
HandlerMapping
、HandlerAdapter
等组件 - 如果没有显式配置,会使用默认组件
- 检查并注册
-
注册到 Servlet 容器:
- 作为普通 Servlet 注册到 Servlet 容器中
- 接收所有匹配
url-pattern
的请求
5.DispatcherServlet 的配置方式
⑴. 传统 XML 配置
在web.xml
中配置DispatcherServlet
:
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/dispatcher-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
⑵. Java 配置(Spring 3.0+)
使用WebApplicationInitializer
接口:
public class AppInitializer implements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext servletContext) {// 创建根应用上下文AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();rootContext.register(AppConfig.class);// 创建DispatcherServlet应用上下文AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();dispatcherContext.register(DispatcherConfig.class);// 注册DispatcherServletServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));dispatcher.setLoadOnStartup(1);dispatcher.addMapping("/");}
}
⑶.Spring Boot 自动配置
Spring Boot 会自动配置DispatcherServlet
,默认映射路径为/
,无需手动配置。
二、<init-param>
标签
<init-param>
标签中的 contextConfigLocation
参数是 Spring MVC 中 DispatcherServlet 的核心配置项,它的作用是指定 Spring MVC 应用上下文的配置文件位置。下面详细解释其功能和用法:
1.核心作用:加载 Spring MVC 配置
当 DispatcherServlet 初始化时,它会创建一个 WebApplicationContext(Spring 的应用上下文),并从指定的配置文件中加载 Bean 定义。contextConfigLocation
参数就是用来告诉 DispatcherServlet 从哪里读取这些配置文件。
示例配置:
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value> <!-- 指定配置文件位置 --></init-param><load-on-startup>1</load-on-startup>
</servlet>
三、总结
这个配置文件片段是典型的 Spring MVC 框架前端控制器(DispatcherServlet)的配置,位于web.xml
中(Servlet 3.0 + 之前的标准 Web 应用配置文件)。我来为你解析其核心作用和配置项:
配置的核心功能
这段配置的主要作用是注册 Spring MVC 的前端控制器DispatcherServlet
,并将其映射到所有 URL 请求(/
)。这是 Spring MVC 应用的基础配置,负责接收所有 HTTP 请求并分发给相应的处理器。
关键配置项解析
1.Servlet 注册
<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>...
</servlet>
servlet-name
:定义 Servlet 的名称,用于后续映射和引用servlet-class
:指定 Spring MVC 的核心前端控制器类
2.配置文件位置
<init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value>
</init-param>
- 指定 Spring MVC 的配置文件路径为
classpath:springmvc.xml
- 这个文件通常包含控制器 (Controller)、视图解析器 (ViewResolver)、拦截器 (Interceptor) 等配置
3.启动加载优先级
<load-on-startup>1</load-on-startup>
- 值为
1
表示在 Web 容器启动时立即初始化这个 Servlet - 提高首次请求的响应速度(避免首次请求时才初始化)
4.URL 映射
<servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
- 将
springmvc
这个 Servlet 映射到所有 URL(/
) - 意味着所有 HTTP 请求都会先到达
DispatcherServlet
工作原理
当客户端发送请求到应用时:
- 所有请求首先被
DispatcherServlet
接收DispatcherServlet
根据请求 URL 和 HandlerMapping 找到对应的 Controller- Controller 处理请求并返回 ModelAndView
- DispatcherServlet 根据 ViewResolver 将逻辑视图名解析为实际视图
- 最终将响应返回给客户端
注意事项
- 与
/*
的区别:使用/
而不是/*
,避免与 JSP 请求冲突(/*
会拦截 JSP 请求导致无法正确渲染)- 配置文件位置:确保
springmvc.xml
存在于类路径根目录下- 其他必要配置:这个配置只是基础,完整的 MVC 功能还需要在
springmvc.xml
中配置视图解析器、注解扫描等