zoukankan      html  css  js  c++  java
  • 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框架处理完毕。

  • 相关阅读:
    第3 章流程控制语句
    第7 章面向对象程序设计
    linux运维常用命令
    第1 章初识Python
    nginx安装与部署
    Linux下软件安装的几种方式
    MAYA 多线程
    Maya pywin32
    python 中调用windows系统api操作剪贴版
    Maya QT interfaces in a class
  • 原文地址:https://www.cnblogs.com/sunfie/p/13276235.html
Copyright © 2011-2022 走看看