springmvc系列之DispatcherServlet

首先放一张大家都熟悉的springmvc工作流程图:

由此可见,springmvc中的核心就是这个DispatcherServlet,下面就从DispatcherServelt的源码分析(springmvc版本5.0.x),一步步弄明白springmvc

一. DispatcherServlet是什么

DispatcherServlet这个类的UML图如下:

可以看出:它是一个由spring ioc容器管理的一个servlet,只会被实例化一个对象。它是何时被实例化的呢?这要从它的父类FrameworkServlet说起,FrameworkServlet这个类就是servlet与springr容器的结合点。FrameworkServlet的初始化方法:initServletBean调用initWebApplicationContext()方法,将servert初始化并发布到IOC容器中:

二.DispatcherServlet的初始化

我们可以看到DispatcherServlet这个类有许多属性:
public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";
public static final String LOCALE_RESOLVER_BEAN_NAME = "localeResolver";
public static final String THEME_RESOLVER_BEAN_NAME = "themeResolver";

........

这些属性都是在定义的时候直接进行了初始化,而有一些我们熟知的属性,比如说:handlerMappings,handlerAdapters是怎么初始化的呢?答案在静态代码块中:

这个DispatcherServlet.properties文件中的内容,正是DispatcherServlet中定义而未初始化的属性全限定类名

DispatcherServlet类的初始化方法执行时,会给每一个在定义时没有进行初始化的属性进行赋值,完成初始化。实现方式是根据类型从IOC容器中取到相应的bean,再将这个bean赋值给属性

三.核心方法

doDispatch()--所有的http请求都会被此方法处理

1.遍历其持有的HandlerMapings,通过HandlerMapping获取到一个HandlerExecutorChain对象,HandlerExecutionChain mappedHandler = getHandler(processedRequest);HandlerChain对象包含这些属性:final Object handler、 HandlerInterceptor[] interceptors、List<HandlerInterceptor> interceptorList

2.根据1中的结果,拿到一个Handler(即我们程序员写的controller),再根据这个handler获取到接口类型HandlerAdapter:HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

3.根据2中的结果,进行请求处理,处理完成,返回一个ModelAndView:ModelAndView mv=ha.handle(processedRequest, response, mappedHandler.getHandler());再通过1中的interceptors对mv进行前置处理:

4.处理mv,返回结果:processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

如果返回的逻辑视图不为空,并且不包含任何model或者view(ModelAndView对象两个属性),则调用render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response)方法,利用DispatcherServlet所持有的ViewResolver进行视图渲染:

ViewResolverc处理完mv之后,返回一个View接口,view调用自身render()方法,进行物理视图的渲染,返回给浏览器。

至此DispatcherServlet主要工作流程就介绍完毕

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值