SpringMVC是Spring提供给WEB应用的MVC框架,MVC框架一般来说由三部分组成:

  • Model:模型层,一般由java bean完成,主要是进行数据库操作;
  • View:视图层,用于前端展示,比如jsp、html等;
  • Controller:控制层,链接前后端,处理用户请求,起着承前启后的作用;

早期的MVC模式中,Model由java bean扮演,View由jsp扮演,Controller由Servlet扮演,三者组成一个三角形的MVC框架,使得前后端有了一定的分离,而且控制器和模型层的分离使得很多java代码得以重用,但是随着前端设备的多样化和前端各种技术的兴起,前端和后段的交互只变成json数据的交互,导致后端对于jsp的依赖减少,这就出现了Spring MVC的架构。它的最大特点是结构比较松散,在Spring MVC中能够使用JSP、JSON、XML、PDF等各类视图,所以它能满足手机、PC、平板等不同设备中的WEB请求。

一、Spring MVC组件和流程

Spring MVC是基于Servlet的技术,它提供了核心类DispatcherServlet和相关的组件,围绕这个核心类有一个完整的流程,所有的WEB请求都是沿着它所规定的流程进行,所以流程就是它最神秘也是我们所好奇的运行原理。下看一个流程图(备注:图片摘自《JavaEE互联网轻量级框架整合开发-SSM框架》)

Spring MVC执行流程

从上图中可以看出,Spring MVC就是围绕着DispatcherServlet进行的,这个类是继承了WEB容器所提供的Servlet类,所以当WEB容器启动的时候,随着Servlet的初始化,它会执行过程为:

1、首先SpringMVC会根据配置信息,得到URI和处理器之间的映射关系,即处理器映射HandlerMapping,因为处理器上还能加拦截器,从而会形成一个处理器执行链;

2、其次它还会根据上下文初始化视图解析器ViewResolver;

上面两步是初始化时的一些准备工作,当用户发起一个请求时,首先会根据准备好的HandlerMapping找到对应的处理器Handler ,这样就开始执处理器和拦截器组成的执行链,这个执行链的环境需要找处理器适配HandlerAdapter提供,当处理器返回模型和视图的时候DispatcherServlet会把它们交给视图解析器ViewResolver进行解析。需要注意的是,这一步要区分是不是逻辑视图,如果是逻辑视图,那么试图解析器会把模型渲染到视图中,然后响应给用户;如果不是逻辑视图,则直接通过视图渲染数据。

二、Spring MVC的初始化

Spring MVC的初始化主要有两部分组成:

1⃣️初始化Spring IOC

通过配置ContextLoderListener完成

2⃣️初始化映射请求上下文

通过配置DispatcherServlet完成

注意⚠️:如果没有配置Spring IOC的初始化类ContextLoderListener,那么DispatcherServlet在它初始化的时候会对Spring IOC进行初始化,一般来说最好在DispatcherServlet初始化之前就完成Spring IOC初始化。

下面是DispatcherServlet的设计(通过源码可知它们的关系):

从上图可以看出,DispatcherServlet最终是继承由WEB容器提供的HttpServlet实现的。它里面有以下几个组件,这些组件就是Spring MVC的核心部分:

  • MultipartResolver:文件解析器,用于支持服务器的文件上传;
  • LocaleResolver:国际化解析器,用来提供国际化功能;
  • ThemeResolver:主题解析器,用来提供皮肤主题功能;
  • HandlerMapping:映射URI和处理器,使控制器得以运行;
  • HandlerAdapter:处理器适配器,为不同的处理器提供上下文运行环境;
  • HandlerExceptionResolver:处理器异常解析器,用来解析处理器产生的异常;
  • RequestToViewNameTranslator:视图逻辑名称转换器,根据逻辑视图的名称找到具体的视图。注意⚠️:当处理器没有返回逻辑视图名时,将请求的URL自动映射为逻辑视图名;
  • ViewResolver:视图解析器,当控制器返回后,通过试图解析器会把逻辑视图名进行,从而定位实际视图;

在WEB容器启动的时候,Spring MVC就会初始化上面的这些组件,所以我们不需要对他们进行配置就可以用了。本文先记录以下Spring MVC的流程和初始化,下一篇文章将举个实例说明。

Spring MVC(一)--SpringMVC的初始化和流程的更多相关文章

  1. 2017.3.31 spring mvc教程(二)核心流程及配置详解

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  2. Spring MVC源码(二) ----- DispatcherServlet 请求处理流程 面试必问

    前端控制器 前端控制器,即所谓的Front Controller,体现的是设计模式中的前端控制器模式.前端控制器处理所有从用户过来的请求.所有用户的请求都要通过前端控制器.SpringMVC框架和其他 ...

  3. Spring MVC 的springMVC.xml疑问解析

    <mvc:annotation-driven /> <mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping ...

  4. 【spring mvc】springmvc在tomcat中的执行过程

    一.WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象(每个web应用程序唯一),它代表当前web应用web容器提供其一个全局的上下文环境,其为后面的spri ...

  5. Spring mvc Interceptor 解决Session超时配置流程

    最近公司内部框架中对Session超时这一功能未实现,由于采用iframe结构,Session超时后,当点击左侧系统菜单时,会在iframe的右侧再次弹出登陆框. 该问题是由于没有设置拦截器造成. 添 ...

  6. 学习SpringMVC必知必会(2)~走近Spring MVC

    一.Spring 基本介绍 1.什么是 Spring MVC? SpringMVC 是 Spring-Frame 框架的子集(Spring-Frame包含了Spring MVC), MVC 框架,(类 ...

  7. Spring MVC执行的流程

    1.Spring MVC应用的开发步骤 a.在web.xml文件中定义前端控制器DispatcherServlet来拦截用户请求.由于Web应用是基于请求/响应架构的应用,所以 不管哪个MVC Web ...

  8. Spring MVC 对于@ModelAttribute 、@SessionAttributes 的详细处理流程

    初学 Spring MVC , 感觉对于 @ModelAttribute 和 @SessionAttributes 是如何被Spring MVC处理的,这一流程不是很清楚, 经过Google资料,有了 ...

  9. (一)spring MVC基本概念和流程

    MVC的概念 Model(模型):包含数据和行为.不过现在一般都分离开来:Value Object(数据) 和 服务层(行为). View(视图):负责进行模型的展示,一般就是展示给用户的界面. Co ...

随机推荐

  1. 使用treeNMS管理及监控Redis

    Redis做为现在web应用开发的黄金搭担组合,大量的被应用,广泛用于存储session信息,权限信息,交易作业等热数据.做为一名有10年以上JAVA开发经验的程序员,工作中项目也是广泛使用了Redi ...

  2. System.Clollections.IEnumerable.cs

    ylbtech-System.Clollections.IEnumerable.cs 1.程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicK ...

  3. Maven父子工程配置文件详解

    项目骨架搭建成功之后. 因为父工程管理子工程.子工程相当于继承于子工程,所以子工程可以调用父工程里面的东西.那么就可以将jar包对应的配置文件书写到父工程的pom.xml文件中,注意:父工程的打包方式 ...

  4. c++ const的用法

    1.修饰成员变量 int value=0; int *p=&value; const int *p_c=&value;//指针指向常量,但是指针所指向的地址可以修改(int const ...

  5. Google Chrome浏览器安装xpath helper插件

    1. 图中桌面的两个2.0.2_0文件就是xpath helper插件. --------------------------------------------------------------- ...

  6. 20.multi_协程方法抓取总阅读量

    # 用asyncio和aiohttp抓取博客的总阅读量 (提示:先用接又找到每篇文章的链接) # https://www.jianshu.com/u/130f76596b02 import re im ...

  7. Largest Rectangle in a Histogram /// 单调栈 oj23906

    题目大意: 输入n,,1 ≤ n ≤ 100000,接下来n个数为每列的高度h ,0 ≤ hi ≤ 1000000000 求得最大矩阵的面积 Sample Input 7 2 1 4 5 1 3 34 ...

  8. Nand flash 芯片工作原理

    Nand flash 芯片型号为 Samsung K9F1208U0B,数据存储容量为 64MB,采用块页式存储管理.8 个 I/O 引脚充当数据.地址.命令的复用端口. 芯片内部存储布局及存储操作特 ...

  9. .net Cache的用法

    HttpContext.Current.Cache 使用方法 .net Cache 怎么使用 /// <summary>        /// 简单创建/修改Cache,前提是这个值是字符 ...

  10. Android开发 GradientDrawable详解

    前言 GradientDrawable类似与Xml布局里的shape,常用在一些自己封装的对话框控件的背景或者其他View中,优势是不需要你在带着xml布局文件一起封包.. 画线 GradientDr ...