DispatcherServlet

简介: 路径 org.springframework.web.servlet.DispatcherServlet继承关系重点关注doService()方法该方法重写了父类FrameworkServlet的方法FrameworkServlet在processRequest()方法中调用了...
  • 路径 org.springframework.web.servlet.DispatcherServlet
  • 继承关系
    image.png
  • 重点关注doService()方法

    • 该方法重写了父类FrameworkServlet的方法
    • FrameworkServletprocessRequest()方法中调用了doService()方法
    • processRequest()方法是在FrameworkServlet(继承自HttpServlet,重写了doGet(),doPost()....)中的doGet(),doPost()....中调用的

所以整个过程是DispatcherServlet响应/所有请求。容器调用HttpServletservice()方法,该方法根据HttpMethod分别调用doGet(),doPost()...等方法,FrameworkServlet重写了doGet(),doPost()...等方法,并在方法中调用processRequest()方法,processRequest()方法再调用(重写FrameworkServlet)DispatcherServlet.doService()方法,请求即到了DispatcherServlet.

  • 重点关注doDispatch(request, response)方法
    image.png
  • 查找能够响应当前请求的处理器
// Determine handler for the current request.
mappedHandler = getHandler(processedRequest);

image.png
image.png

  • Spring容器启动时根据@Controller注解和@RequestMapping获取对应的HandlerMethod
    image.png
  • 得到处理类与处理方法
    image.png
  • 继续往下,走到HandlerExecutionChain executionChain = getHandlerExecutionChain(handler, request);
  • 在方法getHandlerExecutionChain(handler, request)中添加需要拦截该请求的拦截器
    image.png
  • 方法getHandlerExecutionChain(handler, request)执行完毕之后可以拿到的数据:
    image.png
  • 返回 Dispatcher.getHandler(processedRequest)
    image.png
  • 依次执行每个拦截器InterceptorList中的预处理方法preHandler()
    image.png
  • 执行真正的业务方法
    image.png
  • 依次执行每个拦截器的postHandler()方法
    image.png
  • processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException)处理返回值与执行拦截器的afterCompletion()方法
    image.png
  • 依次执行每个拦截器的afterCompletion()方法
    image.png

一次请求执行完毕

  • 调试时长:12分钟
    image.png
目录
相关文章
|
机器学习/深度学习 人工智能 PyTorch
|
云安全 数据采集 机器学习/深度学习
云安全 | 学习笔记
快速学习云安全,重点介绍了如何在 Linux 下进行安全防护,并从用户系统安全、SSH 安全、恶意文件安全和云安全四个角度诠释如何提升系统的安全性。
云安全 | 学习笔记
|
人工智能 小程序 索引
用Python给我设计一个井字棋,对手是AI
用Python给我设计一个井字棋,对手是AI
314 0
|
算法 C++
C++实现图 - 06 关键路径
我们上一讲详细的讲述了拓扑排序的实现,为了就是给这一讲打下基础,因为这一讲我们将会讲关键路径,它就要用到拓扑排序的知识。
446 0
C++实现图 - 06 关键路径
|
SQL 安全 API
记第一次挖洞交洞历程
记第一次挖洞交洞历程
847 0
记第一次挖洞交洞历程
首席技术官:CTO 是做什么的
这是 Quora 上的一篇回答,作答的是 Cloudera 的 Founder/CTO Amr Awadallah,原文 在这里。第二次翻译文章,还有点喜欢上它了呢! 以下为翻译全文: 早在 2012 年当我成为 Cloudera 的全职 CTO 时,我就四处寻找这个问题的答案。
3480 0
|
Shell C++ Docker
“docker run”VS“docker exec”,这两个命令有区别吗?
“docker run”和“docker exec”都是 Docker 容器中用于执行的命令。然而,在不同的情况下,它们的使用有着本质上的区别。
7562 0
|
开发工具
gitlab访问限制问题------Forbidden
解决方案: cd /etc/gitlab vim /gitlab.rb gitlab_rails['rack_attack_git_basic_auth'] = { 'enabled' => true, 'ip_whitelist' => ["127.
3596 0