一、SpringMVC简介

    SpringMVC是一种基于Spring实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC架构模式的思想,将web层进行职责解耦,并管理应用所需对象的生命周期,为简化日常开发,提供了很大便利。

    SpringMVC提供了总开关DispatcherServlet;请求处理映射器(HandlerMapping)、处理适配器(HandlerAdapter)、视图解析器(ViewResolver)进行视图管理、业务处理器Controller接口(包含ModelAndView,以及处理请求响应对象request和response),配置灵活,支持文件上传,数据简单转化等强大功能。

二、常用组件说明

1、DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于 MVC 模式中的 C,DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。

2、HandlerMapping:处理器映射器
HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

3、Handler:处理器
Handler 实际就是Controller。由于 Handler 涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求进行开发。

4、HandlAdapter:处理器适配器
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

5、ViewResolver:视图解析器
View Resolver负责将处理结果生成 View 视图,ViewResolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。

6、View:视图
SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView 等。我们最常用的视图就是jsp。

三、执行流程

执行流程 及 概要代码实现(如下图)

Spring MVC 执行流程 分析

工作流程描述

    1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;

    2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

    3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法;

    4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller):
        在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作,HttpMessageConveter;
        将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息;
        数据转换:对请求消息进行数据转换。如String转换成Integer、Double等;
        数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等;
        数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中;

    5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

    6. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

    7. ViewResolver 结合 Model 和 View,来渲染视图;

    8. 将渲染结果返回给客户端。

四、springmvc的工作机制

  1. 在容器初始化会通知 spring 初始化容器(加载bean的定义信息和初始化所有单例bean),springmvc会遍历容器中的bean,获取每个Controller 所有方法对应 @RequestMapping 中的 url ,并将 url 与 @RequestMapping 注解修饰的方法保存到 Map<url, controller>中;
  2. 每次请求根据 request 的 url 从 Map<url, controller> 中确认 Controller 的 method
  3. 确定处理请求的 method 后,接下来的任务就是参数绑定,把 request 中参数绑定到方法的形式参数上,这一步是整个请求处理过程中最复杂的一个步骤。springmvc提供了两种request参数与方法形参的绑定方法:
    • 通过 @RequestParam 注解进行绑定:使用注解进行绑定,只要在方法参数前面声明 @RequestParam("id"),就可以将 request 中 参数id 的值绑定到方法的该参数上;
    • 通过参数名称进行绑定:使用参数名称进行绑定的前提是必须要获取方法中参数的名称,Java反射只提供了获取方法的参数的类型,并没有提供获取参数名称的方法。springmvc解决这个问题的方法是用asm框架读取字节码文件,来获取方法的参数名称。asm框架是一个字节码操作框架,关于asm更多介绍可以参考它的官网。【个人建议,使用注解来完成参数绑定,这样就可以省去asm框架的读取字节码的操作.】

相关文章:

  • 2021-06-19
  • 2021-11-24
  • 2021-09-15
  • 2021-11-04
  • 2021-05-06
  • 2021-04-10
  • 2021-05-25
猜你喜欢
  • 2021-11-12
  • 2018-03-16
相关资源
相似解决方案