首页 > 其他分享 >test

test

时间:2022-08-19 19:45:25浏览次数:53  
标签:mappedHandler mv request Handler test response processedRequest

  1 protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
  2         /**
  3          * 声明变量 HttpServletRequest HandlerExecutionChain Handler执行链包含和最扣执行的Handler
  4          */
  5         HttpServletRequest processedRequest = request;
  6         HandlerExecutionChain mappedHandler = null;
  7         //是不是一个多组件请求
  8         boolean multipartRequestParsed = false;
  9         //异步管理器
 10         WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
 11 
 12         try {
 13             //视图
 14             ModelAndView mv = null;
 15             //异常
 16             Exception dispatchException = null;
 17 
 18             try {
 19                 /**
 20                  * 1.检查是否上传请求
 21                  */
 22                 processedRequest = checkMultipart(request);
 23                 multipartRequestParsed = (processedRequest != request);
 24 
 25                 // Determine handler for the current request.
 26                 /**
 27                  * 2.根据processedRequest获取映射的Handler执行链 HandlerExecutionChain
 28                  * 有当前请求的Handler和Inteceptor
 29                  */
 30                 mappedHandler = getHandler(processedRequest);
 31                 if (mappedHandler == null) {
 32                     /**
 33                      * 如果mappedHandler为空就返回404
 34                      */
 35                     noHandlerFound(processedRequest, response);
 36                     return;
 37                 }
 38 
 39                 /**
 40                  * 3.根据mappedHandler  HandlerExecutionChain  HandlerAdapter适配器
 41                  */
 42                 // 确定当前请求的处理程序适配器。
 43                 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
 44 
 45                 /**
 46                  * 获取请求方法
 47                  * 处理last-modified 请求头
 48                  */
 49                 // Process last-modified header, if supported by the handler.
 50                 String method = request.getMethod();
 51                 boolean isGet = "GET".equals(method);
 52                 if (isGet || "HEAD".equals(method)) {
 53                     //获取最近修改时间,缓存
 54                     long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
 55                     if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
 56                         return;
 57                     }
 58                 }
 59 
 60                 /**
 61                  * 4.预处理,执行拦截器等
 62                  */
 63                 if (!mappedHandler.applyPreHandle(processedRequest, response)) {
 64                     return;
 65                 }
 66 
 67                 /**
 68                  * 5.实现执行Controller中(Handler)的方法,返回ModelAndView视图
 69                  */
 70                 // Actually invoke the handler.
 71                 mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
 72 
 73                 if (asyncManager.isConcurrentHandlingStarted()) {
 74                     /**
 75                      * 判断 是不是异步请求,是就返回了
 76                      */
 77                     return;
 78                 }
 79                 /**
 80                  * 6.对象视图对象的处理
 81                  */
 82                 applyDefaultViewName(processedRequest, mv);
 83                 /**
 84                  * 7.拦截器后后置处理
 85                  */
 86                 mappedHandler.applyPostHandle(processedRequest, response, mv);
 87             }
 88             catch (Exception ex) {
 89                 dispatchException = ex;
 90             }
 91             catch (Throwable err) {
 92                 // As of 4.3, we're processing Errors thrown from handler methods as well,
 93                 // 使它们可用于@异常处理程序方法和其他场景。
 94                 dispatchException = new NestedServletException("Handler dispatch failed", err);
 95             }
 96             /**
 97              * 8.对页面渲染
 98              */
 99             processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
100         }
101         catch (Exception ex) {
102             /**
103              * 9.对页面渲染完成里调用拦截器中的AfterCompletion方法
104              */
105             triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
106         }
107         catch (Throwable err) {
108             /**
109              * 最终对页面渲染完成里调用拦截器中的AfterCompletion方法
110              */
111             triggerAfterCompletion(processedRequest, response, mappedHandler,
112                     new NestedServletException("Handler processing failed", err));
113         }
114         finally {
115             if (asyncManager.isConcurrentHandlingStarted()) {
116                 // Instead of postHandle and afterCompletion
117                 if (mappedHandler != null) {
118                     mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
119                 }
120             }
121             else {
122                 //清除由多个部分组成的请求使用的所有资源。
123                 if (multipartRequestParsed) {
124                     cleanupMultipart(processedRequest);
125                 }
126             }
127         }
128     }

 

标签:mappedHandler,mv,request,Handler,test,response,processedRequest
From: https://www.cnblogs.com/Met32/p/16603152.html

相关文章

  • contest
    Mostbusinessesalsoencouragecompetitionbetweenindividualemployees.Anexampleofthisisacontestbetweensalesrepresentatives.Thesalesrepresentativ......
  • pytest系列——allure命令行参数详解
    一、查看allure命令的帮助文档allure-hallure命令的语法格式allure[options][command][commandoptions]options列表Options:--help命令行帮助文档......
  • Pytest系列(2-3)-conftest详解
    什么是conftest.py可以理解成一个专门存放fixture的配置文件 实际开发场景多个测试用例文件(test_*.py)的所有用例都需要用登录功能来作为前置操作,那就不能把登录功能写......
  • Pytest系列(2-1)-fixture的详细使用
    前言前面一篇讲了setup、teardown可以实现在执行用例前或结束后加入一些操作,但这种都是针对整个脚本全局生效的如果有以下场景:用例1需要先登录,用例2不需要登录,用例......
  • Pytest系列(2-1)-用例状态
    用例执行状态用例执行完成后,每条用例都有自己的状态,常见的状态有passed:测试通过failed:断言失败error:用例本身写的质量不行,本身代码报错(譬如:fixture不存在,fixture里面......
  • Pytest系列(1-2)-assert断言详细使用
    前言与unittest不同,pytest使用的是python自带的assert关键字来进行断言assert关键字后面可以接一个表达式,只要表达式的最终结果为True,那么断言通过,用例执行成功,否则用例......
  • Pytest系列(1-3)-setup和teardown的详细使用
    前言用过unittest的童鞋都知道,有两个前置方法,两个后置方法;分别是setup()setupClass()teardown()teardownClass()Pytest也贴心的提供了类似setup、teardown的方法,并......
  • Pytest系列(1-1)-快速入门
    前言目前有两种纯测试的测试框架,pytest和unittestunittest应该是广为人知,而且也是老框架了,很多人都用来做自动化,无论是UI还是接口pytest是基于unittest开发的另一款更......
  • 【pytest】命令行参数-durations统计用例运行时间
    前言:写完一个项目的自动化用例之后,发现有些用例运行较慢,影响整体的用例运行速度,于是领导说找出运行慢的那几个用例优化下。--durations参数可以统计出每个用例运行的时......
  • pytest.main( )参数大全
    一、常用参数大全1、-s:输出打印(print/logging)信息;2、-v:显示具体丰富的信息;3、-k:执行用例名称中包含某字符段的用例。举个pytest.main(['-k','taiwan'])#执行测试用例......