本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188
首先我们看一下struts官方给我们提供的struts执行流程
从上面流程图我们可以看出struts执行的流程大体分一下阶段:
1.初始的请求通过一条标准的过滤器链,到达servlet容器(比如tomcat容器,WebSphere容器)。
2.过滤器链包括可选的ActionContextCleanUp过滤器,用于系统整合技术,如SiteMesh插件。
3.接着调用FilterDispatcher,FilterDispatcher查找ActionMapper,以确定这个请求是否需要调用某个Action。
4.如果ActionMapper确定需要调用某个Action,FilterDispatcher将控制权交给ActionProxy。
5.ActionProxy依照框架的配置文件(struts.xml),找到需要调用的Action类。
6.ActionProxy创建一个ActionInvocation的实例。ActionInvocation先调用相关的拦截器(Action调用之前的部分),最后调用Action。
7.一旦Action调用返回结果,ActionInvocation根据struts.xml配置文件,查找对应的转发路径。返回结果通常是(但不总是,也可能是另外的一个Action链)JSP技术或者FreeMarker的模版技术的网页呈现。Struts2的标签和其他视图层组件,帮助呈现我们所需要的显示结果。在此,我想说清楚一些,最终的显示结果一定是HTML标签。标签库技术和其他视图层技术只是为了动态生成HTML标签。
8.接着按照相反次序执行拦截器链(执行Action调用之后的部分)。最后,响应通过滤器链返回(过滤器技术执行流程与拦截器一样,都是先执行前面部分,后执行后面部)。如果过滤器链中存在ActionContextCleanUp,FilterDispatcher不会清理线程局部的ActionContext。如果不存在ActionContextCleanUp过滤器,FilterDispatcher会清除所有线程局部变量。
下面我们就来具体分析一下3-6四个步骤:
步骤三:FilterDispatcher查找ActionMapper,以确定这个请求是否需要调用某个Action。
1)
2)调用actionmapper去寻找对应的ActionMapping,因为actionmapper是一个接口,所有我们去他对应的实现类(DefaultActionMapper)里面去找getMapping方法,下面我们来看一下实现类里面的getMapping方法源代码:
ActionMapping代表struts.xml文件中的一个Action配置,被传入到serviceAction中。注意ActionMapping不代表Action集合,只代表某个对应的Action。如果是一个Action请求,(请求路径在struts.xml有对应的Action配置,即actionmapping不为空),则调用dispatcher.serviceAction()处理。找到对应的ActionMapping,下一步就去找具体的执行哪一个action,从FilterDispatcher源码中我们可以找到下一步流程:
从上面可以看出,FilterDispatcher类中是调用的serviceAction方法来寻找的去调用哪一个action。serviceAction()方法作用:加载Action类,调用Action类的方法,转向到响应结果。响应结果指<result/>标签所代表的对象。
步骤四、五、六:如果ActionMapper确定需要调用某个Action,FilterDispatcher将控制权交给ActionProxy。
我们来看一下具体的serviceAction源码:
关于valuestack说明一下:
1.valueStack的建立是在doFilter的开始部分,在Action处理之前。即使访问静态资源ValueStack依然会建立,保存在request作用域。
2.ValueStack在逻辑上包含2个部分:objectstack和contextmap,objectstack包含Action与Action相关的对象。
contextmap包含各种映射关系。request,session,application,attr,parameters都保存在contextmap里。
parameters:请求参数
atrr:依次搜索page,request,session,最后application作用域。
几点说明:
1.Valuestack对象保存在request里,对应的key是ServletActionContext.STRUTS_VALUESTACK_KEY。调用代理之前首先创建Valuestack副本,调用代理时使用副本,调用后使用原实例恢复。本处的值栈指objectstack。
2.Dispatcher实例,创建一个Action代理对象。并把处理委托给代理对象的execute方法。
最后我们在一起看一下ActionInvocation实现类中invoke方法执行的流程:invoke源代码:
这里算是执行action中方法的最后一步了吧,至此,action的整个流程就基本差不多了,从头到尾看下来,说实话,感触很多,很多不明白的地方,这算是近了自己最大的努力去看这些源码,感觉从里面收获了很多,里面很多的机制和知识点值得我们去学习,记住了圣思源张龙老师的那句话:源码面前,一目了然
分享到:
相关推荐
java程序员-从笨鸟到菜鸟.pdf
### Java程序员成长之路——从菜鸟到笨鸟 #### 一、引言 《Java程序员由菜鸟到笨鸟》是一本由曹胜欢编写的书籍,旨在帮助初学者掌握Java编程的基础知识,并逐步进阶至更高级的应用场景。本书不仅适合初学者作为...
曹胜欢在《JAVA程序员 从笨鸟到菜鸟.pdf》中分享了他个人学习Java的经历,从迷茫到逐渐成长的过程。他强调了自学的重要性,并鼓励初学者不要怕走弯路,同时希望自己的经验可以帮助到同样在学习Java的初学者。 2. ...
Java程序员的成长之路是一个充满挑战与探索的过程,从初学者到熟练掌握各项技能,需要系统性的学习和实践。"Java程序员由菜鸟到笨鸟学习文档"就是这样一个旨在帮助初入Java世界的学习者逐步进阶的资源。它覆盖了从...
### Java程序员从笨鸟到菜鸟 #### 一、开发环境搭建与基本语法 ##### 开发环境搭建 在开始Java的学习之前,首先需要搭建一个合适的开发环境。这通常涉及到以下步骤: 1. **JDK(Java Development Kit)安装**:...
《Java程序员-从笨鸟到菜鸟》PDF 下载资源目录:作者简介:...............................................................................................................................................2...
java程序员由菜鸟到笨鸟 一本值得java程序员看的书籍 给大家分享一下 喜欢的评个好评 谢谢
以上内容只是《Java程序员由菜鸟到笨鸟》这本书中可能涵盖的部分知识点。对于初学者来说,系统地学习这些基础知识是非常重要的,因为它们构成了Java编程的基础,也是进一步学习高级主题的基石。希望这些内容能够帮助...
根据提供的文件信息,“Java程序员由菜鸟到笨鸟”是一本旨在帮助初学者成长为合格Java开发者的书籍。本书作者为曹胜欢,发布日期为2018年3月17日。以下是从该书的标题、描述以及部分可能包含的内容中提炼出的关键...
day01_Object类、常用API day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda...Java基础小节练习题答案
4. **《java程序员由菜鸟到笨鸟》**:书名虽然幽默,但内容很可能讲述了从新手到熟练工的成长过程,包括常见错误的避免、最佳实践的掌握、编程效率的提高等。对于初入行的Java程序员,这本书可以提供宝贵的指导。 5...