Spring MVC是一个MVC模式的实现。在Spring MVC的使用中,需要在web.xml中配置DispatcherServlet,也就是说其核心是一个Servlet,这个DispatcherServlet实现的是Sun的J2EE核心模式中的前端控制器模式(Front Controller),所有的Web请求都需要通过它来处理,进行转发、匹配、数据处理后,并转由页面进行展现,因此这个DispatcherServlet可以看成是Spring MVC实现最为核心的部分。

web.xml中配置dispatcherServlet

<servlet>
<servlet-name>portrait</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/application-si-portrait-mvc.xml</param-value>
</init-param>
</servlet>

 Spring的上下文体系通过ContextLoader和DispatcherServlet建立并初始化的过程。在完成对ContextLoaderListener的初始化以后,Web容器开始初始化DispatcherServlet,这个初始化的启动与在web.xml中对载入次序的定义有关。DispatcherServlet会建立自己的上下文来持有Spring MVC的Bean对象,在建立这个自己持有的IoC容器时,会从ServletContext中得到根上下文作为DispatcherServlet持有上下文的双亲上下文。再对自己持有的上下文进行初始化,最后把自己持有的这个上下文保存到ServletContext中,供日后检索和使用。

DispatcherServlet的工作大致可以分为两部分,一个是初始化部分InitServletBean()启动,通过initWebApplicationContext方法最终调用DispatcherServlet的initStrategies方法,另一个是对Http请求进行相应作为一个Servlet,Web容器会调用Servlet的doGet()和doPost()方法,在经过FrameworkServlet的processRequest()简单处理后,会调用doService。最后调用重要的doDispatch().

Spring MVC对HTTP请求的分发处理

  在MVC框架初始化完成之后,对HTTP请求的处理是在doService()方法中完成的,DispatcherServlet是HttpServlet的子类,与其他HttpServlet一样,通过Doservice()来相应HTTP的请求。对请求的处理实际上是由doDispatch()来完成,它是DispatcherServlet完成Dispatcher的主要方法,包括准备ModelAndView,调用getHandler来响应HTTP的请求,然后通过执行Handler的处理来得到返回的ModelAndView结果,最后把这个ModelAndView对象交给相应的视图对象去呈现。

Spring MVC的实现大致由以下几个步骤完成:

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

2)在初始化为Spring MVC接收HTTP请求并完成相应处理做好准备,在MVC接收到HTTP请求的时候,DispatcherServlet会根据具体的URL请求信息,在HandlerMapping中进行查询,从而得到对应的HandlerExecutionChain.在它的里面封装了配置的Controller,这个请求对应的Controller会完成请求的响应动作,生成需要的ModelAndView对象,这个对象就像它的名字所表示的一样,可以从对象中获得ModelAndView对象,从该对象中获得Model模型数据和视图对象。

3)DispatcherServlet把获得的模型数据交给特定的视图对象,从而完成这些数据的视图呈现工作。

Spring技术揭幕----DispatcherServlet的更多相关文章

  1. Spring MVC之DispatcherServlet初始化详解

    Spring作为一个优秀的web框架,其运行是基于Tomcat的.在我们前面的讲解中,Spring的驱动都是使用的ClassPathXmlApplicationContext,并且都是直接在main方 ...

  2. Spring技术内幕:设计理念和整体架构概述(转)

    程序员都很崇拜技术大神,很大一部分是因为他们发现和解决问题的能力,特别是线上出现紧急问题时,总是能够快速定位和解决. 一方面,他们有深厚的技术基础,对应用的技术知其所以然,另一方面,在采坑的过程中不断 ...

  3. Spring Mvc中DispatcherServlet和Servlet的区别小结

    在web开发过程中开始接触的是servlet,用来处理用户请求.这几年随着spring 框架越来越成熟,几乎成了java web开发界的主流框架.既然这么受欢迎肯定有它的优点,spring框架在原来的 ...

  4. 《spring技术内幕》读书笔记(1)——什么是POJO模式

    今天在看<spring技术内幕>,第一章中多次提到了使用POJO来完成开发,就百度了一下,在此保留 1.     什么是POJO POJO的名称有多种,pure old java obje ...

  5. Spring技术内幕:SpringIOC原理学习总结

    前一段时候我把Spring技术内幕的关于IOC原理一章看完,感觉代码太多,不好掌握,我特意又各方搜集了一些关于IOC原理的资料,特加深一下印象,以便真正掌握IOC的原理. IOC的思想是:Spring ...

  6. Spring MVC中DispatcherServlet工作原理探究

    转:http://blog.csdn.net/zhouyuqwert/article/details/6853730 下面类图将主要的类及方法抽离出来,以便查看方便,根据类的结构来说明整个请求是如何工 ...

  7. Spring mvc中DispatcherServlet详解

    简介 DispatcherServlet是前端控制器设计模式的实现,提供SpringWebMVC的集中访问点,而且负责职责的分派,而且与spring IOC容器无缝集成,从而可以获得Spring的优势 ...

  8. spring自动扫描、DispatcherServlet初始化流程、spring控制器Controller 过程剖析

    spring自动扫描1.自动扫描解析器ComponentScanBeanDefinitionParser,从doScan开始扫描解析指定包路径下的类注解信息并注册到工厂容器中. 2.进入后findCa ...

  9. [转] EJB 3和Spring技术体系比较

    最近在学习EJB 3,对于SSH与EJB3,一直不太明白“即生瑜,何生亮?”,今天无意看到一篇旧文,比较系统的对比了这二种技术架构,转载于此: 原文出处:http://www.51cto.com/sp ...

随机推荐

  1. Windows Store App 全球化:在后台代码中引用字符串资源

    上文提到了引用字符串资源具有两种方式,分别是在XAML元素中和在后台代码中引用资源文件中的字符串资源.在第一小节已经介绍了如何在XAML元素中引用字符串资源,本小节将讲解在后台代码中引用字符串资源的相 ...

  2. Oracle 客户端连接服务器[转]

    很多朋友在开发项目中并不是每个人用一个数据库,而是有单独的一台主机作为开发的数据库服务器,这样,就需要我们的开发人员去连接它.          首先是进入oracle的 Net  Mananger:

  3. JS如何判断包括IE11在内的IE浏览器 <转载>

    今天碰到一个奇怪的问题,有一个页面,想指定用IE浏览器打开,在VS开发环境没有问题,但部署到服务器上,即使是用IE打开页面,还是提示“仅支持IE”,真是晕啊!! 判断是否IE浏览器用的是window. ...

  4. .htaccess简介和详解

    .htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录.作为用户,所能使用的命令受到 ...

  5. js判断 微信浏览器 或者 QQ内置浏览器

    function isWeiXinOrQQ(){ var ua = window.navigator.userAgent.toLowerCase(); if(ua.match(/MicroMessen ...

  6. enmo_day_01

    OCP : 三门,sql, 管理一,管理二 VUE 考试中心 OCM : 2天,5年经验 11g grid 12c cloud 个人技术博客 itpub, csdn, 51blog 自己买主机,域名, ...

  7. linux命令每日一练习-top free

    top看看进程的内存使用情况 free产看内存使用情况 top -n 2 -b > log.txt   将更新两次的结果输入到log.txt cat > log.txt //清空文件并写入 ...

  8. Wince 6.0 窗口最大化显示

    在InitDialog用如下代码实现: CRect   m_FullScreenRect;   //全屏区域 CRect   WindowRect; GetWindowRect(&Window ...

  9. python3批量删除豆瓣分组下的好友

    python3批量删除豆瓣分组下的好友 """ python3批量删除豆瓣分组下的好友 2016年6月7日 03:43:42 codegay 我两年前一时冲动在豆瓣关注了 ...

  10. MySQL主机127.0.0.1与localhost区别总结

    1. mysql -h 127.0.0.1 的时候,使用TCP/IP连接, mysql server 认为该连接来自于127.0.0.1或者是"localhost.localdomain&q ...