相信大家通过前文的学习,已经对SpringMVC这个框架多少有些理解了。还记得上一篇文章中SpringMVC的处理流程吗? 
 
这个图大致描述了SpringMVC的整个处理流程,这个流程图还是相对来说比较容易懂的,下面我会给出SpringMVC的框架结构图,这个图相对来说会更复杂,不过经过我细致入微的讲解,相信大家都可以深入理解。

SpringMVC框架结构

SpringMVC框架结构如下图所示: 
 
下面我会对SpringMVC框架结构作细致入微的讲解。

架构流程

  1. 用户发送请求至前端控制器DispatcherServlet。
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  4. DispatcherServlet通过HandlerAdapter处理器适配器调用处理器。
  5. 执行处理器(Controller,也叫后端控制器)。
  6. Controller执行完成返回ModelAndView。
  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
  9. ViewReslover解析后返回具体View。
  10. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
  11. DispatcherServlet响应用户。

上面大致上对SpringMVC框架结构做了一个粗略的解释,下面我则会做一个更加细致入微的讲解。

  1. 浏览器发送请求,请求具体发到谁呢?先发到前端控制器,也就是说所有的请求都给发到前端控制器,前端控制器是所有请求的入口,但前端控制器不能处理业务请求,它只是一个请求的转发。
  2. 谁来处理业务请求呢?Handler处理器来真正处理业务请求,那么问题来了,前端控制器如何来找到这个Handler处理器呢?处理器映射器记录的就是请求的url和处理的方法之间的映射关系,这个映射关系是怎么建立起来的呢?就是通过@RequestMapping这个注解来建立起来的,这个映射关系就相当于一个Map(key-value这种形式),key就是请求的url,value就是处理的Handler。现在,前端控制器拿到这个请求之后,要找到对应的Handler,怎么找呢?就要找处理器映射器,问它请求谁来处理?
  3. 处理器映射器会根据你请求的url来找对应的处理器,找不到就会报错,如果找到之后,这时,它就会返回一个处理器执行链,这个处理器执行链里面除了有Handler之外,还有拦截器(这儿我们可以开发自己的拦截器),然后返回给前端控制器。
  4. 前端控制器依然不能处理这个业务请求,它这时做的还有另外一件事情,因为返回Handler,它也不知道这个Handler是什么类型,因为在spring mvc中Handler除了可以是注解形式的之外,其实还可以是非注解形式的(非注解形式我们一般不用),前端控制器并不知道这个Handler到底是什么类型的,那就没办法执行它,那总得找个东西执行,这时它就会把这个事交给另外一个组件来处理,这个组件就叫处理器适配器,这个处理器适配器就是来适配不同类型的Handler。它就会根据你不同类型的Handler来选择不同类型的适配器来执行它。
  5. 假如当前Handler是注解形式的,那么它就会选择注解形式的处理器适配器来执行这个Handler。Handler就执行了,也就是说我们Controller类中的那个方法就执行了,方法执行之后,里面的业务就处理了。
  6. 业务处理之后,最后返回一个ModelAndView。处理器适配器拿到这个结果是没有用的,它的作用就是执行这个Handler,把这个Handler执行完之后,它的事就做完了。
  7. 做完之后,拿到这个返回结果,那么它会原封不动地把这个返回结果扔给前端控制器,这时处理器适配器的事就做完了。
  8. 前端控制器拿到这个ModelAndView,它还是没有办法处理,它还是不能返回html,这时它要找到相应的jsp,因为ModelAndView即包含模型又包含视图,这个视图指定我们要用谁来渲染这个数据。我们要渲染数据,这时它就要找一个视图解析器来解析这个视图,由于这个视图也有很多种(我们最常见的视图是jsp,除了jsp,其实还有其他的,比如说还可以是报表,还可以是pdf,还可以是freemaker等),它会找不同的视图解析器来处理。因为现在我们最常用的视图是jsp,所以它就找到jsp对应的视图解析器。
  9. 找到这个视图解析器,它来把这个视图解析,解析完了之后它会返回一个View对象。
  10. 最后我们再调用这个视图解析器的渲染视图这个过程,渲染视图这个过程其实就是对于我们的jsp来说,就是把这个数据渲染成html。
  11. 最终渲染成html之后,就响应给用户。

通过以上的分析大家有没有更好地理解SpringMVC的架构流程呢?我可能写的比较绕口,但确是对我来说比较好理解一点,希望对你也是一样。

组件说明

以下组件通常使用框架提供实现:

  • DispatcherServlet:前端控制器 
    用户请求到达前端控制器,它就相当于mvc模式中的c,DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。
  • HandlerMapping:处理器映射器 
    HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
  • Handler:处理器 
    Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
  • HandlAdapter:处理器适配器 
    通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
  • ViewResolver:视图解析器 
    ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
  • View:视图 
    SpringMVC框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

总结

在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。其实真正需要程序员开发的就两大块:一个是Handler,一个是jsp,这样的话,其实和Struts2就差不多了.

最新文章

  1. 原生JS实现购物车结算功能代码+zepto版
  2. 易全解token获取
  3. fiddler抓包工具1
  4. scp命令的用法详解
  5. iOS及Mac开源项目和学习资料【超级全面】
  6. Netbeans7.0完美中文+Consolas字体显示配置(亲测可用)
  7. C#学习第二天
  8. poi简单案例
  9. 语法糖----JAVA
  10. Python中元素定位探讨
  11. 微信小程序选项卡功能
  12. 【leetcode】经典算法题-Counting Bits
  13. 页面加载过渡页 loading plugin css
  14. 【申嵌视频】5-1 ubuntu下安装VMWare Tools工具
  15. Android手机不插USB,使用adb网络远程调试
  16. 基于Struts2框架的文件下载 --- Struts2
  17. 《剑指offer》第三十五题(复杂链表的复制)
  18. 为了记忆和方便翻阅 vue构建后的结构目录说明
  19. IOS 开发入门
  20. 路径名导致的异常:javax.imageio.IIOException: Can't read input file!

热门文章

  1. 利用bat批处理——实现数据库的自动备份和删除
  2. PHP的错误处理和异常处理
  3. 脑图工具MindNode"附属节点"是什么意思 图解
  4. Windows10 下安装 Mongodb
  5. HDU 5533 Dancing Stars on Me( 有趣的计算几何 )
  6. BZOJ 2329/2209 [HNOI2011]括号修复 (splay)
  7. qt quick中qml编程语言
  8. Python 绘图与可视化 matplotlib(上)
  9. [剑指offer] 5. 用两个栈实现队列+[剑指offer]30. 包含min函数的栈(等同于leetcode155) +[剑指offer]31.栈的压入、弹出序列 (队列 栈)
  10. poj 2663 Tri Tiling (状压dp+多米诺骨牌问题+滚动数组反思)