学习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 处理流程整理

Spring MVC请求执行流程的更多相关文章

  1. spring mvc 详细执行流程

    名词解释 DispatcherServlet:整个spring MVC的前端控制器,由它来接管来自客户端的请求. HandlerMapping:DispatcherServlet会通过它来处理客户端请 ...

  2. Spring mvc的执行流程

    一个请求匹配前端控制器 DispatcherServlet 的请求映射路径(在 web.xml中指定), WEB 容器将该请求转交给 DispatcherServlet 处理 DispatcherSe ...

  3. Spring Bean的生命周期、Spring MVC的工作流程、IOC,AOP

    1.Spring Bean的生命周期? (1)构造方法实例化bean. (2)构造方法设置对象属性. (3)是否实现aware接口,三种接口(BeanNameAware,BeanFactoryAwar ...

  4. Spring MVC请求流程

    Spring MVC 发起请求到前端控制器DispathServlet 前端控制器请求处理器映射器 handerMapping查找handler 处理器映射器handerMapping像前端控制器返回 ...

  5. Spring MVC整体处理流程

    一.spring整体结构 首先俯视一下spring mvc的整体结构 二.处理流程 1.请求处理的第一站就是DispatcherServlet.它是整个spring mvc的控制核心.与大多数的jav ...

  6. Servlet的生命周期以及在Spring MVC中调用流程

    接触Web时间比较久,虽然知道Servlet的生命周期但是理解却还是不够,今天刚好debug代码涉及这块就利用余下时间研究了一下. Servlet的生命周期以及处理浏览器请求的过程.Servlet接口 ...

  7. spring mvc请求过程

    spring mvc处理请求过程 1.    首先客户端发送一个HTTP请求,Web服务器接收这个请求,如果匹配DispatcherServlet的请求映射路径,web容器将请求转交给Dispatch ...

  8. spring mvc 请求转发和重定向(转)

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

  9. spring mvc 请求转发和重定向

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

随机推荐

  1. STF,docker学习资料整理

  2. jrebel的安装配置

    1,在线安装jrebel[也可以离线,不过在线可以直接支持maven] 2,然后按照如下步骤 http://idea.goxz.gq/ilanyu 242367666@qq.com 随意邮箱    然 ...

  3. (转)Java compiler level does not match解决方法

    背景:工作中导入以前的项目,导出报Java compiler level does not match the versionof the installed Java project facet. ...

  4. 最近任务 && react文章列表

    最近任务 读书 数据分析 react深入学习 可视化大图 移动端入门 [React学习] 入门学习-文本渲染 http://www.cnblogs.com/huxiaoyun90/p/4783663. ...

  5. HDOJ2008-数值统计

    Problem Description 统计给定的n个数中,负数.零和正数的个数.   Input 输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然 ...

  6. Java栈与堆 (转)

    1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于C ...

  7. ML(2)--感知机

    案例银行办信用卡--获得感知机 我们到银行办信用卡时,银行并不是直接就给你办卡的,而是会根据你的一些个人信息.消费信息.个人信誉等指标综合考虑后,才会决定是否给你办卡(不像现在银行办信用卡有点随意). ...

  8. opnet点对点通信模型 分类: opnet 2014-05-26 22:15 246人阅读 评论(3) 收藏

    网络包含两个节点,一个发送节点,一个接收节点.发送节点按照某种随机的规律产生数据包(包大小和包间隔可自己定义),然后发送给接收节点.传输过程中会有一些随机的差错(误包率也可自己定义).接收节点收到正确 ...

  9. ASP.NET Core MVC – Caching Tag Helpers

    简介 缓存可以大大提高应用程序加载时间和响应速度.我们可以使用缓存Tag Helpers缓存不会频繁更改的HTML内容. 在上一篇文章中,我们谈到了Tag Helpers,演示Tag Helpers能 ...

  10. CentOS编译PHP过程中常见错误信息的解决方法

    原文链接:http://www.linuxidc.com/Linux/2014-05/102327.htm ********************************************** ...