分享自己在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

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

  1. 小程序部分机型请求200、返回数据为空

    情景描述 ssm+mysql+jdk1.7+tomcat7+centos7 接口在网页端正常使用,在小程序端部分机型(魅族.乐视)的部分接口失效 开发者工具调试正常 真机上调试请求报200,传参成功, ...

  2. 使用HttpClient实现对第三方服务器的请求并接受返回数据

    /** 创建日期 2017-4-7** TODO 要更改此生成的文件的模板,请转至* 窗口 - 首选项 - Java - 代码样式 - 代码模板*/ package com.enfo.intrust. ...

  3. Springboot使用AOP记录请求日志和返回数据

    首先是日志表结构 DROP TABLE IF EXISTS `protal_logvo`; CREATE TABLE `protal_logvo` (`id` varchar(255) NOT NUL ...

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

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

  5. jQuery ajax请求成功且返回了数据,但是不进success:function()

    2019独角兽企业重金招聘Python工程师标准>>> 1.状态码返回200--表明服务器正常响应了客户端的请求: 2.通过firebug和IE的httpWatcher可以看出服务器 ...

  6. 【SpringBoot】Http请求统一异常(返回数据)处理与单元测试

    对返回数据格式的统一 首先规定一下错误的输出格式: { "code": 1,"msg": "提示","data": nu ...

  7. 前端通过Ajax请求从后台返回数据到页面显示,实现分页功能

    本文纯属自己平时编代码时的总结,主要用于自己以后方便查看 后端controller代码 JsonMessage jsonMessage = new JsonMessage(); //********* ...

  8. mybatis insert成功与否返回数据都是null

      今天写项目时遇到的这个问题,怎么做返回值都是null,即使数据已经成功的插入了.打断点才发现的这个问题.然后百度了一下解决方案.   先贴一下修改前的代码: <insert id=" ...

  9. okhttp请求php接口,安卓:okhttp请求,获取返回数据

    要引入okhttp.jar private void HttpResponse(String url, final TextView textView) { OkHttpClient client = ...

最新文章

  1. Docker安全加固——利用LXCFS增强docker容器隔离性和资源可见性
  2. java通过jdbc登陆系统_JDBC模拟登录
  3. C语言简洁代码:1006 换个格式输出整数 (15分)
  4. CF198D Cube Snake(三维空间/增量构造)
  5. MXNet结合kubeflow进行分布式训练
  6. 常用 shell sql 命令
  7. Java IO流笔记4 --- File类
  8. UiLanguage 语言-国家代码表
  9. 龙少的Linux配置大全
  10. 贴片铝电容识别及型号_TDK贴片电容识别方法及命名规则
  11. 网页JS获取当前地理位置(省市区)
  12. 天翼云无法连接mysql_天翼云Linux主机异常
  13. 马氏链,Metropolis-Hastings采样与Gibbs采样的理解(附有python仿真)
  14. 【C语言】自由落体第n次落地共经过多少米,第n次弹起的高度
  15. 基于MFC的平行投影算法
  16. GPS坐标转换经纬度及换算方法
  17. 如何将视频从QSV格式转换为MP4格式
  18. SuperMap iDesktop 10i连接金仓数据库
  19. 微型计算机的功能主要由什么决定,微机的功能主要取决于微处理器CPU。
  20. Flash动画类有哪些最新发表的毕业论文呢?

热门文章

  1. Linux:网络基础配置
  2. CSS3圆圈动画放大缩小循环动画效果
  3. Android将允许纯C/C++开发应用
  4. 深入浅出 Javascript API(五)--Query Find 查询
  5. Win2003下Asp配置技巧 http 500内部服务器错误
  6. 没有人会尊重弱者,把弱者当成朋友!人们永远追随强者,永远和强者结盟!
  7. 谷歌为何能持续创新?工程经理亲自揭秘“工程师文化”
  8. php模拟表格冻结,PHPExcel冻结(锁定)表头的简单实现方法
  9. ubuntu java sdk_ubuntu 10.10安装java sdk6过程
  10. HTML图片瓦片,HTML5 可扩展瓦片式导航栏