zoukankan      html  css  js  c++  java
  • SpringMVC架构实现原理

    SpringMVC架构实现原理

    一、SpringMVC介绍

    Spring mvc是一个基于mvc的web框架。其中核心类是DispatcherServlet,它是一个Servlet,顶层是实现的Servlet接口。

    Spring mvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。

    二、SpringMVC使用

    需要在web.xml中配置DispatcherServlet。并且需要配置spring监听器ContextLoaderListener

    <?xml version="1.0" encoding="UTF-8"?> <!-- 当前的XML文档版本与字符编码 -->
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <display-name>SpringMVC</display-name>

    <!-- SpringMVC前段控制器 -->
    <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!-- contextConfigLocation配置SpringMVC加载的配置文件(配置处理器映射器、适配器等等)
    如果不配置ContextConfigLocation,默认加载的是/WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml)
    -->
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!--
    第一种:*.action,访问以.action结尾由DispatcherServlet进行解析
    第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的配置不让DispatcherServlet解析
    第三种:/*,这样配置不对
    -->
    <url-pattern>*.action</url-pattern>
    </servlet-mapping>

    </web-app>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    三、SpringMVC运行原理

    1、 运行流程图:

    2、流程说明:

    (1)客户端(浏览器)发送请求,直接请求到DispatcherServlet。(请求DispatcherServlet)

    (2)DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。(查找@Controller)

    (3)解析到对应的Handler后,开始由HandlerAdapter适配器处理。(查找@RequestMapping)

    (4)HandlerAdapter会根据Handler来调用真正的处理器开处理请求,并处理相应的业务逻辑。(处理方法)

    (5)处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是个逻辑上的View。(返回处理结果)

    (6)ViewResolver会根据逻辑View查找实际的View。(逻辑视图解析为真正的视图)

    (7)DispatcherServlet把返回的Model传给View。(DispatcherServlet试图渲染)

    (8)通过View返回给请求者(浏览器)

    四、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(http://www.my516.com) {
    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);
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    DispatcherServlet类中的属性beans:

    1、HandlerMapping:

    用于handlers映射请求和一系列的对于拦截器的前处理和后处理,大部分用@Controller注解。

    HandlerMapping接口的实现类:

    SimpleUrlHandlerMapping类通过配置文件把URL映射到Controller类。

    DefaultAnnotationHandlerMapping类通过注解把URL映射到Controller类。

    2、HandlerAdapter:

    帮助DispatcherServlet处理映射请求处理程序的适配器,而不用考虑实际调用的是 哪个处理程序。

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

    3、HandlerExceptionResolver:

    处理映射异常。

    SimpleMappingExceptionResolver通过配置文件进行异常处理。

    AnnotationMethodHandlerExceptionResolver:通过注解进行异常处理。

    4、ViewResolver:

    根据实际配置解析实际的View类型。

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

    5、LocaleResolver:

    解决客户正在使用的区域设置以及可能的时区,以便能够提供国际化视野。

    6、ThemeResolver:

    解决Web应用程序可以使用的主题,例如提供个性化布局。

    7、MultipartResolver:

    解析多部分请求,以支持从HTML表单上传文件。

    8、FlashMapManager:

    存储并检索可用于将一个请求属性传递到另一个请求的input和output的FlashMap,通常用于重定向。
    ---------------------

  • 相关阅读:
    java Socket Tcp 浏览器和服务器(二)
    java Socket Tcp 浏览器和服务器(一)
    java Socket Tcp示例三则(服务端处理数据、上传文件)
    java Socket Udp聊天
    centos 图形界面和命令行界面切换
    python 文件中的中文编码解决方法
    PostgreSQL与MySQL比较(转)
    Python 的开发环境
    Windows 下 pip和easy_install 的安装与使用
    Linux 下的下载文件命令
  • 原文地址:https://www.cnblogs.com/ly570/p/11183006.html
Copyright © 2011-2022 走看看