image.png

核心架构-前端控制器

image.png

image.png

实现步骤

  • 实现Controller
  • 配置Web MVC组件
  • 配置DispatherServlet

交互流程

  1. ![image.png](https://cdn.nlark.com/yuque/0/2019/png/262337/1567425893329-d45be5af-4490-4cc0-af8f-a5f37391f95c.png#align=left&display=inline&height=398&name=image.png&originHeight=608&originWidth=936&size=209964&status=done&style=none&width=612)

实现分析

快速体验

  • 配置web.xml
    • Spring MVC是通过servlet拦截所有URL来达到控制的目的
    • 核心配置
      • contextConfigLocation
      • DispatcherServlet
  • 创建Spring配置文件
  • 创建model
  • 创建视图
  • 创建Servlet配置文件Spring-servlet.xml

    ContextLoaderListener

  • 实现了ServletContextListener

  • 启动web容器时,自动装配ApplicationContext的配置信息。
  • 核心逻辑是初始化WebApplicationContext实例并存放至ServletContext中。

ServletContextListener

  • 自定义的ServletContextListener
    • 可以在系统启动的时候添加自定义的属性
  • 注册监听器
    • web.xml文件中注册自定义的监听器
  • 测试

DispatherServlet

  • 实现了Servlet接口
  • Servlet
    • 初始化
    • 运行
    • 销毁
  • Servlet用法
    • 创建Servlet
    • 在web.xml中配置
  • DispatcherServlet的初始化
    • 初始化过程主要是通过将当前的Servlet类型实例转换为BeanWrapper类型实例,以便使用Spring中提供的注入功能进行对应属性的注入。
      • 封装及验证初始化参数
      • 将当前的Servlet实例转换为BeanWrapper实例
      • 注册相对于Resource的属性编辑器
      • 属性注入
      • ServletBean的初始化
        • 其关键初始化逻辑委托给了initWebApplicationContext()
  • WebApplicationContext的初始化
    • 寻找或创建对应的WebApplicationContext实例
      • 通过构造函数的注入进行初始化
      • 通过contextAttribute进行初始化
      • 重新创建WebApplicationContext实例
    • configureAndResfreshWebApplicationContext
      • 对已经创建的WebApplicationContext实例进行配置及刷新
    • 刷新onRefresh
      • 初始化MultipartResolver
        • 主要用来处理文件上传
      • 初始化LocaleResolver
        • 国际化
          • 基于URL参数
          • 基于session
          • 基于cookie
      • 初始化ThemeResolver
      • 初始化HandlerMappings
        • 当客户端发出Request时DispatcherServlet会将Request提交给HandlerMapping,然后HandlerMapping根据WebApplicationContext的配置来回传该DispatcherServlet响应的Controller。
      • 初始化HandlerAdapters
        • 作为总控制的派遣器Servlet通过处理器映射器得到处理器后,会轮询处理器适配器模块,查找能够处理当前HTTP请求的处理器适配器的实现,处理器适配器模块会根据处理器映射器映射返回的处理器类型来选择某一个适当的处理器适配器的实现,从而适配当前的HTTP请求。
          • HttpRequestHandlerAdapter
          • SimpleControllerHandlerAdapter
          • AnnotationMethodHandlerAdapter
      • 初始化HandlerExceptionResolver
      • 初始化RequestToViewNameTranslator
      • 初始化ViewResolvers
        • ViewResolver接口定义了resolverViewName方法,根据viewName创建合适类型的View实现
      • 初始化FlashMapManager
        • SpringMVC Flash attributes提供了一个请求存储属性,可供其他请求使用。
  • DispatcherServlet的逻辑处理
    • MultipartContent类型的request处理
      • 对于请求的处理,Spring 首先考虑的是对于multipart的处理,如果是MultipartContent类型的request,则转换为request为MultipartHTTPRequest类型的request。
    • 根据request信息寻找对应的Handler
      • 在系统启动时,Spring 会将所有的映射类型的bean注册到this.handlerMappings变量中。
      • 根据request查找对应的Handler
      • 加入拦截器到执行链
    • 未找到对应的Handler的错误处理
    • 根据当前Handler寻找对应的HandlerAdapter
    • 缓存处理
    • HandlerInterceptor的处理
      • Spring MVC允许通过处理拦截Web请求,进行前置处理和后置处理。
      • 每个处理拦截都必须实现HandlerInterceptor接口
        • preHandle()
        • postHandle()
          • 允许访问ModelAndView对象,可以操作属性
        • afterCompletion()
    • 逻辑处理
      • 对于逻辑处理其实是通过适配器中转调用Handler并返回视图的
    • 异常视图的处理
    • 根据视图跳转页面
      • resolverViewName
        • 解析视图名称
      • render
        • 页面跳转