分享自己在Java方面的所思所想,希望你看完之后能有更多更深入的了解

本人微信公众号(jwfy的学习分享),欢迎关注~

接收到一个新的请求之后,spring就会去根据请求的URL信息选择具体的代码块去执行操作,如图就是接收到一个新的请求调用图,从Tomcat开始直到把请求分发到spring中,最后到了doDispatch方法。

本篇学习笔记主要就是讲一个新的请求被分发到spring中spring如何处理,至于如何扫描包中的controller,得到URL配置信息可以看 你是否清楚Spring MVC中的URL映射管理器的工作原理 ,而本篇主要介绍了

  • 获取执行链
  • 404页面设置
  • 获取适配器
  • LastModified
  • 内容方法调用(invoke)
  • 视图渲染

让我们更加清楚的知道spring中一般的方法是如何确定调用的具体方法的,适配不同的模板引擎,达到渲染的地步,再者有时候又是API一般只需要返回json结构的数据,其背后的原理是如何实现的,以及我们在使用过程中如何避免出现的各种问题。

doDispatch 方法

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest processedRequest = request; HandlerExecutionChain mappedHandler = null; boolean multipartRequestParsed = false; WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request); try { ModelAndView mv = null; // 初始化设置模板为null Exception dispatchException = null; // 初始化异常为null try { processedRequest = checkMultipart(request); multipartRequestParsed = (processedRequest != request); // 文件上传的相关设置和操作 mappedHandler = getHandler(processedRequest); // 根据request获取对应的请求执行链 if (mappedHandler == null || mappedHandler.getHandler() == null) { // 如果没有对应的handler对于,则应该是定义为404,通过noHandlerFound确认 noHandlerFound(processedRequest, response); return; } // 通过handler获得合适的handler适配器 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); String method = request.getMethod(); boolean isGet = "GET".equals(method); if (isGet || "HEAD".equals(method)) { // 是get方法或者head方法 long lastModified = ha.getLastModified(request, mappedHandler.getHandler()); // 如果handler 是LastModified类,则获取其lastModified值,否则返回-1 // lastModify 是spring添加了缓存机制,当重复请求同样的内容,返回403,而不会返回真正的内容,具体可看下面的LastModified机制这一小节 if (logger.isDebugEnabled()) { logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified); } if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) { return; } } // 前置的handler预处理,就是获取执行链的拦截器,对请求进行拦截处理 if (!mappedHandler.applyPreHandle(processedRequest, response)) { // 如果拦截器拦截成功,返回false,直接结束了 // 当然在这其中拦截器肯定需要特定返回自身的内容到response中,便于展示在页面上 // 不过从页面角度出发并没有非常实质性的拦截器处理,这点存疑? return; } // 真正的调用各自的执行方法,返回ModelAndView后续在invoke这一小节细说 mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); if (asyncManager.isConcurrentHandlingStarted()) { return; } applyDefaultViewName(processedRequest, mv); // 如果mv没有包含有效的视图,则从dispatch的viewNameTranslator属性上获取对应的默认视图 mappedHandler.applyPostHandle(processedRequest, response, mv); // 拦截器的后置处理 } catch (Exception ex) { dispatchException = ex; } catch (Throwable err) { dispatchException = new NestedServletException("Handler dispatch failed

mockmvc get请求 tm的 一直404_面试:SpringMVC在接收到请求后的调用细节是什么?相关推荐

  1. mockmvc get请求 tm的 一直404_大家快来看看404的兄弟姐妹

    码个蛋(codeegg)第 624 次推文 作者:xiaoxiunique 博客:https://juejin.im/post/5cd2ea425188254459335583 做开发的我们肯定少不了 ...

  2. 请求成功得到返回数据还是走到catch_面试:SpringMVC在接收到请求后的调用细节是什么?...

    分享自己在Java方面的所思所想,希望你看完之后能有更多更深入的了解 本人微信公众号(jwfy的学习分享),欢迎关注- 接收到一个新的请求之后,spring就会去根据请求的URL信息选择具体的代码块去 ...

  3. 面试官:你连HTTP请求Post和Get都不了解?

    IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍.他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了. 此话一出,不知激起了多少( ...

  4. 前端对所有文件请求添加header_【前端面试必问】浏览器缓存原理?送你满分答案...

    (本文适合所1-3年的前端阅读) 原文链接: http://blog.poetries.top/2019/01/02/browser-cache/ 一.浏览器缓存基本认识 分为强缓存和协商缓存 浏览器 ...

  5. 【网络安全工程师面试】—SSRF服务端请求伪造漏洞及利用方法

    目录 4.4. SSRF 4.4.1. 简介 4.4.1.1. 漏洞危害 4.4.2. 利用方式 4.4.3. 相关危险函数 4.4.4. 过滤绕过 4.4.4.1. 更改IP地址写法 4.4.4.2 ...

  6. 记录 Java 面试中遇到的 http请求、消息处理、线程池 3 个问题及感悟!

    >>号外:关注"Java精选"公众号,菜单栏->聚合->干货分享,回复关键词领取视频资料.开源项目. 前言 6月是个忙碌的月份,结完婚,处理完家事,也换了份 ...

  7. 「面试」到阿里第五轮后我才知道所谓的URL是什么

    计算机网络的重要程度不言而言,也是非常的复杂.今天我将从输入URL这个简单例子开始,一起探索数据包的心路历程.先点个赞再文章的大纲,么么哒. 1 源头------网址 网址即平时所说的URL.就是经常 ...

  8. winform接收http请求_web前端面试题对答篇:HTTP fetch发送2次请求的原因?

    HTTP fetch发送2次请求的原因?面对这道出现频率较高的面试题,我想说的是:发送两次请求的情况确实存在,但这与你所使用的是不是http协议,所采用的是不是fetch真的没有一毛钱关系! 接下来, ...

  9. 面试美团,完全实况30+面试真题与答案公布。不得不说细节拉满想要拿到一个大厂offer还真不容易。

    面试美团,完全实况30+面试真题与答案公布.不得不说细节拉满想要拿到一个大厂offer还真不容易. 叮.....美团来电.这次不是外卖而是电话面试. Java 后端开发的. 如果你问我,看了这些题就完 ...

最新文章

  1. nanodet训练voc数据集
  2. Extjs4.2+webAPI+EF实现分页以及webapi的数据传值
  3. javascript中的闭包这一篇就够了
  4. oracle书评,【书评:Oracle查询优化改写】第二章
  5. 156. Leetcode 53. 最大子数组和 (贪心算法-进阶题目)
  6. JavaOne 2012覆盖率
  7. ruby hash方法_Hash.fetch()方法以及Ruby中的示例
  8. strong vs copy
  9. 排序算法(3)----归并排序
  10. maven的基本用法
  11. c语言查看错误步骤命令,C语言之预处理命令
  12. 使用cmd命令创建vue(ivieiw)项目
  13. mysql 连接数和内存的关系_php-fpm进程数和mysql连接数之间的关系
  14. 题目1003:A+B 使用大数相加方法解法
  15. 用MATLAB求定积分
  16. 软件过程与管理总复习
  17. SwiftyJSON之使用分析
  18. 概要设计和详细设计区别_塑胶模具设计常用知识要点概要
  19. 做自媒体4大免费网站,帮助我们更快上手运营
  20. 电脑里删除的文件怎么恢复,数据恢复方法大全

热门文章

  1. 比特币现金在与比特币的技术竞争中走在了前列
  2. 以太经典(ETC)逆势上涨,将逆袭反超以太坊(ETH)?
  3. sqlserver数据库类型对应Java中的数据类型
  4. 安装quagga 软路由
  5. 使用js实现微信小页面翻页的原理介绍
  6. 用onerror处理图片获取失败问题
  7. Zabbix监控CPU与实际值不符合,
  8. 《你不知道的Javascript--上卷 学习总结》(原型)
  9. 技术人员如何摆脱移生万物时代的焦虑
  10. 能ping通外网的域名,浏览器不能上网的解决办法