核心分发器DispatcherServlet

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了核心分发器DispatcherServlet相关的知识,希望对你有一定的参考价值。

核心分发器DispatcherServlet
1.5.1 DispatcherServlet
DispatcherServlet是Spring MVC的"灵魂"和"心脏",它负责接受HTTP请求并协调 Spring MVC的各个组件完成请求处理的工作。和任何Servlet一样,用户必须在web.xml中配置好DispatcherServlet。

1.5.2 DispatcherServlet介绍
​ DispatcherServlet是前端控制器设计模式的实现,提供spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。

1.5.3 DispatcherServlet主要职责
DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:

1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
3、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
4、通过ViewResolver解析逻辑视图名到具体视图实现;
5、本地化解析;
6、渲染具体的视图等;
7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。
1.5.4 DispatcherServlet核心代码

//前端控制器分派方法 
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
int interceptorIndex = -1;

try
ModelAndView mv;
boolean errorView = false;

try
//检查是否是请求是否是multipart(如文件上传),如果是将通过MultipartResolver解析
processedRequest = checkMultipart(request);
//步骤2、请求到处理器(页面控制器)的映射,通过HandlerMapping进行映射
mappedHandler = getHandler(processedRequest, false);
if (mappedHandler == null || mappedHandler.getHandler() == null)
noHandlerFound(processedRequest, response);
return;

//步骤3、处理器适配,即将我们的处理器包装成相应的适配器(从而支持多种类型的处理器)
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

// 304 Not Modified缓存支持
//此处省略具体代码

// 执行处理器相关的拦截器的预处理(HandlerInterceptor.preHandle)
//此处省略具体代码

// 步骤4、由适配器执行处理器(调用处理器相应功能处理方法)
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

// Do we need view name translation?
if (mv != null && !mv.hasView())
mv.setViewName(getDefaultViewName(request));


// 执行处理器相关的拦截器的后处理(HandlerInterceptor.postHandle)
//此处省略具体代码

catch (ModelAndViewDefiningException ex)
logger.debug("ModelAndViewDefiningException encountered", ex);
mv = ex.getModelAndView();

catch (Exception ex)
Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
mv = processHandlerException(processedRequest, response, handler, ex);
errorView = (mv != null);


//步骤5 步骤6、解析视图并进行视图的渲染
//步骤5 由ViewResolver解析View(viewResolver.resolveViewName(viewName, locale))
//步骤6 视图在渲染时会把Model传入(view.render(mv.getModelInternal(), request, response);)
if (mv != null && !mv.wasCleared())
render(mv, processedRequest, response);
if (errorView)
WebUtils.clearErrorRequestAttributes(request);


else
if (logger.isDebugEnabled())
logger.debug("Null ModelAndView returned to DispatcherServlet with name " + getServletName() +
": assuming HandlerAdapter completed request handling");



// 执行处理器相关的拦截器的完成后处理(HandlerInterceptor.afterCompletion)
//此处省略具体代码

catch (Exception ex)
// Trigger after-completion for thrown exception.
triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);
throw ex;

catch (Error err)
ServletException ex = new NestedServletException("Handler processing failed", err);
triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);
throw ex;

finally
if (processedRequest != request)
cleanupMultipart(processedRequest);



以上是关于核心分发器DispatcherServlet的主要内容,如果未能解决你的问题,请参考以下文章

DispatcherServlet源码注解分析

Spring HTTP请求过程

springmvc框架中的核心对象DispatcherServlet

SpringMVC 主要组件说明

前置控制器一DispatcherServlet

评职知识|我国都有哪些核心期刊?