org.springframework.web.servlet.DispatcherServlet-doDispatch-processDispatchResult执行介绍

    技术2023-08-15  78

    org.springframework.web.servlet.DispatcherServlet-doDispatch

    /** * 8对页面渲染 */ processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

    org.springframework.web.servlet.DispatcherServlet#processDispatchResult

    private void processDispatchResult(HttpServletRequest request, HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler, @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception { boolean errorView = false; //判断 是否异常 if (exception != null) { if (exception instanceof ModelAndViewDefiningException) { logger.debug("ModelAndViewDefiningException encountered", exception); mv = ((ModelAndViewDefiningException) exception).getModelAndView(); } else { Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null); mv = processHandlerException(request, response, handler, exception); errorView = (mv != null); } } /** * mv是否为空,json就为空 */ // Did the handler return a view to render? if (mv != null && !mv.wasCleared()) { //渲染视图 render(mv, request, response); if (errorView) { WebUtils.clearErrorRequestAttributes(request); } }

    org.springframework.web.servlet.DispatcherServlet#render

    protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception { /** * 国际化设置 */ // Determine locale for request and apply it to the response. Locale locale = (this.localeResolver != null ? this.localeResolver.resolveLocale(request) : request.getLocale()); response.setLocale(locale); /** * 获取ViewName */ View view; //success String viewName = mv.getViewName(); if (viewName != null) { /** * 使用视图解析器获取完整的名称 */ // We need to resolve the view name. view = resolveViewName(viewName, mv.getModelInternal(), locale, request); if (view == null) { throw new ServletException("Could not resolve view with name '" + mv.getViewName() + "' in servlet with name '" + getServletName() + "'"); } } else { // No need to lookup: the ModelAndView object contains the actual View object. view = mv.getView(); if (view == null) { throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " + "View object in servlet with name '" + getServletName() + "'"); } } // Delegate to the View object for rendering. if (logger.isTraceEnabled()) { logger.trace("Rendering view [" + view + "] "); } try { if (mv.getStatus() != null) { response.setStatus(mv.getStatus().value()); } /** * 渲染使用视图解析器 */ view.render(mv.getModelInternal(), request, response); } catch (Exception ex) { if (logger.isDebugEnabled()) { logger.debug("Error rendering view [" + view + "]", ex); } throw ex; } }

    resolveViewName

    createView

    org.springframework.web.servlet.view.AbstractCachingViewResolver#createView

    org.springframework.web.servlet.view.UrlBasedViewResolver#loadView org.springframework.web.servlet.view.InternalResourceViewResolver#buildView

    org.springframework.web.servlet.view.UrlBasedViewResolver#buildView

    org.springframework.web.servlet.view.AbstractView#render

    public void render(@Nullable Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception { if (logger.isDebugEnabled()) { logger.debug("View " + formatViewName() + ", model " + (model != null ? model : Collections.emptyMap()) + (this.staticAttributes.isEmpty() ? "" : ", static attributes " + this.staticAttributes)); } /** * 得到数据Map信合 */ Map<String, Object> mergedModel = createMergedOutputModel(model, request, response); /** * 设置响应头 */ prepareResponse(request, response); /** * 数据渲染 */ renderMergedOutputModel(mergedModel, getRequestToExpose(request), response); }

    org.springframework.web.servlet.view.InternalResourceView#renderMergedOutputModel

    protected void renderMergedOutputModel( Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { //循环将数据放入Request域中 request.setAttribute(name, value); jsp中${}取值 // Expose the model object as request attributes. exposeModelAsRequestAttributes(model, request); // Expose helpers as request attributes, if any. exposeHelpers(request); // Determine the path for the request dispatcher. String dispatcherPath = prepareForRendering(request, response); // Obtain a RequestDispatcher for the target resource (typically a JSP). RequestDispatcher rd = getRequestDispatcher(request, dispatcherPath); if (rd == null) { throw new ServletException("Could not get RequestDispatcher for [" + getUrl() + "]: Check that the corresponding file exists within your web application archive!"); } // If already included or response already committed, perform include, else forward. if (useInclude(request, response)) { response.setContentType(getContentType()); if (logger.isDebugEnabled()) { logger.debug("Including [" + getUrl() + "]"); } rd.include(request, response); } else { // Note: The forwarded resource is supposed to determine the content type itself. if (logger.isDebugEnabled()) { logger.debug("Forwarding to [" + getUrl() + "]"); } //跳转页面 rd.forward(request, response); } }

    org.springframework.web.servlet.view.AbstractView#exposeModelAsRequestAttributes

    Processed: 0.010, SQL: 9