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. Docker系列(一):Docker简单介绍

    Docker简介: 多语言和框架:支持多语言和框架以及语言框架的扩展机制 多服务:开放的核心服务以及服务的扩展机制 多云和多IaaS技术:支持多种IaaS技术和多云的部署,包括公有云和私有云 Dock ...

  2. Git的忽略提交规则

    相关知识参考资料: https://git-scm.com/book/zh/v2/Git-基础-记录��% 8F%E6%AC%A1%E6%9B%B4%E6%96%B0%E5%88%B0%E4%BB%9 ...

  3. ASP.NET的Validform验证表单使用说明

    当我们写提交表单的时候往往需要验证表单是否填写了内容,是否正确,这个插件可以很方便的完成我们需要的验证! 使用方法: 1.引用JS <script type="text/javascr ...

  4. Eclips安装STS(Spring Tool Suite (STS) for Eclipse)插件

    Spring Tool Suite(sts)就是一个基于Eclipse的开发环境, 用于开发Spring应用程序.它提供了一个现成的使用环境来实现, 调试, 运行, 和部署你的Spring应用程序.包 ...

  5. 12_springmvc拦截器

    一.定义 Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理. 二.拦截器定义 实现HandlerInterceptor接口, ...

  6. CSS之Important

    1.important只能用于直接选中,不能用于间接选中 2.通配符选择器选中的标签也是直接选中的 3.!important只能提升被指定的属性的优先级 ,其他属性的优先级不会被提升 4.!impor ...

  7. java空和非空判断

    public static boolean isEmpty(String str){ if("".equals(str)||str==null){ return true; }el ...

  8. python 请求测试环境的https接口地址报SSL错误验证,访问不了

    解决文案: response = requests.post(url, data=payload, json=None, headers=headers,verify=False)print(resp ...

  9. 廖雪峰Java15JDBC编程-3JDBC接口-4JDBC事务

    1 数据库事务:Transaction 1.1 定义 若干SQL语句构成的一个操作序列 要么全部执行成功 要么全部执行不成功 1.2 数据库事务具有ACID特性: Atomicity:原子性 一个事务 ...

  10. vs nuget 本地安装 nupkg包

    Install-Package fluentnhibernate -Source C:\Users\Alex\AppData\Local\NuGet\Cache\ 包名 路径