zoukankan      html  css  js  c++  java
  • Springmvc (二)---HandlerMapper的执行过程

     HandlerMapper的执行过程中的重要代码:
    4.Spring MVC HandlerMapping  代码层面的执行流程

    1.找到DispatcherServlet


    2.找到doDispatch()方法

    asynchronous:异步的
    synchronous:同步的


    //入参进来一个request
    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
            //接受request
            HttpServletRequest processedRequest = request;
          // 处理器执行链
            HandlerExecutionChain mappedHandler = null;
           //判断是否是多部分请求 解析器  (文件上传)
            boolean multipartRequestParsed = false;

            WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

            try {
                try {
           // 模型(数据)和视图
                    ModelAndView err = null;
                    //异常
                    Exception dispatchException = null;

                    try {
       //指的是 DispatcherServlet 的实例  看看请求是不是多部分请求 


       <form  enctype="multipart/form-data">  表单有文件域 上传文件了

                        processedRequest = this.checkMultipart(request);

                        multipartRequestParsed = processedRequest != request;


                        mappedHandler = this.getHandler(processedRequest);


     3.    protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {

            //handlerMappings是单列集合 。只能是Set  或者 List  
            Iterator var2 = this.handlerMappings.iterator();
            HandlerExecutionChain handler;
                if(!var2.hasNext())    return null;
             //  每next()拿到一个HandlerMapping实例
                HandlerMapping hm = (HandlerMapping)var2.next();
                handler = hm.getHandler(request);
               return handler;
        }

        4.
               //我们知道,HandlerMapping是一个接口 ,找实现类 Ctrl+H
           public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {

            Object handler = this.getHandlerInternal(request);
            if(handler == null) {
                handler = this.getDefaultHandler();
            }

            if(handler == null) {
                return null;
            } else {
                if(handler instanceof String) {
                    String handlerName = (String)handler;  //  /hello
                    handler = this.getApplicationContext().getBean(handlerName);
                }

                return this.getHandlerExecutionChain(handler, request);
            }
        }
    5.
    getHandlerExecutionChain中的方法:
    protected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) {
    //处理器执行链
    HandlerExecutionChain chain = handler instanceof HandlerExecutionChain?(HandlerExecutionChain)handler:new HandlerExecutionChain(handler);
    String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
    //返回Iterator 类型
        Iterator var5 = this.adaptedInterceptors.iterator();

    while(var5.hasNext()) {
    HandlerInterceptor interceptor = (HandlerInterceptor)var5.next();
    if(interceptor instanceof MappedInterceptor) {
    MappedInterceptor mappedInterceptor = (MappedInterceptor)interceptor;
    if(mappedInterceptor.matches(lookupPath, this.pathMatcher)) {
    chain.addInterceptor(mappedInterceptor.getInterceptor());
    }
    } else {
    chain.addInterceptor(interceptor);
    }
    }

    return chain;
    }
  • 相关阅读:
    大叔手记(9):小心使用IHttpHandler下的IsReusable属性
    探讨神奇的需求变更:程序员遭遇车祸成植物人,需求变更将其唤醒
    大型JavaScript应用程序架构模式
    HTML5学习笔记简明版(9):变化的元素和属性
    大叔手记(6):巧用ASP.net MVC3里的HandleErrorAttribute
    大叔手记(7):构建自己的JavaScript模板小引擎
    HTML5学习笔记简明版(10):废弃的元素和属性
    RX/TX/GND是什么
    光影中的十大非常学校
    把音量键改成back键。
  • 原文地址:https://www.cnblogs.com/erci-520/p/8617722.html
Copyright © 2011-2022 走看看