设为首页 加入收藏

TOP

Spring入门进阶之DispatcherServlet源码分析(四)
2018-01-17 13:05:27 】 浏览:959
Tags:Spring 入门 进阶 DispatcherServlet 源码 分析
bsp;               restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}


从上面源码可以看出doService方法里也是做了许多准备工作,可以看出Spring将localeResolvder、themeResolver等设置在request中,最后传入doDispatch方法,跟进源码:


protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;


    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);


    try {
        ModelAndView mv = null;
        Exception dispatchException = null;


        try {
            // 如果request是MultipartContent类型的话则转为MultipartHttpServletRequest类型
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);


            // 根据request寻找对应的Handler
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null || mappedHandler.getHandler() == null) {
                // 找不到Handler则返回错误信息
                noHandlerFound(processedRequest, response);
                return;
            }


            // 根据handler找对应的HandlerAdapter
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());


            // 如果当前handler支持last-modified头处理
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
                if (logger.isDebugEnabled()) {
                    logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified);
                }
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }


            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }


            // 激活handler并返回视图
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/10/10
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java中BigDecimal的基本运算 下一篇Java静态代码块使用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目