目录

  • 前言
  • DispatcherServlet初始化过程
  • DispatcherServlet处理请求过程
  • 总结
  • 参考资料

前言

SpringMVC是目前主流的Web MVC框架之一。

如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html

本文将分析SpringMVC的核心分发器DispatcherServlet的初始化过程以及处理请求的过程,让读者了解这个入口Servlet的作用。

DispatcherServlet初始化过程

在分析DispatcherServlet之前,我们先看下DispatcherServlet的继承关系。

HttpSerlvetBean继承自HttpServlet。

HttpServletBean覆写了init方法,对初始化过程做了一些处理。 我们来看下init方法到底做了什么:

<servlet><servlet-name>dispatcher</servlet-name>  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  <load-on-startup>1</load-on-startup>  <init-param><param-name>contextConfigLocation</param-name>  <param-value>classpath:springConfig/dispatcher-servlet.xml</param-value>  </init-param>
</servlet><servlet-mapping><servlet-name>dispatcher</servlet-name>  <url-pattern>/</url-pattern>
</servlet-mapping>

比如上面这段配置,传递了contextConfigLocation参数,之后构造BeanWrapper,这里使用BeanWrapper,有2个理由:1. contextConfigLocation属性在FrameworkServlet中定义,HttpServletBean中未定义       2. 利用Spring的注入特性,只需要调用setPropertyValues方法就可将contextConfigLocation属性设置到对应实例中,也就是以依赖注入的方式初始化属性。

然后设置DispatcherServlet中的contextConfigLocation属性(FrameworkServlet中定义)为web.xml中读取的contextConfigLocation参数,该参数用于构造SpringMVC容器上下文。

下面看下FrameworkServlet这个类,FrameworkServlet继承自HttpServletBean。

首先来看下该类覆写的initServletBean方法:

接下来看下initWebApplicationContext方法的具体实现逻辑:

这里的根上下文是web.xml中配置的ContextLoaderListener监听器中根据contextConfigLocation路径生成的上下文。

<context-param><param-name>contextConfigLocation</param-name>  <param-value>classpath:springConfig/applicationContext.xml</param-value>
</context-param>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

比如这段配置文件中根据classpath:springConfig/applicationContext.xml下的xml文件生成的根上下文。

最后看下DispatcherServlet。

DispatcherServlet覆写了FrameworkServlet中的onRefresh方法:

很明显,initStrategies方法内部会初始化各个策略接口的实现类。

比如异常处理初始化initHandlerExceptionResolvers方法:SpringMVC异常处理机制详解

视图处理初始化initViewResolvers方法:SpringMVC视图机制详解

请求映射处理初始化initHandlerMappings方法:详解SpringMVC请求的时候是如何找到正确的Controller

总结一下各个Servlet的作用:

1. HttpServletBean

  主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。

2. FrameworkServlet

  将Servlet与Spring容器上下文关联。其实也就是初始化FrameworkServlet的属性webApplicationContext,这个属性代表SpringMVC上下文,它有个父类上下文,既web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。

3. DispatcherServlet 

  初始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等。

DispatcherServlet处理请求过程

在分析DispatcherServlet处理请求过程之前,我们回顾一下Servlet对于请求的处理。

HttpServlet提供了service方法用于处理请求,service使用了模板设计模式,在内部对于http get方法会调用doGet方法,http post方法调用doPost方法...........

进入processRequest方法看下:

其中注册的监听器类型为ApplicationListener接口类型。

继续看DispatcherServlet覆写的doService方法:

最终就是doDispatch方法。

doDispatch方法功能简单描述一下:

首先根据请求的路径找到HandlerMethod(带有Method反射属性,也就是对应Controller中的方法),然后匹配路径对应的拦截器,有了HandlerMethod和拦截器构造个HandlerExecutionChain对象。HandlerExecutionChain对象的获取是通过HandlerMapping接口提供的方法中得到。有了HandlerExecutionChain之后,通过HandlerAdapter对象进行处理得到ModelAndView对象,HandlerMethod内部handle的时候,使用各种HandlerMethodArgumentResolver实现类处理HandlerMethod的参数,使用各种HandlerMethodReturnValueHandler实现类处理返回值。 最终返回值被处理成ModelAndView对象,这期间发生的异常会被HandlerExceptionResolver接口实现类进行处理。

总结

本文分析了SpringMVC入口Servlet -> DispatcherServlet的作用,其中分析了父类HttpServletBean以及FrameworkServlet的作用。

SpringMVC的设计与Struts2完全不同,Struts2采取的是一种完全和Web容器隔离和解耦的机制,而SpringMVC就是基于最基本的request和response进行设计。

文中难免有错误,希望读者能够指明出来。

参考资料

http://my.oschina.net/lichhao/blog/102315

http://my.oschina.net/lichhao/blog/104943

http://jinnianshilongnian.iteye.com/blog/1602617

转载于:https://www.cnblogs.com/fangjian0423/p/springMVC-dispatcherServlet.html

SpringMVC核心分发器DispatcherServlet分析[附带源码分析]相关推荐

  1. java分发器_SpringMVC核心分发器DispatcherServlet分析

    目录 前言 DispatcherServlet初始化过程 DispatcherServlet处理请求过程 总结 参考资料 后期文章会首发于本专栏,欢迎关注,点赞JAVA高级进阶​zhuanlan.zh ...

  2. SpringMVC异常处理机制详解[附带源码分析]

    SpringMVC异常处理机制详解[附带源码分析] 参考文章: (1)SpringMVC异常处理机制详解[附带源码分析] (2)https://www.cnblogs.com/fangjian0423 ...

  3. SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转

    SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...

  4. 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]

    目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...

  5. 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good

    目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...

  6. k8s client-go源码分析 informer源码分析(3)-Reflector源码分析

    k8s client-go源码分析 informer源码分析(3)-Reflector源码分析 1.Reflector概述 Reflector从kube-apiserver中list&watc ...

  7. 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★

    文章目录 一.JobServiceContext 引入 二.JobServiceContext 源码分析 三.用户在应用层如何使用 JobScheduler 四.用户提交任务 五.广播接收者监听广播触 ...

  8. Android源码分析--MediaServer源码分析(二)

    在上一篇博客中Android源码分析–MediaServer源码分析(一),我们知道了ProcessState和defaultServiceManager,在分析源码的过程中,我们被Android的B ...

  9. Linux内核 eBPF基础:kprobe原理源码分析:源码分析

    Linux内核 eBPF基础 kprobe原理源码分析:源码分析 荣涛 2021年5月11日 在 <Linux内核 eBPF基础:kprobe原理源码分析:基本介绍与使用>中已经介绍了kp ...

最新文章

  1. 暴雪停止与Kespa合作 星际联赛或被迫停赛
  2. python异常类型(Exception只是常规错误的基类)
  3. AndroidWidget实践 --- EverydayTips开发(6)
  4. Redis面试题详解
  5. windows内存结构概述
  6. Java集合:Set集合
  7. 手把手教你nginx下如何增加网站
  8. golang 正则表达式 perl 引擎_R | 正则表达式以grep()为例
  9. .NET C#获取当前网页地址信息
  10. [Data Structure Algorithm] 有向无环图的拓扑排序及关键路径
  11. 微信开发者工具之WXS和简单组件
  12. 移动硬盘内容变成快捷方式处理
  13. win10的ie保存html文件夹,win10系统IE缓存文件夹在哪里,详细教您IE缓存文件在哪里...
  14. avr单片机流水灯程序c语言,AVR单片机综合流水灯C程序
  15. MySQL轻快入门2021.3.19(常用函数)
  16. 会议OA项目(我的会议中的会议排座送审功能)
  17. 【代码大全2】第33章 个人性格
  18. 如何构建VoIP来是实现电话诈骗之——Asterisk的设置
  19. win7 64位搭建scrapy
  20. Httpd服务重定向配置

热门文章

  1. java中范型的限定
  2. Server.Transfer方法在页面间传值
  3. php bloginfo stylesheeturl,WordPress主题制作–bloginfo函数使用教程
  4. linux做一个客户端与WemosD1作为服务器的无线通信(局域网通信)
  5. Java面向对象(2) —— 继承
  6. java动态生成sdk_android、java制作sdk以及自动生成文档
  7. linux的less命令如何退出,Linux命令详解之less命令
  8. 微信PC版近期更新的几个功能,你都会用吗?
  9. 数据库:Redis相关知识梳理
  10. 后端:C#操作Mongodb用法笔记