前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring mvc DispatchServlet 实现机制

Spring mvc DispatchServlet 实现机制

作者头像
java404
发布2018-05-18 14:31:59
1.5K0
发布2018-05-18 14:31:59
举报
文章被收录于专栏:java 成神之路

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

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

代码语言:javascript
复制
<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()方法,进行处理
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.09.29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • DispatcherServlet 源码解析
  • init()
  • onRefresh() 方法
  • DispatchServlet的请求处理逻辑
  • doDispatch() 方法
  • processDispatchResult() 方法
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档