一、 飞机

最近马来西亚航空370号班机事故闹得沸沸扬扬,情节整的扑朔迷离,连我在钻研springMVC平和的心情都间接的受到了影响。正当我在想这个MVC的处理过程可以怎样得到更好的理解呢?灰机,灰机… 同事的议论和天上的嗡嗡声刹那间给了我一个答案,可以和民航系统进行类比。

民航系统类似于一个专业处理旅行的系统,此系统中有一些对旅行去做的事比如出差等本身意义不大,只在旅行系统中才存在的术语。比如说

1. 航班MH370是一个航班代号,表示从吉隆坡到北京的航班;

2. 航班时刻表来进行记录,查找所有的飞行航班;

3. 机票:在民航系统中唯一标识旅行者的token,上飞机需要飞机票,下飞机凭飞机票取行李;

4. 安检:检查一下有没有带违禁品;

5. 飞机:完成从出发地到目的地的旅行;

6. 机场:从乘客来看,无非是机票发售,安全检查,提供航班的地方。

 

回到web系统,一个url就是唯一标识一个处理逻辑的名称。比如login.do就等于登陆逻辑的标识。HandlerMapping相当于航班时刻表,标识航班和对应的路线。HandlerMethod相当于处理航班的飞机,来完成从登机处到目的地的转换。handlerAdapter 相当于从日常状态处和飞行状态转换的适配工具,类似于机场。HandlerInterceptor相当于在这个转换过程中的共性处理逻辑,如购买机票,上飞机前要去凭身份证购买机票,到了目的地还要凭机票取行李等航班旅行通用的事项。

 

这四大组件构成了spring mvc 这个处理的基石。如图所示:

 

图1:四大组件

 

显然,当进行旅行,需要完成从普通状态到旅行状态的适配,如将身份证和钱转换成机票(在旅行中唯一标识自己身份的token) ,然后还要将行李存到飞机上;到了目的地机场后,就要进行旅行状态到普通状态的适配,使用机票进行取行李的操作。所有的登机过程都要经历一些通用逻辑的处理,如进行安检,进行行李托运/取回。这部分就构成了HandlerInterceptor的存在理由。

 

这四大组件充分的将web环境和业务逻辑环境解耦,使得业务逻辑可以更关注业务本身,并将横向的旅行逻辑和纵向的通用逻辑如安检进行切割。这四大组件本身都是可扩展的,HandlerMethod最通用,为方法级别的抽象。HandlerInteceptor是纵向逻辑的扩展接口,HandlerAdapter是从web环境到业务环境的适配扩展接口,HandlerMapping是将URL请求到业务逻辑映射的扩展接口。

 

一、 组件结构

HandlerMapping

HanderAdapter

 

三、 处理过程:

  逻辑主要集中在org.springframework.web.servlet.DispatcherServlet.doDispatch(HttpServletRequest, HttpServletResponse)

 

A.根据请求(如url,参数,head等)特征来得到相应的方法和其匹配的拦截器集合。Spring mvc 3.0可用注解来标识处理逻辑方法和URL映射关系,因此涉及到扫描源代码标识为@Controller的类,并从中寻找@RequestMapping来进行映射表的生成。

mappedHandler = getHandler(processedRequest, false);

 

1. org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(HttpServletRequest)

获取请求路径lookupPath去寻找相应的handlerMethod方法

 

  1.1 org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(String, HttpServletRequest)

 

     1.1.1 先将所有的映射按照requestURI来分组并存储在urlMap中。urlMap中根据请求路径找到对应的匹配列表,以进行进一步匹配。匹配列表中除请求的requestURI相同外,其他某些特征如方法,POST,GET,请求的head是不同的。

 

     1.1.2 org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getMatchingMapping(RequestMappingInfo, HttpServletRequest)

 

      先从请求中找到匹配条件,如method,params,produce,consume等条件,满足产生match

      并对这些match的匹配程度进行排序,得到最匹配的match

 

2.getHandlerExecutionChain(handler, request)

   将匹配的Interceptor也加入,并返回

 

B.HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

适配处理方法如何适配,会从request中得到相应的parameter,session,Model等等,来支持自定义Controller的参数。

1. org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(HttpServletRequest, HttpServletResponse, Object) 进行适配

 

1.1 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(HttpServletRequest, HttpServletResponse, HandlerMethod)

 

1.2 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(HttpServletRequest, HttpServletResponse, HandlerMethod)

 

  1.2.1数据绑定方法和controller对应

  适配主要包含两部分,调用参数的适配和返回结果的适配

 

C.HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();

得到所有的interceptors并且将interceptors.preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)进行逐个调用。

 

D.进行调用

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

 

E.所有的interceptors进行postHandle调用

interceptor.postHandle(processedRequest, response, mappedHandler.getHandler(), mv);

 

F.org.springframework.web.servlet.DispatcherServlet.render(ModelAndView, HttpServletRequest, HttpServletResponse)渲染页面

检查mv 是否是引用,比如是字符串,并进行相应view 的解析

 

1.org.springframework.web.servlet.DispatcherServlet.resolveViewName(String, Map<String, Object>, Locale, HttpServletRequest)调用viewResolver.resolveViewName(viewName,locale);

 

2. view.render(mv.getModelInternal(), request, response)

 

G.最后调用interceptor的org.springframework.web.servlet.HandlerInterceptor.afterCompletion(HttpServletRequest, HttpServletResponse, Object, Exception)

Spring学习笔记(四)--MVC概述的更多相关文章

  1. 【Spring学习笔记-MVC-11--】Spring MVC之表单标签

    一.使用方法 1.要使用Spring MVC提供的表单标签,首先需要在视图页面添加: <%@ taglib prefix="form" uri="http://ww ...

  2. Spring学习笔记四:SpringAOP的使用

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6776247.html  一:AOP基础概念 (1)通知(增强)Advice 通知,其实就是我们从众多类中提取出 ...

  3. Spring学习笔记四 整合SSH

    三大框架架构(整合原理) 步骤1:导包 Hibernate包 1.Hibernate包,hibernate/lib/required 2.hibernate/lib/jpa | java persis ...

  4. spring学习笔记四:AOP

    AOP(Aspect Orient Programming),面向切面编程,是对面向对象编程OOP的一种补充 面向对象编程使用静态角度考虑程序的结构,而面向切面编程是从动态角度考虑程序运行过程 AOP ...

  5. spring学习笔记四:spring常用注解总结

    使用spring的注解,需要在配置文件中配置组件扫描器,用于在指定的包中扫描注解 <context:component-scan base-package="xxx.xxx.xxx.x ...

  6. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  7. 3.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:

    转自:https://www.cnblogs.com/ssslinppp/p/4528892.html 概述 在文章:<[Spring学习笔记-MVC-3]SpringMVC返回Json数据-方 ...

  8. 【Spring学习笔记-MVC-15.1】Spring MVC之异常处理=404界面

    作者:ssslinppp       异常处理请参考前篇博客:<[Spring学习笔记-MVC-15]Spring MVC之异常处理>http://www.cnblogs.com/sssl ...

  9. 【Spring学习笔记-MVC-13.2】Spring MVC之多文件上传

    作者:ssslinppp       1. 摘要 前篇文章讲解了单文件上传<[Spring学习笔记-MVC-13]Spring MVC之文件上传>http://www.cnblogs.co ...

  10. 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回

    作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...

随机推荐

  1. Renesas 符号地址空间对齐

    对齐方式定义头文件:bsp_compiler_support.h #define BSP_SECTION_STACK ".stack" #define BSP_SECTION_HE ...

  2. CArray,CList,CMap如何实例化

    1.定义一个CMap,向这个CMap中增加数据项(键-值对).CMap<CString, LPCTSTR, CString, LPCTSTR>m_ItemMap;CString strKe ...

  3. 对SQLite数据库操作 操作db文件

    sqlite数据库就是一个DB文件.  程序每操作一次数据库都要读一次 .DB  文件 .  这个文件就是这个SQLite数据库. 如果需要依赖包的可以联系我 工具类: package com.hot ...

  4. 减少TIME_WAIT时间的优化配置

    减少TIME_WAIT时间的优化配置 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: net.ipv4.tcp_max_syn_backlog=8192 增加TCP S ...

  5. Appium+python自动化25-windows版appium_desktop_V1.7.1

    appium_desktop_v1.2.6 1.appium_desktop在github上最新下载地址:releases/tag/v1.2.6 2.下载后傻瓜式安装,然后启动appium,这个界面跟 ...

  6. java代码-----实现4个人打牌游戏的相关代码。线程

    总结:发送线程Sender().和接收线程Receiver() 虽然,这里的Sender()发送线程和Receiver()都有相同的睡眠时间,但是由于线程调度的不确定性,是的发送线程Sender每次发 ...

  7. 【POJ】2329 Nearest number - 2(搜索)

    题目 传送门:QWQ 分析 在dp分类里做的,然而并不会$ O(n^3) $ 的$ dp $,怒写一发搜索. 看起来是$ O(n^4) $,但仔细分析了一下好像还挺靠谱的? poj挂了,没在poj交, ...

  8. apk比较版本大小

    Java String.compareTo(), 此方法如果这个字符串是等参数字符串那么​返回值0,如果这个字符串是按字典顺序小于字符串参数那么返回小于0的值, 如果此字符串是按字典顺序大于字符串参数 ...

  9. 初探asciinema

    在学习c++的时候想到so库注入到某些程序中,网上查了一些资料,发现了一些比较好玩的程序,分享一下. 主要可以对操作的进行视频回放,类似堡垒机的功能 安装: pip3 install asciinem ...

  10. SharePoint 事件 7363:对象缓存:缓存使用的超级读者帐户没有足够的权限访问SharePoint数据库。

    转自MSND:http://technet.microsoft.com/zh-cn/library/ff758656(v=office.14) 对象缓存存储 Microsoft SharePoint ...