首页 > 其他分享 >核心分发器DispatcherServlet

核心分发器DispatcherServlet

时间:2022-10-14 23:22:11浏览次数:47  
标签:分发 处理器 核心 mappedHandler mv ex DispatcherServlet processedRequest

核心分发器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); 
            } 
        } 
    } 
 

  

标签:分发,处理器,核心,mappedHandler,mv,ex,DispatcherServlet,processedRequest
From: https://www.cnblogs.com/daimenglaoshi/p/16793312.html

相关文章