1. Struts2架构图




 当外部的httpservletrequest到来时 ,初始到了servlet容器(所以虽然Servlet和Action是解耦合的,但是Action依旧能够通过httpservletrequest取得请求参数),
然后通过Filter
chain,Filter主要包括ActionContextCleanUp,它主要清理当前线程的ActionContext和
Dispatcher;FilterDispatcher主要通过AcionMapper来决定需要调用哪个Action。
       
ActionMapper取得了ActionMapping后,在Dispatcher的serviceAction方法里创建
ActionProxy,ActionProxy创建ActionInvocation,然后ActionInvocation调用
Interceptors,执行Action本身,创建Result并返回,当然,如果要在返回之前做些什么,可以实现
PreResultListener。

2. Struts2部分类介绍
这部分从Struts2参考文档中翻译就可以了。
ActionMapper
       
ActionMapper其实是HttpServletRequest和Action调用请求的一个映射,它屏蔽了Action对于Request等
java
Servlet类的依赖。Struts2中它的默认实现类是DefaultActionMapper,ActionMapper很大的用处可以根据自己的
需要来设计url格式,它自己也有Restful的实现,具体可以参考文档的docs\actionmapper.html。
ActionProxy&ActionInvocation
       
Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy是
由ActionInvocation持有Action实例。ActionProxy作用是如何取得Action,无论是本地还是远程。而
ActionInvocation的作用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的。
ConfigurationProvider&Configuration
       
ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是尤其实现类
XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。

3. Struts2请求流程
1、客户端发送请求
2、请求先通过ActionContextCleanUp-->FilterDispatcher
3、FilterDispatcher通过ActionMapper来决定这个Request需要调用哪个Action
4、如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,这儿已经转到它的Delegate--Dispatcher来执行

5、ActionProxy根据ActionMapping和ConfigurationManager找到需要调用的Action类

6、ActionProxy创建一个ActionInvocation的实例(同时会迅速创建ActionContext、Action实例(其中Action通过无参的构造函数实例化)和ValueStack(该值栈位于ActionContext实例中,并且是空的))

7、ActionInvocation调用真正的Action,当然这涉及到相关拦截器的调用(经过类型转换拦截器将请求参数转换类型,经过参数拦截器调用action的实例的set**方法为属性赋值,经过校验拦截器如果验证通过将Action实例保存在ValueStack中,这样在使用OGnl时就可以从值栈送取值了)

8、Action执行完毕,ActionInvocation创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。添加PreResultListener可以在Interceptor中实现。

Struts2源码阅读(二)_ActionContext及CleanUP Filter :
http://qidaoxp.iteye.com/blog/492387
Struts2源码阅读(三)_Dispatcher&ConfigurationProvider

http://qidaoxp.iteye.com/blog/494444
Struts2源码阅读(四)_Dispatcher&ConfigurationProvider续

http://qidaoxp.iteye.com/blog/497052
Struts2源码阅读(五)_FilterDispatcher核心控制器 :

http://qidaoxp.iteye.com/blog/501088
 Struts2源码阅读(六)_ActionProxy&ActionInvocation

http://qidaoxp.iteye.com/blog/503015

最新文章

  1. CSS3 Animation 帧动画 steps()
  2. display_inline-block_table-cell
  3. Windows Azure初体验
  4. mongodb(Index)
  5. websocket和swoole
  6. 苹果Mac隐藏壁纸在哪里?Mac隐藏壁纸查找教程
  7. Swift:函数和闭包
  8. google calendar
  9. hdu4597 Play Game DP
  10. Eclipse背景颜色改动
  11. django请求和响应
  12. 【洛谷P2709】小B的询问
  13. dispatchEvent(AWTEvent) 分派事件
  14. 编译安装和apt安装Nginx1.14.0
  15. Hadoop生态圈-Oozie实战之调度shell脚本
  16. Navicat Premium 12.0.18安装与激活(转)
  17. Google搜索引擎
  18. linux系统基本排查
  19. Hibernate JavaBean.hbm.xml配置
  20. BZOJ4899 记忆的轮廓(概率期望+动态规划+决策单调性)

热门文章

  1. [Android Pro] Android7.0系统 关于Android获取流量计数TrafficStats.getUidRxBytes(uid)和TrafficStats.getUidTxBytes(uid)返回-1解决方案
  2. Labeled Faces in the Wild 人脸识别数据集 部分训练数据
  3. 一致性hash在分布式系统中的应用
  4. dynamic bone unity github
  5. ItermCF的MR并行实现
  6. 【转】word排版宏的使用
  7. Python 面向对象编程基础
  8. KineticJS教程(8)
  9. tarjan+缩点+强连通定理
  10. jsp简单实现统计在线人数