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

  

原文地址:http://www.cnblogs.com/daimenglaoshi/p/16793312.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性