美文网首页3
DispatcherServlet 详细解析

DispatcherServlet 详细解析

作者: happyJared | 来源:发表于2019-10-06 07:39 被阅读0次

    首先看下 DispatcherServlet 源码:

    package org.springframework.web.servlet;
    
    @SuppressWarnings("serial")
    public class DispatcherServlet extends FrameworkServlet {
    
        public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";
        public static final String LOCALE_RESOLVER_BEAN_NAME = "localeResolver";
        public static final String THEME_RESOLVER_BEAN_NAME = "themeResolver";
        public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
        public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
        public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME = "handlerExceptionResolver";
        public static final String REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME = "viewNameTranslator";
        public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
        public static final String FLASH_MAP_MANAGER_BEAN_NAME = "flashMapManager";
        public static final String WEB_APPLICATION_CONTEXT_ATTRIBUTE = DispatcherServlet.class.getName() + ".CONTEXT";
        public static final String LOCALE_RESOLVER_ATTRIBUTE = DispatcherServlet.class.getName() + ".LOCALE_RESOLVER";
        public static final String THEME_RESOLVER_ATTRIBUTE = DispatcherServlet.class.getName() + ".THEME_RESOLVER";
        public static final String THEME_SOURCE_ATTRIBUTE = DispatcherServlet.class.getName() + ".THEME_SOURCE";
        public static final String INPUT_FLASH_MAP_ATTRIBUTE = DispatcherServlet.class.getName() + ".INPUT_FLASH_MAP";
        public static final String OUTPUT_FLASH_MAP_ATTRIBUTE = DispatcherServlet.class.getName() + ".OUTPUT_FLASH_MAP";
        public static final String FLASH_MAP_MANAGER_ATTRIBUTE = DispatcherServlet.class.getName() + ".FLASH_MAP_MANAGER";
        public static final String EXCEPTION_ATTRIBUTE = DispatcherServlet.class.getName() + ".EXCEPTION";
        public static final String PAGE_NOT_FOUND_LOG_CATEGORY = "org.springframework.web.servlet.PageNotFound";
        private static final String DEFAULT_STRATEGIES_PATH = "DispatcherServlet.properties";
        protected static final Log pageNotFoundLogger = LogFactory.getLog(PAGE_NOT_FOUND_LOG_CATEGORY);
        private static final Properties defaultStrategies;
    
        static {
            try {
                ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);
                defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
            }
            catch (IOException ex) {
                throw new IllegalStateException("Could not load 'DispatcherServlet.properties': " + ex.getMessage());
            }
        }
    
        /** Detect all HandlerMappings or just expect "handlerMapping" bean? */
        private boolean detectAllHandlerMappings = true;
    
        /** Detect all HandlerAdapters or just expect "handlerAdapter" bean? */
        private boolean detectAllHandlerAdapters = true;
    
        /** Detect all HandlerExceptionResolvers or just expect "handlerExceptionResolver" bean? */
        private boolean detectAllHandlerExceptionResolvers = true;
    
        /** Detect all ViewResolvers or just expect "viewResolver" bean? */
        private boolean detectAllViewResolvers = true;
    
        /** Throw a NoHandlerFoundException if no Handler was found to process this request? **/
        private boolean throwExceptionIfNoHandlerFound = false;
    
        /** Perform cleanup of request attributes after include request? */
        private boolean cleanupAfterInclude = true;
    
        /** 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;
    
        private FlashMapManager flashMapManager;
    
        /** List of ViewResolvers used by this servlet */
        private List<ViewResolver> viewResolvers;
    
        public DispatcherServlet() {
            super();
        }
    
        public DispatcherServlet(WebApplicationContext webApplicationContext) {
            super(webApplicationContext);
        }
        @Override
        protected void onRefresh(ApplicationContext context) {
            initStrategies(context);
        }
    
        protected void initStrategies(ApplicationContext context) {
            initMultipartResolver(context);
            initLocaleResolver(context);
            initThemeResolver(context);
            initHandlerMappings(context);
            initHandlerAdapters(context);
            initHandlerExceptionResolvers(context);
            initRequestToViewNameTranslator(context);
            initViewResolvers(context);
            initFlashMapManager(context);
        }
    }
    
    

    DispatcherServlet 类中的属性 beans:

    • HandlerMapping:用于 handlers 映射请求和一系列的对于拦截器的前处理和后处理,大部分用 @Controller 注解。
    • HandlerAdapter:帮助 DispatcherServlet 处理映射请求处理程序的适配器,而不用考虑实际调用的是哪个处理程序。
    • ViewResolver:根据配置解析实际的 View 类型。
    • ThemeResolver:解决 Web 应用程序可以使用的主题,例如提供个性化布局。
    • MultipartResolver:解析多部分请求,以支持从 HTML 表单上传文件。
    • FlashMapManager:存储并检索可用于将一个请求属性传递到另一个请求的 input 和 output 的 FlashMap,通常用于重定向。

    在 Web MVC 框架中,每个 DispatcherServlet 都拥有自己的 WebApplicationContext,它继承了 ApplicationContext。WebApplicationContext 包含了其上下文和 Servlet 实例之间共享的所有 beans。

    1. HandlerMapping 接口 - 处理请求的映射

    • SimpleUrlHandlerMapping 类通过配置文件把 URL 映射到 Controller 类。
    • DefaultAnnotationHandlerMapping 类通过注解把 URL 映射到 Controller 类。
    HandlerMapping

    2. HandlerAdapter 接口 - 处理请求映射

    AnnotationMethodHandlerAdapter:通过注解,把请求 URL 映射到 Controller 类的方法上。

    HandlerAdapter

    3. HandlerExceptionResolver 接口 - 异常处理

    • SimpleMappingExceptionResolver:通过配置文件进行异常处理。
    • AnnotationMethodHandlerExceptionResolver:通过注解进行异常处理。
    HandlerExceptionResolver

    4. ViewResolver 接口 - 解析 View 视图

    UrlBasedViewResolver 类: 通过配置文件,把一个视图名交给一个 View 来处理。

    ViewResolver

    相关文章

      网友评论

        本文标题:DispatcherServlet 详细解析

        本文链接:https://www.haomeiwen.com/subject/sphypctx.html