springMVC doDispatch方法
2015-06-29 15:18
423 查看
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest processedRequest = request; HandlerExecutionChain mappedHandler = null; int interceptorIndex = -1; // Expose current LocaleResolver and request as LocaleContext. LocaleContext previousLocaleContext = LocaleContextHolder.getLocaleContext(); LocaleContextHolder.setLocaleContext(buildLocaleContext(request), this.threadContextInheritable); // Expose current RequestAttributes to current thread. RequestAttributes previousRequestAttributes = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes requestAttributes = new ServletRequestAttributes(request); RequestContextHolder.setRequestAttributes(requestAttributes, this.threadContextInheritable); if (logger.isTraceEnabled()) { logger.trace("Bound request context to thread: " + request); } try { ModelAndView mv = null; boolean errorView = false; try { processedRequest = checkMultipart(request);//检查是否是multipartrequest请求,如果是,就形成将request封装为multipartrequest,如果不是就返回原request // Determine handler for the current request. mappedHandler = getHandler(processedRequest, false);//通过handlermapping得到mappedhandler if (mappedHandler == null || mappedHandler.getHandler() == null) { noHandlerFound(processedRequest, response); return; } // Apply preHandle methods of registered interceptors.执行拦截器的prehandle方法。 HandlerInterceptor[] interceptors = mappedHandler.getInterceptors(); if (interceptors != null) { for (int i = 0; i < interceptors.length; i++) { HandlerInterceptor interceptor = interceptors[i]; if (!interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())) { triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null); return; } interceptorIndex = i; } } // Actually invoke the handler.得到handleradapter HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); mv = ha.handle(processedRequest, response, mappedHandler.getHandler());//执行相关操作 // Do we need view name translation? if (mv != null && !mv.hasView()) { mv.setViewName(getDefaultViewName(request)); } // Apply postHandle methods of registered interceptors.执行拦截器的posthandle方法。 if (interceptors != null) { for (int i = interceptors.length - 1; i >= 0; i--) { HandlerInterceptor interceptor = interceptors[i]; interceptor.postHandle(processedRequest, response, mappedHandler.getHandler(), mv); } } } 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); } // Did the handler return a view to render?//渲染视图 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"); } } // Trigger after-completion for successful outcome. triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);//执行拦截器的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); // Trigger after-completion for thrown exception. triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex); throw ex; } finally { // Clean up any resources used by a multipart request. if (processedRequest != request) { cleanupMultipart(processedRequest); } // Reset thread-bound context. RequestContextHolder.setRequestAttributes(previousRequestAttributes, this.threadContextInheritable); LocaleContextHolder.setLocaleContext(previousLocaleContext, this.threadContextInheritable); // Clear request attributes. requestAttributes.requestCompleted(); if (logger.isTraceEnabled()) { logger.trace("Cleared thread-bound request context: " + request); } } }
相关文章推荐
- 再次进入程序,Java静态变量与成员变量的不同表现和对单例模式的思考
- 传智博客(JavaWeb方面的所有知识)听课记录(经典)
- Java多线程协作(wait、notify、notifyAll)
- 用java 配置方式 搭建springmvc + spring data jpg + mysql
- java.lang.annotation-jdk的注解原理与使用
- java 实用片段整理
- storm-0.9.5单机配置
- Java字符串工具类
- Spring.Net-创建对象
- Eclipse中jvm运行库的Access restriction问题的解决方法
- JAVA中堆,栈和常量池
- java的反编译
- JavaWeb学习笔记——开发动态WEB资源(三)显示当前时间
- Java人民币小写转大写
- spring mvc入门
- Java web框架之用户登录需求设计
- java正则表达式验证邮箱、IP地址、手机号码
- java学习之旅42--面向对象_15_继承_组合
- myeclipse 配置weblogic
- 如何在eclipse jee中创建Maven project并且转换为Dynamic web project