SpringMvc源码学习

    用户在浏览器中,输入了http://www.xxxx.com/aaa/bbb.ccc的地址,回车后,浏览器发起一个http请求,请求到达你的服务器后,首先会被SpringMVC注册在web.xml中的前端控制器DispatcherServlet接收,DispatcherServlet是一个标准的Servlet,它的作用是接收和转发web请求到内部框架处理单元,核心处理流程图如下所示

 

 

  ①:DispatcherServlet是SpringMVC中的前端控制器(front controller),负责接收request并将request转发给对应的处理组件。

 

  ②:HanlerMapping是SpringMVC中完成url到Controller映射的组件。DispatcherServlet接收request,然后从HandlerMapping查找处理request的controller.

 

  ③:Cntroller处理request,并返回ModelAndView对象,Controller是SpringMVC中负责处理request的组件(类似于struts2中的Action),ModelAndView是封装结果视图的组件。

 

  ④ ⑤ ⑥:视图解析器解析ModelAndView对象并返回对应的视图给客户端。

 

 

整体流程概述如下:

    在容器初始化时会建立所有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框架的读取字节码的操作。

整体流程主要回答了三个问题:

  • URL到框架的映射。
  • http请求参数绑定
  • http响应的生成和输出

   具体到核心类来说:一个web请求,首先进入到DispatcherServlet,然后在容器中查找到提前注册的符合的HandlerMapping,经过拦截器的处理,然后查找合适的ModelAndView,经过渲染后返回给前端页面,至此,一个流程经过springmvc框架处理完毕。

 

posted @ 2020-07-09 21:09  天~宇~翱~翔  阅读(189)  评论(0编辑  收藏  举报