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;
}
原文地址:https://www.cnblogs.com/erci-520/p/8617722.html