springMVC的执行请求过程

 

springMVC的运行流程:

 

 

 

 

1、用户发送请求至前端控制器DispatcherServlet

 

2、DispatcherServlet收到请求调用HandlerMapping处理器映射器

 

3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)并返回给DispatcherServlet

 

4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器

 

5、执行处理器(Controller,也叫后端控制器)

 

6、Controller执行完成返回ModelAndView

 

7、HandlerAdapter将controller执行结果(ModelAndView)返回给DispatchServlet

 

8、DispatchServlet将ModelAndView传给ViewResolver视图解析器(如果加上@responsebody注解,则返回值不通过viewResolver,而是直接返回object)

 

9、ViewResolver解析后返回具体View

 

10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)

 

11、DispatcherServlet响应用户

 

从以上过程可以看出,DispatcherServlet有接受请求,响应结果,转发等作用。有了DispatcherServlet之后,可以减少组件之间的耦合度。

简要过程如下:

 

下面我们从源码来详细分析请求的执行过程:

我们从页面发送的请求,进入DispatcherServlet类Service方法(位于DispatcherServlet类继承的——FrameworkServlet类中)捕获该请求:

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        HttpMethod httpMethod = HttpMethod.resolve(request.getMethod());
        if (HttpMethod.PATCH == httpMethod || httpMethod == null) {
            processRequest(request, response);
        }
        else {
            super.service(request, response);
        }
    }    

获取到对应方法之后会调用对应(此处为doGet)方法:

    @Override
    protected final void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        processRequest(request, response);
    }

    @Override
    protected final void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        processRequest(request, response);
    }

//还有方法不列举......

进入processRequest方法——执行其doService方法:

 

 而此doService方法也就是DispatcherServlet中的doService方法(该方法将一些值传如request对象中):

 

 然后执行其中的doDispatch方法:

 

 进入该方法可知该方法处理了适配器以及GET请求:

 

 然后执行Handler方法并构建视图processDispatchResult:

 

 我们进入processDispatchResult方法查看构建,其中可看到

如果出现请求出现异常将会构建一个异常视图(如404页面等)

而在这之前我们需要的视图构建在render里创建:

 

 我们沿着这一条线索往下走找到其实现的AbstractView中的render:

 

 其中的renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);用于将请求和数据进行处理

继续往下走找到其实现的InternalResourceView中的renderMergedOutputModel

 

 其中的红线标注的就是处理的Dispatch

标蓝部分就是请求转发

 

posted @ 2020-02-17 20:50  一梦先知  阅读(832)  评论(0编辑  收藏  举报