spring mvc源码学习笔记(学习自springMvc源代码分析与实践)

SpringMvc自身创建的过程

mvc中的servlet一共有三个层次,分别为HttpServletBean FrameworkServlet DispatcherServlet其中第一个是直接继承httpServlet 第二个是初始化webapplicationContext 第三个是初始化自身的9大组件

DispatcherServlet

主要使用OnRefresh调用initStrategies初始化9大组件

如initLocalResolver:首先通过在webApplicationContext。context.getBean在容器中找到相应的组件, 

能获取则获取不能获取则采用getDefaultStrategy来实现,getDefaultStrategy()实际创建的方法使用的是ClassUtils.forName() 其中需要的className是通过静态代码块加载进来的,静态代码块是在DispatcherServlet的DEFAULT_STRATEGIES_PATH中定义的键值对

了解请求从servlet到springMVC再到DispatcherServlet都处理了些什么

1.httpservletBean主要参与创建不涉及请求处理

2.(servlet处理流程是从service开始,在httpservlet根据请求的类型不同路由到(doGet doPost..)然后返回只有header没有body的Response)

FrameworkServlet中 所有需要进行自己处理的请求(doGet doPost)等都交由processRequest进行处理而processRequest核心语句是doService,此为一个模板的方法,具体实现在dispatcherServlet具体实现

processRequest总共做了三件事,另外两件事情是2.将当前请求的LocaleContext和ServletRequestAttributes在处理请求前设置到了LocalContextHolder,并在请求处理完成后恢复

第三件事是发布了ServletRequestHandledEvent消息

3.DispatcherServlet,:处理的入口方法是doService > doDispatch进行具体处理 》首先判断是否是include请求,如果是则对request的Attribute进行快照备份,等doDispatch处理完之后进行还原

doDispatch:主要实现源码

doDispatch:主要实现源码

1.根据request找到Handler 

2.根据handler找到对应的handlerAdapter

3.通过HandlerAdapter处理handler

4.调用processDispatchResult处理上面的处理结果(找到view并输出给用户)

总结dodispatch流程:

检查是否是上传请求(MultipartResolver) >  找到对应的Handler(handlerMapping)> 

核心:找到handlerAdapter(HandlerAdapter) > 处理Intercepter的preHandle方法 > HandlerAdapter使用Handler进行请求处理 > 判断是否需要异步处理 > 执行 Intercspter的postHnadle方法

>> 异常的处理的HandlerExceptionResolver(处理中的异常) > 渲染页面 (LocaleResolver + ViewResolver + ThemaResolver)

组件大致了解

HandlerMapping

该接口只有方法 HandlerExecutionChain getHandler(HttpServletRequest request ) thows Exception

查找handlerMapping可以通过order定义遍历顺序。order越小越先使用

<bean class = "com.hha.zhang " p : order = "1">查找handlerMapping是找到一个handlerMapping后立即停止查找并返回

HandlerAdapter:总共存在三个方法:

1.supports() >判断是否可以使用某个handler ;

2.handler() 是用来具体使用handler干活 

3.LastModified()记录资源最后一次修改的时间

HandlerExecptionResolver

专门的角色用于对异常的情况进行处理,根据异常设置modelAndView然后交由给render进行渲染,该组件不能处理render过程中的异常,改接口只有一个方法resolveException

ViewResolver

用来将String类型的视图名和local解析为view类型的视图,该接口也只有一个方法 resolveViewName()

其做的主要工作是:将程序返回的参数填入模板中,生成html的文件,两个关键的问题是:使用哪个模板。以及用什么技术填入参数

RequestToViewNameTranslator

用于根据viewName查找view ,但是有的handler处理完以后没有设置view 也没有viewName然后就得从Reauest中获取,此时就用该接口,其中有一个getViewName方法,只要通过request获取到viewName就可以了

LocalResolver

解析视图需要两个参数一个是视图名称 一个是locale ,视图名称通过处理器返回或者通过RequestToViewNameTranslator在Request中获取

local就是从localResolver中获取 

local:(是zh-cn 之类 表示一个区域,有了这个就可以对不同区域的用户显示不同的结果,这就是i18n国际化的基本原理,localeResolver是i18n的基础)

ThemeResolver

用于解析主题使用的有一个接口是setThemeName()

MultiPartResolver

用于处理上传请求的,处理方式是通过将普通的request包装成Muitipart-HttpServletRequest,后者可以通过getfile的方法获取File如果上传多个文件,还可以调用gerFileMap得到FileName > file的结构map,因为上传可以不用multiResolver可以直接使用原来的request,所以该组件在springmvc中每没有提供默认值

FlashMapManager

flashmap的主要作用是在 redirect中传递参数,该manager是管理flashmap的


详细了解HandlerMapping , HandlerAdapter,HandlerExceptionResolver ,

处理器映射器 处理器适配器 异常处理器

handlermapping:继承结构图

AbstractHandlerMapping:先找handler 再通过getHandlerExecutionChain添加拦截器

找handler的过程:

1.通过getHandlerInternal(request)的方法获取,这是个模板方法,留给子类实现

2.如果没有获取到,则使用默认的handler,默认的handler在abstractHandlerMapping的一个object类型的属性defaultHandler中,

3.如果找到了的话handler是String类型,则去spirngMvc容器中找到相应的bean

AbstractUrlHandlerMapping总结:

首先在abstractIUrlHandlerMapping中涉及了整体的架构,并完成了查找handler的具体逻辑,其中需要板寸一个ur和handler的对应关系map,map留给子类SimpleUrlHandlerMapping进行初始化,通过调用registerHandler方法,初始化实现两种方式,一种是在陪孩子文件中配置,一种是在spring容器里查找

AbstaractHnadlerMethodMapping系列

该系列是Method作为handler来使用,这也是我们用的最多的一种handler,比如常用的@RequestMapping锁注释的方法就是这种handler

其中有三个map:handlerMethods ;urlmap;nameMap

handlerMethods:用于保存匹配条件(RequestConditon)和handlerMethod的对应关系

urlMap:保存着url和匹配条件(RequestConditon)的对应关系,这里的url是pattern,该map是MultiValueMap是一个key对应多个值的map

MultiValueMap<K,V> extends Map<K, List<V>>

namemap:该map保存name和HandlerMethod的对应关系,

处理逻辑:urlmap 先匹配url获取匹配原则,可能有多个匹配原则然后根据handlerMethods获取到handlerMethod,urlmap可能有多个匹配原则,有时候需要选择最优的找到handlermethod

HandlerMapping:AbstractHandlerMapping分为两个系列一个是AbstratctUrlHandlerMapping一个是AbstractHandlerMethodMapping,前者是通过url进行匹配的,后这匹配的内容较多,而且是直接匹配的Method


HandlerAdapter


结构图

最难得是AbstractHandlerMethodAdapter

handlerAdapter一共有三个方法:一个是判断是否支持,一个是用于处理handler请求,最后一个是用来获取资源的Last-Modified

后面三种分别适配httpRequestHandler Servlet Controller的Handler

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容