前言
本文参考自《看透SpringMVC》韩路彪著;SpringMVC版本为4.2.6。
简介
DispatcherServlet是SpringMVC最核心的类,处理请求的整个过程的顶层设计都在这个类中。
类图
核心方法
重要概念
Handler(干活的工具)
处理器;对应Controller层,有多种表现形式(可以是类或方法等等),类型为Object
HandlerMapping(根据干的活去找对应工具的方法)
用来查找Handler;每一个请求都需要一个Handler来处理,接收到一个请求过后,具体使用哪个Handler来处理呢?这就是HandlerMapping要做的事情
HandlerAdapter(使用工具干活的人)
Servlet处理方法的结构是固定的,都是以Request和Response为参数的方法。而HandlerAdapter让处理变得更加灵活
initStrategies
初始化SpringMVC策略组件,入口是在HttpServletBean的init方法,各组件默认配置在spring-webmvc-4.2.6.RELEASE.jar里面的DispatcherServlet.properties中。
protected void initStrategies(ApplicationContext context) {
//处理上传请求,没有默认配置
initMultipartResolver(context);
//从Request中解析出Locale
initLocaleResolver(context);
//主题解析
initThemeResolver(context);
//映射处理器,从Request中查找Handler和Interceptors
initHandlerMappings(context);
//处理器适配,使用Handler执行具体的业务逻辑
initHandlerAdapters(context);
//解析请求过程中产生的异常
initHandlerExceptionResolvers(context);
//Handler返回View为空时,根据request获取viewName
initRequestToViewNameTranslator(context);
//视图解析器
initViewResolvers(context);
//用来管理FlashMap,而FlashMap用于在Redirect时传递参数
initFlashMapManager(context);
}
doDispatch
此方法非常简洁,包含整个请求的处理过程,核心代码只有4句。
根据Request找到Handler列表内容
mappedHandler = getHandler(processedRequest);根据Handler找到对应的HandlerAdapter
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());用HandlerAdapter处理Handler
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());找到View并渲染输出
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);