Struts2的流程分析结合源码(史上最细!!!)

本文适合学过和用过struts2的人。

首先不多bb,上一张struts2的架构图,看着架构图对应着源码分析

StrutsPrepareAndExecuteFilter: struts2的核心过滤器,作用:拦截请求。

ActionMapper:核心过滤器会调用ActionMapper处理请求过来的url,看该请求是否需要

struts2来进行处理,如果需要会返回一个ActionMapping对象里面包含了

actionName,namespace等。

ActionProxy: 可以把它当作一个老板,ActionInvocation当作它的秘书,它会调用

ConfigurationManager去读取struts.xml的配置。

ConfigurationManager: 读取struts.xml的配置,struts.xml在内存中的映射。

struts.xml:这个就不用说了,是Stuts2的应用配置文件,负责诸如URL与Action之间映射关系

的配置、以及执行后页面跳转的Result配置等。

ActionInvocation: 作用是通过老板给的actionName,namespace等信息,调用对应的

Action,当然执行之前先执行拦截器

Interceptor: struts2的拦截器,默认20个,都是有着很重要的作用,比如参数拦截器(把

请求过来的参数封装到对应的Action属性中),模型驱动拦截器(把请求参数封装成一个

对象)。

其他的就不介绍了,一看就懂

首先先搭建好struts2的运行环境,引入jar包,配置核心拦截器,什么的就不说了。

Action

perfect.jsp(转发的页面)

自定义拦截器

首先在StrutsPrepareAndExecuteFilter中的doFilter方法中打个断点并访问action进入doFilter方法

这里的代码就是判断该请求是否归struts2来处理,不归struts2管的话就直接doFilter放行,显然我们这里是需要struts2来处理的请求,所以进行下一步。

程序执行到这一行看字面意思就知道是创建 数据中心,就是包含了很多数据的一个map,比如request,response,session等。这里我们进入这个方法看下到底做了什么

这里我检几个重要的代码给大家看下,第一个圈出来的就是获取数据中心,第二个判断如果之前没有数据中心,我们就创建一个值栈ValueStack,学过struts2的就知道值栈中有个栈,还有个context(Map),接下来看它执行了什么呢,根据request,response创建一个contextMap,put给值栈中的Context,然后再把ValueStack中的Context的获取出来实例化ActionContext,也就是数据中心并返回。下面我们再回来继续走我们的核心过滤器。

走到核心过滤器这里,我们看到了一个wrapRequest方法,就是包装request对象,学过struts2的就知道,在action中获得到的request就是被包装过的,可以看到没有执行这个方法之前这个request属于org.apache.catalina.connector这个包下。执行这个方法之后呢,竟然变成了org.apache.struts2.dispatcher.StrutsRequestWrapper类,那我们进入这个类中看到底包装了什么呢?

看这个request中的包装类到底对什么进行了包装呢,发现里面的getAttribute方法有点猫腻,方法中先调用了父类的getAttribute方法,那我们看它父类到底是谁呢?

就是原生的request对象,接着我们在看下面执行了什么。

意思是如果ActionContext不为空且从原生request中获取到的值为null,我们就去值栈中获取值,调用findValue方法。再根据我们之前学的ognl表达式中,是不是通过一个类的属性就能去值栈中的栈中找到对应的值。由此我们可以推断出在request中取值,首先会在原生request

中找,找不到再去值栈中找,现在值栈中的栈中找,再去Context域中找。

接着我们再回来继续执行核心过滤器中的代码

对应上面所说的会调用ActionMapper处理请求如果需要struts2处理这个请求就会返回一个mapping对象,不会就会放行,这里很明显mapping中封装了actionName和namespace等信息,接下来进入executeAction方法中看下。

在进入serviceAction方法

这里根据mapping中的信息创建老板对象,下面老板给mapping中的信息让ActionInvocation(秘书)去执行拦截器和action,我们进入execute方法。

再进入秘书执行拦截器的方法

判断这个是否还有拦截器,这里不用while循环而用了if,是因为把秘书对象传给拦截器中的intercept方法,方法中又递归调用了秘书的invoke方法,所以直到调用完拦截器才会执行Action。

配置拦截器的时候,先配置了自定义的所以就执行了拦截器的前处理,然后放行,执行完系统的20个拦截器后,最终执行到Action中。

最终返回结果跳转到视图,进行渲染,然后进行拦截器的后处理。

为什么这样配置就会跳转到页面中呢,持续关注,下次分析源码解释。

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

推荐阅读更多精彩内容