Spring MVC DispatcherServlet前端控制器
DispatcherServlet 是 Spring MVC 的中央调度器,所有请求都经过它统一分发处理。
核心职责
| 职责 | 说明 |
|---|---|
| 请求分发 | 将请求路由到对应的 Controller |
| 组件协调 | 组织 HandlerMapping、HandlerAdapter 等组件 |
| 异常处理 | 统一处理请求处理过程中的异常 |
| 视图渲染 | 协调 ViewResolver 完成视图解析 |
配置方式
web.xml 配置
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/spring-mvc.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>
Java 配置
Java
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) {
AnnotationConfigWebApplicationContext context =
new AnnotationConfigWebApplicationContext();
context.register(WebConfig.class);
DispatcherServlet servlet = new DispatcherServlet(context);
ServletRegistration.Dynamic registration =
servletContext.addServlet("dispatcher", servlet);
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
核心方法
doDispatch
Java
protected void doDispatch(HttpServletRequest request,
HttpServletResponse response) throws Exception {
// 1. 获取处理器执行链
mappedHandler = getHandler(processedRequest);
// 2. 获取处理器适配器
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 3. 执行拦截器前置处理
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
// 4. 执行处理器
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// 5. 执行拦截器后置处理
mappedHandler.applyPostHandle(processedRequest, response, mv);
// 6. 解析并渲染视图
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
默认组件
DispatcherServlet 默认加载以下组件(配置在 DispatcherServlet.properties):
| 组件 | 默认实现 |
|---|---|
| HandlerMapping | RequestMappingHandlerMapping |
| HandlerAdapter | RequestMappingHandlerAdapter |
| ViewResolver | InternalResourceViewResolver |
| HandlerExceptionResolver | ExceptionHandlerExceptionResolver |
特殊配置
Java
@Configuration
public class WebConfig implements WebMvcConfigurer {
// 配置静态资源处理
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
DispatcherServlet 拦截 "/" 会覆盖默认 Servlet,需配置静态资源处理。
要点总结
- DispatcherServlet 是前端控制器,统一调度所有请求
- 支持_web.xml_和 Java 代码两种配置方式
- doDispatch 是核心方法,完成请求处理全流程
- 默认加载一组标准组件,可自定义覆盖
📝 发现内容有误?点击此处直接编辑