一、Struts2的处理流程:

  • 客户端产生一个HttpServletRequest的请求,该请求被提交到一系列的标准过滤器(Filter)组建链中(如ActionContextCleanUp:它主要是清理当前线程的ActionContext、Dispatcher,FilterDispatcher主要是通过ActionMapper来决定需要调用那个Action,FilterDispatcher是控制器的核心,也是MVC中控制层的核心组建)。
  • 核心控制器组建FilterDispatcher根据ActionMapper中的设置获得是否需要调用某个Action组建来处理这个HttpServletRequest请求,如果ActionMapper决定调用某个Action组建,FilterDispatcher核心控制器组建就会把请求的处理权委托给ActionProxy组建
  • ActionProxy组建通过Configuration Manager组建获得Struts2框架的配置文件struts.xml,最后找到需要调用的目标Action组建类,然后ActionProxy组建就创建出一个实现了命令模式的ActionInvocation类的对象实例类的对象实例(这个过程包括调用Anction组建本身之前调用多个的拦截器组建的before()方法 )同时ActionInvocation组建通过代理模式调用目标Action组建。但是在调用之前ActionInvocation组建会根据配置文件中的设置项目加载与目标Action组建相关的所有拦截器组建(Interceptor)。
  • 一旦Action组建执行完毕,ActionInvocation组建将根据开发人员在Struts2.xml配置文件中定义的各个配置项目获得对象的返回结果--为这个Action组建的结果码(一个像SUCCESS,INPUT)然后根据该返回的结果调用目标JSP页面以实现显示输出。
  • 最后各个拦截器组建会被再次执行(但是顺序和开始时相反,并调用after()方法),然后请求最终被返回给系统的部署文件中配置的其他过滤器,如果已经设置了ActionContextCleanUp过滤器,那么FilterDispatcher就不会清理在ThreadLocal对象中保存的ActionContext信息。如果没有设置ActionContextCleanUp过滤器,FilterDispatcher就会清除掉所有的ThreadLocal对象。

更加清晰的来说就是:

1.客户端初始化一个指向servlet容器的请求。

2.请求经过一系列的过滤器(ActionContextCleanUp、SiteMesh)

3.FilterDispatcher被调用,并询问ActionMapper来决定这个请求是否需要调用某个Action

4.ActionMapper决定要调用那一个Action,FilterDispatcher把请求交给ActionProxy。

5. ActionProxy通过Configurate Manager询问Struts配置文件,找到要调用的Action类

6. ActionProxy创建一个ActionInvocation实例

7. ActionInvocation实例使用命令模式来调用,回调Action的exeute方法

8. 一旦Action执行完毕,ActionInvocation负责根据Struts.xml的配置返回结果。

二、比较重要的类的介绍:

ActionMapper其实是HttpServletRequest和Action调用请求的一个映射,他屏蔽了Action对于Request等Java servlet类的依赖。Struts2中它的默认实现类是DefaultAtionMapper,ActionMapper很大的用处可以根据自己的需要来设计url格式,它自己也有Restful的具体实现。

ActionProxy和ActionInvocation:

Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy是由ActionInvocation持有Action实例。ActionProxy作用是如何取得Action,无论是本地还是远程。而ActionInvocation的作用是如何执行Action,拦截器的功能就是咱ActionInvocation中实现的。

ConfigurateProvider和Configuration

ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是实现XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。

Struts2请求处理示意图:

最新文章

  1. Sql Server系列:规范化及基本设计
  2. ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)
  3. 有关struts2中用到 js 总结
  4. Android开发中Bundle用法包裹数据(转)
  5. Python中的并发编程
  6. 主题:PageRank解释
  7. javaScript中将时间戳转换成日期格式
  8. 《JavaScript 闯关记》
  9. 洛谷-乘积最大-NOIP2000提高组复赛
  10. CodeForces758D
  11. 添加本地jar包到本地的Maven仓库以及在Maven仓库中搜索想要添加的jar包
  12. python学习:函数传参数
  13. C/C++语言简介之优缺点
  14. hadoop中集群节点ID不一致( java.io.IOException: Incompatible clusterIDs )
  15. Java发送邮件 —— SpringBoot集成Java Mail
  16. 深入浅出理解 COOKIE MAPPING
  17. java里面获取map的key和value的方法
  18. python的N个小功能(图片预处理:打开图片,滤波器,增强,灰度图转换,去噪,二值化,切割,保存)
  19. 关于布尔值bool值
  20. android--简单的电话拨号功能

热门文章

  1. Xcode dSYM 文件
  2. c2java select algorithm
  3. cassandra java 兼容性问题及其解决方法
  4. 使用C#WebClient类访问(上传/下载/删除/列出文件目录)
  5. 【转载并记录】SpringBoot 入门(一)
  6. 增加一条新记录,同时返回其自增id
  7. apiDoc自动生成api文档
  8. 微信小程序JS导出和导入
  9. 2.3 Apache Axis2 快速学习手册之 ADB 构建Web Service
  10. GMap.net控件学习记录