详解Spring mvc DispatchServlet 实现机制

 更新时间:2017年09月30日 08:28:57   作者:jijs  
本篇文章主要介绍了详解Spring mvc DispatchServlet 实现机制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

在Spring中, ContextLoaderListener只是辅助类,在web 容器启动的时候查找并创建WebApplicationContext对象,通过该对象进行加载spring的配置文件。而真正的逻辑实现其实是在DispatcherServlet中进行的,DispatcherServlet是实现servlet接口的实现类。

DispatcherServlet 在 web.xml 中的配置如下:

<servlet>
 <servlet-name>spring</servlet-name>
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
 <servlet-name>spring</servlet-name>
 <url-pattern>/</url-pattern><!-- 如果写斜杠的话那就表示请求是否加后缀都可以 -->
</servlet-mapping>

DispatcherServlet 源码解析

DispatcherServlet 的 init() 方法在 HttpServletBean() 中实现的

init()

  1. 解析DispatcherServlet 配置的参数,封装成 ServletConfigPropertyValues对象。
  2. 将当前Servlet 类型的实例转换成BeanWrapper类型的实例。以便使用Spring中提供的注入功能进行对应的属性注入。这些属性如contextAttribute、contextClass、nameSpace、contextConfigLocation 等,都可以在web.xml 文件中以初始化参数的方式配置在servlet 的声明中。
  3. 调用 initServletBean() 初始化servletBean。

onRefresh() 方法

在初始化servletBean的时候,最终会调用 onRefresh() 方法,该方法主要是刷新Spring在web功能实现中所必须使用的全局变量。

  1. initMultipartResolver(context);初始化文件上传的处理类
  2. initLocaleResolver(context);初始化国际化配置的处理类
  3. initThemeResolver(context);初始化主题资源的处理类
  4. initHandlerMappings(context);初始化处理请求的类,主要负责处理请求调用Controller的处理类。
  5. initHandlerAdapters(context);初始化HandlerAdapter的适配器
  6. initHandlerExceptionResolvers(context);初始化异常处理类。
  7. initRequestToViewNameTranslator(context);初始化视图转换器,用于直接将请求转换为逻辑视图名。
  8. initViewResolvers(context);初始化视图解析器,定义了如何通过view 名称来解析对应View实例的行为
  9. initFlashMapManager(context);初始化Flash Map,提供一个请求存储属性,可供其它请求使用。

DispatchServlet的请求处理逻辑

servlet 接受到请求后,会调用service() 方法,然后service根据HTTP响应的请求方法进行调用响应的逻辑处理。

从类结构中,可以看出SpringMVC 支持 GET、POST、PUT、DELETE、OPTIONS、TRACE方法

从代码中,我们发现这几个方法交给 processRequest() 来进行处理请求。

processRequest()->doService()->doDispatch()
通过跟踪代码,最终处理请求的核心代码在doDispatch()方法中。

doDispatch() 方法

  1. 检查该请求是否是文件上传请求,如果是则把request转换为 MultipartHttpServletRequest类型。
  2. 根据request信息查找对应的Handler,如果没有找到对应的Handler,则通过response反馈错误信息。
  3. 通过当前的handler 查找对应的HandlerAdapter
  4. 判断该HTTP请求是不是HEAD或GET请求,如果是则检查HTTP请求头部的LastModified属性,来判断该页面是否需要重新加载。

  1. applyPreHandle() 执行该请求所匹配的拦截器,并调用所有匹配拦截器的preHandle()方法,进行处理
  2. 调用handle() 方法去根据请求路径去调用用户实现的Controller实现逻辑
  3. applyPostHandle()执行该请求所有匹配的拦截器,并调用所有匹配拦截器的postHandle()方法,进行处理
  4. processDispatchResult()处理页面跳转和调用拦截器的afterCompletion() 方法

processDispatchResult() 方法

  1. 处理异常信息
  2. 如果Controller成功返回了ModelAndView,则通过render()方法进行响应相应的页面信息
  3. 执行完毕后,执行该请求所有匹配的拦截器,并调用所有匹配拦截器的afterCompletion()方法,进行处理

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java开发之Lombok指南

    Java开发之Lombok指南

    Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,它能够在编译源代码期间自动帮我们生成这些方法,并没有如反射那样降低程序的性能。下面我们来详细了解一下吧
    2019-06-06
  • 动态修改spring aop 切面信息提升自动日志输出框架效率

    动态修改spring aop 切面信息提升自动日志输出框架效率

    这篇文章主要为大家介绍了动态修改spring aop切面信息提升自动日志输出框架效率,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • springboot配置文件读取pom文件信息方式

    springboot配置文件读取pom文件信息方式

    这篇文章主要介绍了springboot配置文件读取pom文件信息方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • spring 整合kafka监听消费的配置过程

    spring 整合kafka监听消费的配置过程

    这篇文章主要介绍了spring 整合kafka监听消费的配置过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Java 数据结构与算法系列精讲之汉诺塔

    Java 数据结构与算法系列精讲之汉诺塔

    汉诺塔是源于印度一个古老传说的益智玩具。大梵天创造世界时做了三根石柱,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,三根柱子之间一次只能移动一个圆盘
    2022-02-02
  • java volatile关键字的含义详细介绍

    java volatile关键字的含义详细介绍

    这篇文章主要介绍了java volatile关键字的含义详解的相关资料,需要的朋友可以参考下
    2016-12-12
  • springboot+log4j.yml配置日志文件的方法

    springboot+log4j.yml配置日志文件的方法

    这篇文章主要介绍了springboot+log4j.yml配置日志文件的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 一篇文章带你了解mybatis的动态SQL

    一篇文章带你了解mybatis的动态SQL

    这篇文章主要为大家介绍了mybatis的动态SQL ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • springboot如何查找配置文件路径的顺序和其优先级别

    springboot如何查找配置文件路径的顺序和其优先级别

    此文是在工作中遇到的关于springboot配置文件的问题,在网上查阅资料和自己测试之后记录的,以便日后查阅。希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 源码解析Spring 数据库异常抽理知识点总结

    源码解析Spring 数据库异常抽理知识点总结

    在本篇文章里小编给大家分享了关于源码解析Spring 数据库异常抽理知识点内容,对此有需要的朋友们学习参考下。
    2019-05-05

最新评论