Spring MVC执行流程分析

前言:Spring MVC是一个基于Servlet
API构建的web框架,解决了基于Servlet+JSP+JavaBean开发过程中不足的地方,例如Servlet的xml配置、参数的解析、响应数据的转化、同一个Servlet处理相同业务的不同方法的分发以及跳转页面的设置比较麻烦,Spring MVC封装了Servlet并且优化不足的地方,同时也对Java Web中MVC架构模式做了增强和扩展。

流程介绍

说了这么多Spring MVC是做什么的呢? 一个web框架。 那具体些就是接受前端的请求,根据请求的路径找到服务器中对应的方法处理,然后再将返回的结果返回。接下来我们来详细了解整个过程:
1.一个请求发送到服务端,会到达前端控制器DispatcherServlet,DispatcherServlet为请求处理流程提供统一的调度。
2.收到请求后前端控制器首先会调用HandlerMapping,根据请求的url和配置的映射@RequestMapping匹配,生成处理器链,返回处理器Handler
3.适配器HandlerAdapter会调用Handler处理器,在调用处理方法之前会进行参数解析封装、验证、数据格式的转换,调用方法处理业务逻辑,将返回结果封装到ModelAndView中返回给前端控制器,
4.视图解析器ViewResolver会根据ModelAndView中的视图名称找到对应的jsp封装到View视图中
5.前端控制器根据返回的View进行视图渲染返回给前端
在这里插入图片描述

源码分析

查看源码来验证流程

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;
                Object dispatchException = null;

                try {
                    //文件上传相关
                    processedRequest = this.checkMultipart(request);
                    multipartRequestParsed = processedRequest != request;
                    //获取处理器链
                    mappedHandler = this.getHandler(processedRequest);
                    if (mappedHandler == 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 ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) {
                            return;
                        }
                    }

                    if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                        return;
                    }
                    //适配器调用方法,将处理结果封装到 ModelAndView中
                    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
                    if (asyncManager.isConcurrentHandlingStarted()) {
                        return;
                    }

                    this.applyDefaultViewName(processedRequest, mv);
                    mappedHandler.applyPostHandle(processedRequest, response, mv);
                } catch (Exception var20) {
                    dispatchException = var20;
                } catch (Throwable var21) {
                    dispatchException = new NestedServletException("Handler dispatch failed", var21);
                }
				//视图解析 返回
                this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);
            } catch (Exception var22) {
                this.triggerAfterCompletion(processedRequest, response, mappedHandler, var22);
            } catch (Throwable var23) {
                this.triggerAfterCompletion(processedRequest, response, mappedHandler, new NestedServletException("Handler processing failed", var23));
            }

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

        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值