美文网首页Java学习笔记
SpringMVC学习笔记(一)——原理以及源码分析

SpringMVC学习笔记(一)——原理以及源码分析

作者: 顾烟凉 | 来源:发表于2018-08-01 13:33 被阅读0次

    1.SpringMVC框架

    1.1定义

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

    1.2 工作原理

    springmvc原理图02.png
    1. 浏览器发出request,DispatcherServlet接收request并向HandlerMapping请求获取andler
    2. HandlerMapping返回执行后的Handler
    3. DispatcherServlet调用HandlerAdapter处理Handler,执行完毕后返回ModelAndView
    4. DispatcherServlet接收到后请求ViewResolver对ModelAndView进行解析,解析完毕后返回视图
    5. DispatcherServlet对视图进行渲染呈现在客户端并向浏览器返回response

    1.3 组件说明

    (1) DispatcherServlet(核心组件)

    SpringMVC的核心,类比cpu,在接受Http请求后负责各个组件的协调,主要工作有以下三点:

    • 截获符合特定格式的URL请求。
    • 初始化DispatcherServlet上下文对应WebApplicationContext,并将其与业务层、
      持久化层的WebApplicationContext建立关联。
    • 初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。

    (2)HandlerMapping:

    能够完成客户请求到Controller映射。

    (3)Controller:

    需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。
    Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,

    (4)ViewResolver:

    Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。

    (5)Handle(需要程序员开发)

    编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler

    ModelAndView中包含了模型(Model)和视图(View)。
    从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。

    2.源码分析

    2.1工作机制

    在容器初始化时会建立所有url和controller的对应关系,保存到Map<url,controller>中.tomcat启动时会通知spring初始化容器(加载bean的定义信息和初始化所有单例bean),然后springmvc会遍历容器中的bean,获取每一个controller中的所有方法访问的url,然后将url和controller保存到一个Map中;

    这样就可以根据request快速定位到controller,因为最终处理request的是controller中的方法,Map中只保留了url和controller中的对应关系,所以要根据request的url进一步确认controller中的method,这一步工作的原理就是拼接controller的url(controller上@RequestMapping的值)和方法的url(method上@RequestMapping的值),与request的url进行匹配,找到匹配的那个方法;

    确定处理请求的method后,接下来的任务就是参数绑定,把request中参数绑定到方法的形式参数上,这一步是整个请求处理过程中最复杂的一个步骤。springmvc提供了两种request参数与方法形参的绑定方法:

    ① 通过注解进行绑定,@RequestParam

    ② 通过参数名称进行绑定.
      使用注解进行绑定,我们只要在方法参数前面声明@RequestParam("a"),就可以将request中参数a的值绑定到方法的该参数上.使用参数名称进行绑定的前提是必须要获取方法中参数的名称,Java反射只提供了获取方法的参数的类型,并没有提供获取参数名称的方法.springmvc解决这个问题的方法是用asm框架读取字节码文件,来获取方法的参数名称.asm框架是一个字节码操作框架,关于asm更多介绍可以参考它的官网.个人建议,使用注解来完成参数绑定,这样就可以省去asm框架的读取字节码的操作.

    2.2 阅读源码

    水平不够,以后再补充

    相关文章

      网友评论

        本文标题:SpringMVC学习笔记(一)——原理以及源码分析

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