SpringMVC工作原理

  1. 用户发送请求至前端控制器DispatcherSevrlet
  2. 前端控制器调用HandlerMapping处理器映射器(一般通过配置的xml、注解方式进行查找)找到具体的处理器,生成处理器对象及处理器拦截器一并返回给DispatcherServlet
  3. DispatcherServlet再去调用处理器适配器HandlerAdapter
  4. HandlerAdapter经过适配找到具体的处理器(Controller)
  5. controller处理具体的业务之后返回ModelAndView给HandlerAdapter给DispatcherServlet
  6. DispatcherServlet将ModelAndView传给视图解析器ViewResolver进行视图解析
  7. ViewResolver将解析得到的View返回给DispatcherServlet
  8. DispatcherServlet将视图进行渲染(将数据模型填充到视图中)
  9. DispatcherServlet响应用户

前端控制器DispatcherServlet本质是一个servlet,拦截到用户的请求之后,DispatcherServlet会去调用定义在其父类FrameworkServlet中的service方法,进而调用DispatcherServlet中的doService方法,进而调用DispatcherServlet中的doDispatch方法

上述大多数的逻辑都在 doDispatch方法中进行处理
贴上加了注释的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 {
        try {
            ModelAndView mv = null;
            Exception dispatchException = null;

            try {
                processedRequest = this.checkMultipart(request);
                multipartRequestParsed = processedRequest != request;
				//处理器映射器HandlerMapping根据request拿到处理器执行链HandlerExecutionChain(具体的执行逻辑在getHandler方法中)
				//HandlerExecutionChain中有个handler参数,里面包含了具体的controller.method和interceptors等信息
                mappedHandler = this.getHandler(processedRequest);
                if (mappedHandler == null || mappedHandler.getHandler() == null) {
                    this.noHandlerFound(processedRequest, response);
                    return;
                }
	
				//根据HandlerExecutionChain中的handler参数得到一个处理器适配器HandlerAdapter
                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()) {
                        String requestUri = urlPathHelper.getRequestUri(request);
                        this.logger.debug("Last-Modified value for [" + requestUri + "] is: " + lastModified);
                    }

                    if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) {
                        return;
                    }
                }

				//执行拦截器中的preHandle方法
                if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                    return;
                }

                try {
					//handle方法去适配具体的controller处理具体的业务之后返回ModelAndView给HandlerAdapter
                    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
                } finally {
                    if (asyncManager.isConcurrentHandlingStarted()) {
                        return;
                    }

                }

                this.applyDefaultViewName(request, mv);
				//执行拦截器中的postHandle方法
                mappedHandler.applyPostHandle(processedRequest, response, mv);
            } catch (Exception var28) {
                dispatchException = var28;
            }

			//进行试图解析
            this.processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        } catch (Exception var29) {
            this.triggerAfterCompletion(processedRequest, response, mappedHandler, var29);
        } catch (Error var30) {
            this.triggerAfterCompletionWithError(processedRequest, response, mappedHandler, var30);
        }

    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            return;
        } else {
            if (multipartRequestParsed) {
                this.cleanupMultipart(processedRequest);
            }

        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值