zoukankan      html  css  js  c++  java
  • Spring MVC请求执行流程

    学习Spring MVC时间有点长了,但是最近打算找工作,需要重新了解下,所以又去温故知新了。Spring MVC就是用来写web的框架,简化你写web的一些不必要的流程,让程序员能专注于业务逻辑也就是controller的代码编写。这篇文章是比较详细的描述Spring MVC的流程Spring MVC 流程图 ,下面我在此基础上做一些补充说明。

    首先讲一下SpringMVC处理请求的流程。如下图所示:
    这里写图片描述


    Spring工作流程描述:

      1. 用户向服务器发送URL请求,请求被Spring前端控制的DispatcherServlet捕获进行处理;
    
      2. DispatcherServlet对请求URL进行解析,去HandlerMapping中获取对应的Handler处理器(也就是Controller类中相应的处理方法),
       然后返回一个HandlerExcutionChain执行链给DispatcherServlet,执行链中包括对应的Handler处理器以及若干个拦截器;
    3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法);  补充一点:为什么需要先调用HandlerAdapter呢?  答:Handler的书写方式可以是不一样的,可能是注解,也可能是你自己写的handle,就是继承某个类,实现某一个接口的。此时就需要HandlerAdapter根据你传过来的HandlerExcutionChain中的Handler找到你真正需要的Handler;  重点说一下HandlerAdaper:  (1)DispatcherServlte会根据配置文件信息注册HandlerAdapter,如果在配置文件中没有配置,那么DispatcherServlte会获取HandlerAdapter的默认配置,如果是读取默认配置的话,DispatcherServlte会读取DispatcherServlte.properties文件,该文件中配置了三种HandlerAdapter:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter和AnnotationMethodHandlerAdapter(3.1以后已经过时,使用RequestMappingHandlerAdapter)。
        DispatcherServlte会将这三个HandlerAdapter对象存储到它的handlerAdapters这个集合属性中,这样就完成了HandlerAdapter的注册。  (2)DispatcherServlte会根据handlerMapping传过来的controller与已经注册好了的HandlerAdapter一一匹配,看哪一种HandlerAdapter是支持该controller类型的,
        如果找到了其中一种HandlerAdapter是支持传过来的controller类型,那么该HandlerAdapter会调用自己的handle方法,handle方法运用java的反射机制执行controller的具体方法来获得ModelAndView,
        例如SimpleControllerHandlerAdapter是支持实现了controller接口的控制器,如果自己写的控制器实现了controller接口,那么SimpleControllerHandlerAdapter就会去执行自己写控制器中的具体方法来完成请求。
    4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:    HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息:   数据转换:对请求消息进行数据转换。如String转换成Integer、Double等    数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等    数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中 5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象,    其中,model是数据模型,就是处理后传回来的数据;view就是视图名称,你需要将model数据放进去的视图的名称; 6. 根据返回的ModelAndView,去ViewResolver查询视图(必须是已经注册到Spring容器中的ViewResolver),然后返回一个真正的视图,返回给DispatcherServlet ; 7. DispatcherServlet 根据获得的真正视图以及model数据,渲染视图 8. 将渲染结果返回给客户端。

    参考文献:
    spring MVC处理请求过程及配置详解

    Spring MVC 流程图

    spring mvc 处理流程整理

  • 相关阅读:
    [HDU 2553] N皇后问题
    [ZOJ 3063] Draw Something Cheat
    [ZOJ 3609] Modular Inverse
    [ZOJ 3610] Yet Another Story of Rock-paper-scissors
    [ZOJ 3607] Lazier Salesgirl
    [ZOJ 3710] Friends
    [ZOJ 3076] Break Standard Weight
    智慧树自动刷课代码
    Attention
    sizeof总结
  • 原文地址:https://www.cnblogs.com/loren-Yang/p/7466127.html
Copyright © 2011-2022 走看看