1、MVC模式

(1)视图

通过视图展示应用数据    向应用数据提供更新动作   向控制器提交用户动作   运行控制器选择不同视图

(2)模型提供

封装应用数据状态  响应数据状态查询  提供应用功能接口 数据变化通知视图

(3)控制器

定义应用功能  映射用户动作到数据更新  选择对应视图   一个控制器对应一组功能

使用MVC模式时,需要在web.xml中配置一个DispatcherServlet,这个DispatcherServlet可以看成一个前端控制器,还需要在Bean定义中配置Web请求和Controller的对应关系,以及各种视图的展现方式。在具体使用Controller时,会产生MoudelAndView数据,把数据交给相应的视图view进行展示。

web应用中,Spring MVC是建立在IOC容器基础上的。Web环境中使用IOC容器,需要Spring将IOC容器启动,把IOC容器导入,并在Web容器中建立起来,IOC容器启动和Web容器启动启动是集成在一起的,启动过程中,一面处理Web容器的启动,另一方面通过设计特定的Web容器拦截器,将IOC容器载入到Web环境中,并进行初始化。启动完成后,IOC容器可以正常工作,才能建立MVC框架的运行机制,从而响应从Web容器传递的HTTP请求。

Spring MVC的启动类ContextLoaderListener被定义为一个监听器,DispatchServlet和ContextLoaderListener提供了在Web容器中对Spring接口,这些接口与Web容器耦合是通过ServletContext来实现的。

2、上下文在Web容器中启动

ContextLoaderListener是Spring提供的类,实现了定义在Servlet API 中ServletContextListener接口,而在Web容器中建立applicationContext的过程中,是在contextInitialized的接口实现完成的。

在ContextLoader,完成两个IOC容器建立过程,一个是在Web容器中建立起双亲IOC容器,另一个是生成相应的WebApplicationContext并进行初始化。

ContextLoaderListener加载过程:

(1)从servlet事件中得到ServletContext;

(2)读取配置在web.xml中的各个相关属性;

(3)ContextLoader实例化WebApplicationContext,完成载入和初始化,这个初始化的第一个上下文作为根上下文存在,根上下文载入后被绑 定到Web应用程序的ServletContext,任意需要访问根上下文的应用程序代码都可以从WebApplicationContextUntils类的静态方法中得到,取得上下文方法:webApplicationContext getWebApplicationContext(ServletContext sc);

(4)ContextLoaderListener实现ServletContextListener,监听ServletContext,如果ServletContext发生变化,监听到动作之后,执行预定的响应动作。

3、DispatcherServlet在MVC中的作用

在web.xml中除了配置ContextLoaderListener外还需要配置DispatcherServlet,DispatcherServlet是实现sun公司的J2EE核心模式中的前端控制器模式,进行转发、匹配、数据处理后,并让前端页面来显示。

Spring MVC中,除了DispatcherServlet之后,对于不同的web请求的映射需求,还提供了不同的HandlerMapping,默认情况下,DispatcherServlet选取了BeanNameUrlHandlerMapping作为映射实现策略。

除了映射策略外,SPring MVC还提供了各种Controller的实现来供应用扩展和使用,这些控制器实现handleRequest接口方法,并返回MoudleAndView对象。

Spring MVC中Spring上下文体系通过ContextLoader和DispatcherServlet来建立和初始化。完成ContextLoader的初始化,Web容器开始对DispatcherServlet进行初始化,DispatcherServlet会建立自己的上下文来持有Spring MVC的Bean对象、会建立自己的IOC容器、会从ServletContext中得到根上下文最为DispatcherServlet持有上下文的双亲上下文。

DispatcherServlet通过继承FrameworkServlet和HTTPServletBean而继承HTTPServlet,通过使用Servlet API来对HTTP的请求进行响应。

DispatcherServlet处理过程:

HandlerMapping的作用

初始化完成后,所有的HandlerMapping都被加载,储存到一个List中并被排序,这个List中每一个元素都对应着一个具体的HandlerMapping的配置。

4、Spring MVC视图的呈现

视图调用入口在DispatcherServlet中的doDispatcher方法中实现,具体说,在DispatcherServlet中对视图的处理是在render()方法调用中完成的,首先从ModuleAndView中获取视图对象,然后调用视图对象的render方法,在方法中会对视图的名字进行解析,获取对应的视图,不同的视图有不同的解析方式,最后完成特定的视图呈现的动作。

几种常见的视图:JSP、ExcelView、PDFView。。。。

ExcelView:Spring中没有对Excel的实现方案,所以是通过Java Excel来解决的,然后与Spring MVC 框架进行整合,把生成的Excel文件输出到Http的Response中,在Http客户端展示出来,Spring 3.0中提供了两种方案在MVC框架中进行整合:POI和JExcelAPI,分别对应着两个View类:AbstractExcelView和AbstractJExcelView。

PDFView:与ExcelView一样,也是实现在AbstractpdfView类中完成。

Spring MVC小结:

(1)建立Controller控制器和HTTP请求之间的映射关系,这个过程是由handlerMapping中封装的HandlerExcutionChain对象完成的,Controller和HTTP的对应关系的配置在Bean中描述,并在IOC容器初始化的时候,通过初始化HandlerMapping来完成的,这些定义的关系会被载入到一个handlerMap中进行使用。

(2)初始化过程中,Controller和HTTP映射关系建立完成,为Spring MVC接收HTTP请求并完成响应做准备。接收到HTTP请求时,DispatcherServlet根据具体的URL请求信息,在handlerMapping中进行查询,得到相应的HandlerExcutionChain对象,HandlerExcutionChain对象中封装了配置的Controller,对应的Controller会完成响应动作,返回需要的ModuleAndView。

(3)得到ModuleAndView对象后,DispatcherServlet把获得的对象交给特定的视图对象,视图对象吧ModuleAndView中的数据展示出来,这个视图展示的动作是由视图对象的render方法完成的,对不同的视图对象,render方法会完成不同的视图展示的处理。

Spring学习(十一)--Spring MVC的更多相关文章

  1. Spring学习(十一)-----Spring使用@Required注解依赖检查

    Spring学习(九)-----Spring依赖检查 bean 配置文件用于确定的特定类型(基本,集合或对象)的所有属性被设置.在大多数情况下,你只需要确保特定属性已经设置但不是所有属性.. 对于这种 ...

  2. Spring学习(六)-----Spring使用@Autowired注解自动装配

    Spring使用@Autowired注解自动装配 在上一篇 Spring学习(三)-----Spring自动装配Beans示例中,它会匹配当前Spring容器任何bean的属性自动装配.在大多数情况下 ...

  3. Spring学习笔记--spring+mybatis集成

    前言: 技术的发展, 真的是日新月异. 作为javaer, 都不约而同地抛弃裸写jdbc代码, 而用各种持久化框架. 从hibernate, Spring的JDBCTemplate, 到ibatis, ...

  4. spring学习12 -Spring 框架模块以及面试常见问题注解等

    以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式—在AOP和remoting中被用的比较 ...

  5. Spring学习【Spring概述】

    从本文開始,我们就要一起学习Spring框架,首先不得不说Spring框架是一个优秀的开源框架. 当中採用IoC原理实现的基于Java Beans的配置管理和AOP的思想都是非常值得学习与使用的.以下 ...

  6. Spring学习笔记—Spring之旅

    1.Spring简介     Spring是一个开源框架,最早由Rod Johnson创建,并在<Expert One-on-One:J2EE Design and Development> ...

  7. spring学习(三) ———— spring事务操作

    前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTem ...

  8. spring 学习 一 spring 介绍

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. Spring ...

  9. Spring学习2—Spring容器

    一.Spring容器接口关系 容器是Spring框架的核心,Spring容器就是一个巨大的工厂.Spring容器使用Ioc(控制反转(Inversion of Control )管理所有组成应用系统的 ...

  10. spring学习之spring入门

    一 spring的基础 1:什么是spring spring是由Rod Johnson组织和开发的一个分层 的Java SE/EE 一站式轻量级开源框架,它以Ioc(控制反转)和 AOP(面向切面编程 ...

随机推荐

  1. 快醒醒,C# 9 中又来了一堆关键词 init,record,with

    一:背景 1. 讲故事 .NET5 终于在 2020-08-25 也就是前天发布了第八个预览版,这么多的预览版搞得我都麻木了,接踵而来的就是更多的新特性加入到了 C# 9 中,既然还想呆在这条船上,得 ...

  2. 手写@Service、@Autowired、@Transactional注解,实现spring ioc和spring事务

    自定义@Service注解 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Custom ...

  3. 08.简单学习redis哨兵主备切换和选举算法

    一.选举的授权 每次一个哨兵要做主备切换,首先需要quorum数量的哨兵认为odown,然后选举出一个哨兵来做切换,这个哨兵还得得到majority哨兵的授权,才能正式执行切换 如果quorum &l ...

  4. 递归 & 分治算法深度理解

    首先简单阐述一下递归,分治算法,动态规划,贪心算法这几个东西的区别和联系,心里有个印象就好. 递归是一种编程技巧,一种解决问题的思维方式:分治算法和动态规划很大程度上是递归思想基础上的(虽然实现动态规 ...

  5. Python 逆向抓取 APP 数据

    今天继续给大伙分享一下 Python 爬虫的教程,这次主要涉及到的是关于某 APP 的逆向分析并抓取数据,关于 APP 的反爬会麻烦一些,比如 Android 端的代码写完一般会进行打包并混淆加密加固 ...

  6. Android开发工程师面试题总结。android开发面试经验

    1:Android中五种数据存储方式分别是什么?他们的特点?     (1)SharedPreference,存放较少的五种类型的数据,只能在同一个包内使用,生成XML的格式存放在设备中 (2) SQ ...

  7. playable

    探索TimelinePlayableAPI,让Timeline为所欲为 https://blog.csdn.net/qq826364410/article/details/80534892 Playa ...

  8. 算法专题 | 10行代码实现的最短路算法——Bellman-ford与SPFA

    今天是算法数据结构专题的第33篇文章,我们一起来聊聊最短路问题. 最短路问题也属于图论算法之一,解决的是在一张有向图当中点与点之间的最短距离问题.最短路算法有很多,比较常用的有bellman-ford ...

  9. 伪距定位算法(matlab版)

    在各种伪距定位算法中,最小二乘法是一种比较简单而广泛的方法,该算法可以分为以下几步: 1.准备数据与设置初始值 这里准备数据,主要是对于各颗可见卫星,收集到它们在同一时刻的伪距测量值,计算测量值的各项 ...

  10. h5跳转微信公众号关注页面

    最近在做h5项目,有个需求是如果用户没有关注公众号,需要引导用户跳转至微信公众号关注页面 制作一个链接,点击该链接跳转到公众号关注页面. 1.从公众平台登进入公众号 2.点击开发>>开发者 ...