zoukankan      html  css  js  c++  java
  • Spring MVC 追踪HandlerMapping

    第一步:web.xml鼠标指向HandlerMapping右键+Ctrl进入它的类

    第二步:Ctrl+F查找doDispatch()方法:

    //入参个request
    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; Exception dispatchException = null; try {
    //指的是 DispatcherServlet 的实例  看看请求是不是多部分请求  processedRequest = this.checkMultipart(request); multipartRequestParsed = processedRequest != request; mappedHandler = this.getHandler(processedRequest); if (mappedHandler == null || mappedHandler.getHandler() == null) { this.noHandlerFound(processedRequest, response); return; } HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler()); String method = request.getMethod(); boolean isGet = "GET".equals(method); if (isGet || "HEAD".equals(method)) { long lastModified = ha.getLastModified(request, mappedHandler.getHandler()); if (this.logger.isDebugEnabled()) { this.logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified); } if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) { return; } } if (!mappedHandler.applyPreHandle(processedRequest, response)) { return; } mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); if (asyncManager.isConcurrentHandlingStarted()) { return; } this.applyDefaultViewName(processedRequest, mv); mappedHandler.applyPostHandle(processedRequest, response, mv); } catch (Exception var19) { dispatchException = var19; } this.processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); } catch (Exception var20) { this.triggerAfterCompletion(processedRequest, response, mappedHandler, var20); } catch (Error var21) { this.triggerAfterCompletionWithError(processedRequest, response, mappedHandler, var21); } finally { if (asyncManager.isConcurrentHandlingStarted()) { if (mappedHandler != null) { mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response); } } else if (multipartRequestParsed) { this.cleanupMultipart(processedRequest); } } }

    第三步:找到了 mappedHandler  Ctrl+右键 进入getHandler

    public interface HandlerMapping {
        String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE = HandlerMapping.class.getName() + ".pathWithinHandlerMapping";
        String BEST_MATCHING_PATTERN_ATTRIBUTE = HandlerMapping.class.getName() + ".bestMatchingPattern";
        String INTROSPECT_TYPE_LEVEL_MAPPING = HandlerMapping.class.getName() + ".introspectTypeLevelMapping";
        String URI_TEMPLATE_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".uriTemplateVariables";
        String MATRIX_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".matrixVariables";
        String PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE = HandlerMapping.class.getName() + ".producibleMediaTypes";
    
        HandlerExecutionChain getHandler(HttpServletRequest var1) throws Exception;
    }
    

    第四步:发现他是一个接口Alt+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);
            }
        }
    

      

  • 相关阅读:
    jQuery找出所有没有disabled属性的checkbox
    jQuery prop()方法
    Aliyun 中PHP如何升级
    The connection to the server localhost:8080 was refused
    ks8集群扩容新增节点,以及xshell无法访问的问题
    设置小程序模板消息keyword_id_list问题
    git如何新建仓库,并初始化代码
    k8s应用配置详解
    git如何把分支变成master
    nginx首页根据IP跳转
  • 原文地址:https://www.cnblogs.com/zhangyi0331/p/8618335.html
Copyright © 2011-2022 走看看