SpringMVC核心 - DispatcherServlet源码分析

本文深入解析SpringMVC的工作流程,重点讲解DispatcherServlet如何处理HTTP请求,包括初始化过程、请求处理机制及核心组件如HandlerMapping、HandlerAdapter、ViewResolver的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、SpringMVC原理

  • 用户发送http请求 被DispatcherServlet接管(在web.xml里配置的)
  • 请求里有url路径 然后去servlet里面去找对应的方法 映射方法 就是找相应的handlermapping
  • 在controller里去找到对应url相应的方法 通过HandelAdapter处理 去返回一个ModeAndView
  • DispatcherServlet拿到完这个ModelAndView过后 然后通过ViewResolver去找相应的视图解析器(例如通过视图名字加一个前缀和后缀得到一个jsp路径)
  • 再生成相应的视图对象 再向这个视图对象里塞对象

二、DispatcherServlet初始化过程

首先,我们从大局出发,看一下DispatcherServlet的继承关系

    

从继承关系可以看出,DispatcherServlet就是一个Servlet,对Servlet有遗忘的可以参考下:Servlet生命周期。HttpServletBean继承了HttpServlet并重写了init()方法,

 

web.xml中配置了contextConfigLocation,HttpServletBean中使用ServletConfig进行读取配置文件中的参数

然后在FrameworkServlet中对initServletBean()方法进行了重写实现

我们再看initWebApplicationContext()方法,

 

DispatcherServlet中对onRefresh(ApplicationContext context)方法进行了重写

至此,就完成了DispatcherServlet的初始化,总结一下各个Servlet的作用:

1. HttpServletBean

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

2. FrameworkServlet

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

3. DispatcherServlet 

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

三、DispatcherServlet 是如何处理请求的

HttpServlet中提供了service方法处理请求,service方法中根据http请求方式调用对应的方法(比如:get请求调用doGet()方法,post请求调用doPost()方法),FrameworkServlet中对doGet()等方法进行了重写

下面是processRequest()方法,

processRequest()方法中 doService()方法没有做任何处理,DispatcherServlet中对该方法进行了重写,最重要的就是里面的

doDisPatch(HttpServletRequest request,HttpServletResponse response)方法,该方法的功能如下:

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

四、总结

本文简单的DispatcherServlet的源码进行了分析,如有错误之处欢迎留言指出。欢迎关注微信公众号

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值