galaxy
  • Introduction
  • knowledge
    • JAVA
      • 多态
      • Socket
      • Servlet
      • HashMap
      • TCP
      • DelayQueue
      • Java反射
      • Java Proxy 和 CGLIB 动态代理
      • JVM
        • 类生命周期
        • JVM内存模型
        • 类加载器与双亲委派模型
        • JVM中堆和栈的区别
      • java.time
    • Spring
      • 常用注解
        • @Transactional
      • Spring Data JPA
      • AOP
      • IOC/DI
      • Spring 事务
      • Spring Boot 启动原理解析
      • Spring MVC
        • Spring MVC 2
      • MVC
    • 分布式
      • RPC框架
      • MQ
      • dubbo
        • 环境部署
        • demo
      • 分布式RPC框架性能大比拼
      • 序列化
      • ZK
        • 本地安装zk
        • ZK详解
      • 分布式
        • 分布式锁
      • 限流熔断技术
    • DB
      • Mysql
        • 索引
      • 事务
      • 数据库连接池
        • 工作原理
        • 连接池技术背景
        • 百度百科
        • 主流数据库连接池
      • MongoDB
        • 适用场景
        • MongoDB Java异步驱动快速指南
        • 异步Mongo驱动的性能测试
        • 使用规范
        • 使用场景2
      • Spring Data JPA
      • 数据库设计三大范式
      • 存储过程
      • 视图
      • 乐观锁与悲观锁
      • 分库分表
      • Redis3
        • 其它
        • Redis
        • 场景
        • 分布式及其它
    • Test
      • NGrinder
      • QPS与并发数
    • 并发编程
      • volatitle
      • 锁
      • ThreadLocal
      • AQS
      • CAS
      • RateLimiter
    • 线程池
      • Executors
      • ScheduledThreadPoolExecutor
      • 终止线程池原理
      • demo
  • MST目录
    • 算法&数据结构
      • 算法
      • 数据结构
      • 算法题
      • 经典算法
  • Tool
    • Git
    • Netty5
      • 一些案例
      • Netty源码分析
        • 一、服务器绑定过程分析
        • 二、线程模型分析
        • 三、Channel如何注册OP_ACCEPT, OP_READ, OP_WRITE
        • 四、事件分发模型
        • 五、ByteBuf缓冲区
        • 六、CodeC编解码分析
        • 七、异步执行Future和Promise
      • Netty5.0架构剖析和源码解读
    • idea
  • issue
    • Connection reset
    • 该如何从 Java 8 升级到 Java 10
    • 阿里巴巴为什么不用 ZooKeeper 做服务发现
  • Linux
    • command
Powered by GitBook
On this page
  • 二、梳理SpringMVC的设计思路
  • Spring MVC原理图
  • 工作过程
  • SpringMVC框架介绍
  • SpringMVC接口解释
  • SpringMVC运行原理

Was this helpful?

  1. knowledge
  2. Spring
  3. Spring MVC

Spring MVC 2

PreviousSpring MVCNextMVC

Last updated 6 years ago

Was this helpful?

Spring MVC

好的博客:

Spring MVC中的9大组件:

流程:

工作原理:

简介:

Spring MVC 深度探险:

Spring MVC前传:

1、Spring mvc介绍

SpringMVC框架是以请求为驱动,围绕Servlet设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。其中核心类是DispatcherServlet,它是一个Servlet,它继承了HttpServlet这个抽象类。顶层是实现的Servlet接口。

SpringMVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringMVC也是要简化我们日常Web开发的。

Spring是一个模块,基于MVC的一个框架。MVC是一种设计模式。M代表model;V代表view;C代表controller。M指的是模型,即dao层和service层,V指的是视图,即jsp html 等。C指的是controller,即控制器。

1、SpringMVC的运行流程

   ⑴ 用户发送请求至前端控制器DispatcherServlet

   ⑵ DispatcherServlet收到请求调用HandlerMapping处理器映射器。

   ⑶ 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器\(如果有则生成\)一并返回给DispatcherServlet。

   ⑷ DispatcherServlet通过HandlerAdapter处理器适配器调用处理器

   ⑸ 执行处理器\(Controller,也叫后端控制器\)。

   ⑹ Controller执行完成返回ModelAndView

   ⑺ HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet

   ⑻ DispatcherServlet将ModelAndView传给ViewReslover视图解析器

   ⑼ ViewReslover解析后返回具体View

   ⑽ DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。

   ⑾ DispatcherServlet响应用户。

   从上面可以看出,DispatcherServlet有接收请求,响应结果,转发等作用。有了DispatcherServlet之后,可以减少组件之间的耦合度。

二、梳理SpringMVC的设计思路

   本文只实现自己的@Controller、@RequestMapping、@RequestParam注解起作用,其余SpringMVC功能读者可以尝试自己实现。

1、读取配置

从图中可以看出,SpringMVC本质上是一个Servlet,这个 Servlet 继承自 HttpServlet。FrameworkServlet负责初始化SpringMVC的容器,并将Spring容器设置为父容器。因为本文只是实现SpringMVC,对于Spring容器不做过多讲解(有兴趣同学可以看看我另一篇文章:[向spring大佬低头--大量源码流出解析](https://my.oschina.net/liughDevelop/blog/1434547))。

   为了读取web.xml中的配置,我们用到ServletConfig这个类,它代表当前Servlet在web.xml中的配置信息。通过web.xml中加载我们自己写的MyDispatcherServlet和读取配置文件。

2、初始化阶段

   在前面我们提到DispatcherServlet的initStrategies方法会初始化9大组件,但是这里将实现一些SpringMVC的最基本的组件而不是全部,按顺序包括:
  • 加载配置文件

  • 扫描用户配置包下面所有的类

  • 拿到扫描到的类,通过反射机制,实例化。并且放到ioc容器中(Map的键值对 beanName-bean) beanName默认是首字母小写

  • 初始化HandlerMapping,这里其实就是把url和method对应起来放在一个k-v的Map中,在运行阶段取出

3、运行阶段

   每一次请求将会调用doGet或doPost方法,所以统一运行阶段都放在doDispatch方法里处理,它会根据url请求去HandlerMapping中匹配到对应的Method,然后利用反射机制调用Controller中的url对应的方法,并得到结果返回。按顺序包括以下功能:
  • 异常的拦截

  • 获取请求传入的参数并处理参数

  • 通过初始化好的handlerMapping中拿出url对应的方法名,反射调用

Spring MVC原理图

工作过程

  1. Spring MVC是通过将需要Spring MVC处理的请求映射到一个名叫DispatcherServlet的servlet上实现的。

  2. 客户端请求首先会交给DispatcherServlet,DispatcherServlet会通过HandlerMapping去查找当前请求的URL对应的那个Handler(通常是Controller中对应的一个方法)。

  3. DispatcherServlet会将请求交给第2步找到的那个Handler方法执行

  4. 执行的过程可能会调用若干的Service来完成业务的处理

  5. 最后在这个Handler中将处理的结果封装成未ModelAndView对象返回给DispatcherServlet。ModelAndView是模型和视图的封装对象。

  6. DispatcherServlet根据ModelAndView中的View,去ViewResolver(视图解析器)中找到对应的视图。

  7. DispatcherServlet将ModelAndView中的Model交给第6步中找到的那个View(JSP,JSTL...)进行视图的渲染。

  8. 渲染后,将视图转为HTTP响应流返回给客户端。

SpringMVC框架介绍

  • Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。

    Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
  • Spring的MVC框架主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。

SpringMVC接口解释

  • DispatcherServlet接口:

Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。

  • HandlerMapping接口:

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

  • Controller接口:

需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。

Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。

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

  • ViewResolver接口:

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

SpringMVC运行原理

  1. 客户端请求提交到DispatcherServlet

  2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller

  3. DispatcherServlet将请求提交到Controller

  4. Controller调用业务逻辑处理后,返回ModelAndView

  5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图

  6. 视图负责将结果显示到客户端

  • DispatcherServlet是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项:

  • 截获符合特定格式的URL请求。

  • 初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。

  • 初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。

框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC ,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架。通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText 和 POI。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。

spring
架构
https://blog.csdn.net/hu_zhiting/article/details/73648939
https://my.oschina.net/liughDevelop/blog/1622646
https://www.jianshu.com/p/74794cc5b72b
https://www.cnblogs.com/xiaohouzai/p/7402038.html
http://downpour.iteye.com/category/196182
http://downpour.iteye.com/blog/1330537