DispatcherServlet类讲解

=================下面是类定义以及类注释的一些翻译,还需要进行修改。=================

/**

"serial"  DispatcherServlet
}

========================下面是这个类的部分比较重要的属性========================

    /** MultipartResolver used by this servlet */private MultipartResolver multipartResolver; /** LocaleResolver used by this servlet */private LocaleResolver localeResolver;/** ThemeResolver used by this servlet */private ThemeResolver themeResolver;/** List of HandlerMappings used by this servlet */private List<HandlerMapping> handlerMappings;   //处理器映射列表/** List of HandlerAdapters used by this servlet */private List<HandlerAdapter> handlerAdapters;   //处理器适配器列表/** List of HandlerExceptionResolvers used by this servlet */private List<HandlerExceptionResolver> handlerExceptionResolvers; //处理器异常解析器列表/** RequestToViewNameTranslator used by this servlet */private RequestToViewNameTranslator viewNameTranslator;/** FlashMapManager used by this servlet */private FlashMapManager flashMapManager;/** List of ViewResolvers used by this servlet */private List<ViewResolver> viewResolvers; //视图解析器列表

============================下面是类的无参构造器============================

/** * Create a new {@code DispatcherServlet} that will create its own internal web     * application context based on defaults and values provided through servlet     * init-params. Typically used in Servlet 2.5 or earlier environments, where the only     * option for servlet registration is through {@code web.xml} which requires the use     * of a no-arg constructor.     * <p>Calling {@link #setContextConfigLocation} (init-param 'contextConfigLocation')     * will dictate which XML files will be loaded by the     * {@linkplain #DEFAULT_CONTEXT_CLASS default XmlWebApplicationContext}     * <p>Calling {@link #setContextClass} (init-param 'contextClass') overrides the     * default {@code XmlWebApplicationContext} and allows for specifying an alternative class,     * such as {@code AnnotationConfigWebApplicationContext}.     * <p>Calling {@link #setContextInitializerClasses} (init-param 'contextInitializerClasses')     * indicates which {@code ApplicationContextInitializer} classes should be used to     * further configure the internal application context prior to refresh().     * @see #DispatcherServlet(WebApplicationContext)     *      */public DispatcherServlet() {super();        setDispatchOptionsRequest(true);    }

=================下面是initStrategies(ApplicationContext context)方法=================

主要是初始化上面提到的部分重要属性。

    //初始化这个DispatcherServlet使用到的策略对象。这个方法有可能会被子类覆盖。protected void initStrategies(ApplicationContext context) {        initMultipartResolver(context);        initLocaleResolver(context);        initThemeResolver(context);
        /*       *          *             */             initHandlerMappings(context);
        initHandlerExceptionResolvers(context);        initRequestToViewNameTranslator(context);        initViewResolvers(context);        initFlashMapManager(context);    }

========================下面是DispatherServlet的doService()方法==================

        doService(HttpServletRequest request, HttpServletResponse response) = WebAsyncUtils.getAsyncManager(request).hasConcurrentResult() ? " resumed" : """DispatcherServlet with name '" + getServletName() + "'" + resumed +                    " processing " + request.getMethod() + " request for [" + getRequestUri(request) + "]"<String, Object> attributesSnapshot = =  HashMap<String, Object><?> attrNames == (.cleanupAfterInclude || attrName.startsWith("org.springframework.web.servlet"=  (inputFlashMap !=  (! (attributesSnapshot !=

=========================================================================

  doDispatch(HttpServletRequest request, HttpServletResponse response) ==  multipartRequestParsed = WebAsyncManager asyncManager == = processedRequest == (processedRequest !=mappedHandler = (mappedHandler ==  || mappedHandler.getHandler() == HandlerAdapter ha =String method = isGet = "GET" (isGet || "HEAD" lastModified ="Last-Modified value for [" + getRequestUri(request) + "] is: " + ( ServletWebRequest(request, response).checkNotModified(lastModified) && (!mv ==dispatchException =  NestedServletException("Handler dispatch failed" NestedServletException("Handler processing failed" (mappedHandler !=

=========================================================================

  /** * Return the HandlerExecutionChain for this request.     * <p>Tries all handler mappings in order.     * @param request current HTTP request     * @return the HandlerExecutionChain, or {@code null} if no handler could be found     */protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {for (HandlerMapping hm : this.handlerMappings) {if (logger.isTraceEnabled()) {                logger.trace("Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");            }            HandlerExecutionChain handler = hm.getHandler(request);if (handler != null) {return handler;            }        }return null;    }

=========================================================================

 /** * Render the given ModelAndView.     * <p>This is the last stage in handling a request. It may involve resolving the view by name.     * @param mv the ModelAndView to render     * @param request current HTTP servlet request     * @param response current HTTP servlet response     * @throws ServletException if view is missing or cannot be resolved     * @throws Exception if there's a problem rendering the view     */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.resolveLocale(request);        response.setLocale(locale);        View view;if (mv.isReference()) {// We need to resolve the view name.view = resolveViewName(mv.getViewName(), 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.isDebugEnabled()) {            logger.debug("Rendering view [" + view + "] in DispatcherServlet with name '" + getServletName() + "'");        }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 + "] in DispatcherServlet with name '" +getServletName() + "'", ex);            }throw ex;        }    }

=========================================================================

 /** * Resolve the given view name into a View object (to be rendered).     * <p>The default implementations asks all ViewResolvers of this dispatcher.     * Can be overridden for custom resolution strategies, potentially based on     * specific model attributes or request parameters.     * @param viewName the name of the view to resolve     * @param model the model to be passed to the view     * @param locale the current locale     * @param request current HTTP servlet request     * @return the View object, or {@code null} if none found     * @throws Exception if the view cannot be resolved     * (typically in case of problems creating an actual View object)     * @see ViewResolver#resolveViewName     */protected View resolveViewName(String viewName, Map<String, Object> model, Locale locale,            HttpServletRequest request) throws Exception {for (ViewResolver viewResolver : this.viewResolvers) {            View view = viewResolver.resolveViewName(viewName, locale);if (view != null) {return view;            }        }return null;    }

=========================================================================

=========================================================================

=========================================================================

=========================================================================

=========================================================================

以上就是DispatcherServlet类讲解的详细内容,更多请关注其它相关文章!

夫妇一条心,泥土变黄金。

DispatcherServlet类讲解

相关文章:

你感兴趣的文章:

标签云: