当前位置:首页 > Java技术 > SpringMVC核心分发器DispatcherServlet分析[附带源码分析]

SpringMVC核心分发器DispatcherServlet分析[附带源码分析]

2022年08月05日 01:35:12Java技术4

目录

前言

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

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

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

DispatcherServlet初始化过程

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

SpringMVC核心分发器DispatcherServlet分析[附带源码分析] _ JavaClub全栈架构师技术笔记

HttpSerlvetBean继承自HttpServlet。

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

SpringMVC核心分发器DispatcherServlet分析[附带源码分析] _ JavaClub全栈架构师技术笔记

<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方法:

SpringMVC核心分发器DispatcherServlet分析[附带源码分析] _ JavaClub全栈架构师技术笔记

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

SpringMVC核心分发器DispatcherServlet分析[附带源码分析] _ JavaClub全栈架构师技术笔记

SpringMVC核心分发器DispatcherServlet分析[附带源码分析] _ JavaClub全栈架构师技术笔记

这里的根上下文是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方法:

SpringMVC核心分发器DispatcherServlet分析[附带源码分析] _ JavaClub全栈架构师技术笔记

很明显,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方法...........

SpringMVC核心分发器DispatcherServlet分析[附带源码分析] _ JavaClub全栈架构师技术笔记

进入processRequest方法看下:

SpringMVC核心分发器DispatcherServlet分析[附带源码分析] _ JavaClub全栈架构师技术笔记

SpringMVC核心分发器DispatcherServlet分析[附带源码分析] _ JavaClub全栈架构师技术笔记

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

继续看DispatcherServlet覆写的doService方法:

SpringMVC核心分发器DispatcherServlet分析[附带源码分析] _ JavaClub全栈架构师技术笔记

最终就是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

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/17681.html

标签: SpringMVC
分享给朋友:

“SpringMVC核心分发器DispatcherServlet分析[附带源码分析]” 的相关文章

SpringMVC学习系列(9) 之 实现注解式权限验证

SpringMVC学习系列(9) 之 实现注解式权限验证

对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servlet中的过滤器Filter来实现。但借助于Spring MVC中的action拦截器我们可以实现注解式的权限验证。 一.首先介绍一下acti...

springmvc之pojo

标签: springmvc springmvc学习笔记12-springmvc注解开发之包装类型参数绑定 需求 实现方法 页面参数和controller方法形参定义 本文主要介绍注解开发的介绍包装类型的参数绑定 需求 商品查询controller方法中实现商品查询条...

SpringBoot和SpringMVC的区别

SpringBoot和SpringMVC的区别

一 面试提问 👨‍💻面试官:SpringBoot和SpringMVC的区别 🙋我: 形式上:SpringBoot是一个自动化配置的工具;SpringMVC是一个web框架 在搭建项目时:SpringMVC需要手动配置xml...

Spring与SpringMVC的区别

Spring是IOC和AOP的容器框架,SpringMVC是基于Spring功能之上添加的Web框架,想用SpringMVC必须先依赖Spring。 简单点的话可以将SpringMVC类比于Struts。 Spring是IOC和AOP的容器框架,SpringMVC是基于Spring功能...

SpringMvc两种实现

SpringMvc两种实现

SpringMvc搭建 了解mvc 什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。 是将业务逻辑、数据、显示分离的方法来组织代码。...

SpringMVC重定向

SpringMVC重定向

一、springMVC重定向有两种方式 @Controller @RequestMapping("/OA") public class RedirectService { @RequestMapping(value="/index") public String te...

spring mvc 请求转发和重定向

spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ 1. 需求背景     需求:spr...

Spring MVC 3 深入总结

Spring MVC 3 深入总结

  一、前言: 大家好,Spring3 MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了。Spring3 MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也...

【SpringMVC】SpringMVC配置FastJson

【SpringMVC】SpringMVC配置FastJson

目前网络上传递数据大部分都是json和xml,但是xml使用的很少了,这里主要介绍json,一般来说json常用的场景是提供外部接口,请求内使用request域就足够了 springmvc对于json的支持,上图 1.请求json方式分析 如果...

SpringMVC的请求属于单例模式

首先明白:什么是单例,什么是多例。 单例:所有请求只生成一个对象。线程不安全 多例:每次请求都会重新生成一个对象,线程安全。 SpringMVC默认的是单例的,所以是线程不安全。 如果想要保证线程安全则有两种方式: 1、声明成多例:在Con...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。