zoukankan      html  css  js  c++  java
  • 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

    标蓝部分就是请求转发

  • 相关阅读:
    Spring(4)——面向切面编程(AOP模块)
    Spring(3)——装配 Spring Bean 详解
    Spring(2)——Spring IoC 详解
    Spring学习(1)——快速入门
    彼得原理(The Peter Principle)
    默菲定律 [Murphy's Law]
    EXTJS 表单提交
    在java 中,数组与 List<T> 类型的相互转换
    Eclipse 工作目录被破坏,导致Eclipse 打不开
    EXTJS 密码确认与验证
  • 原文地址:https://www.cnblogs.com/yimengxianzhi/p/12323544.html
Copyright © 2011-2022 走看看