对象的生命周期的管理是面向对象编程亘古不变的话题,从syntax的角度,面向对象的高级编程语言都是以“对象”为核心,而对象之间的继承关系、嵌套引用关系构成的对象树结构为我们进行对象级别的逻辑操作提供了足够的语法支持。而对象之间的这种复杂的关系也为对象生命周期的管理带了难题:

  • 1.运行期,对象实例的创建和引用机制
  • 2.对象及其关联对象之间的依赖处理机制。

为了解决这个难题,业界在程序逻辑中引进了一个额外的编程元素(Container),

(由一系列操作对象的接口构成其中至少包括获取对象实例和管理对象之间依赖关系的操作方法。)

首先让我们先看看Struts的这个Container的构造吧。

从框架的角度其实Struts2实际运行有2条主线和2个执行阶段。

Struts2的所有内容都无法逃脱这些概念存在。他们构成了Struts2的基本元素和运行机理。

第一条主线:Struts2的初始化:调用servlet之init方法执行。

该主线特点:

1.仅在web应用启动时执行一次

2.init方法执行失败将导致整个应用启动失败。这也是源于Filter这个servlet规范的基本运行特性。

Struts2这条初始化主线主要干的活:框架元素的初始化,包括框架内部许多内置对象的创建和缓存。

对框架的运行的必要条件进行控制(根据“开闭原则”框架的扩展开放保证了我们可以在应用层面对框架的运行参数以及执行模式进行定制,所以在这条主线中struts2也对这种定制化的正确性提供了运行时校验,如果失败,则web应用的启动也会失败。)

这条主线的顺利执行将会为之后的Http请求提供“舒适的”执行环境,注意这里的运行环境并不是Struts2的运行环境,这里的环境是建立在web Container之上,框架运行必须的内置对象的集合。本次初始化也是对这个建立在web container之上的Container的初始化。

初始化涉及class如下:


     第二条主线:Struts2的http请求处理主线,包括对http请求的处理、对必要数据的处理和返回数据的处理全过程。

即:从满足StrutsPrepareAndExecuteFilter过滤url开始到dofilter方法执行。

本主线分两个执行阶段:

1.Http请求预处理 这也是程序的控制权真正在Strust2手上的时候。程序在这个阶段是依赖web Container的。

本阶段主要将分析http请求中以字符串形式的“弱类型”数据转换成以对象为载体的“强类型”数据,以及为运行环境做准备。

2.XWork终于粉墨登场啦 O(∩_∩)O~ XWork执行业务逻辑

这个阶段程序的控制权落入XWork之手。XWork依托于第一阶段封装的对象形式的数据,处理业务逻辑。

这个阶段程序完全跟web Container没啥关系了  这也是Struts2所说的之所以它不是不依赖于web Container的MVC框架的原因。

这也体现了Struts2的核心设计理念:消除了核心程序对于运行环境(Web Container)的依赖,也是Struts2解耦的过程。

1.代码角度的解耦:第一执行阶段的代码整合到struts2-core-2.3.16.1.jar第二执行阶段的代码整合到xwork-core-2.3.16.1.jar

2.逻辑角度的解耦:将处理数据的逻辑和处理业务的逻辑分成俩个不同的执行阶段处理。(但是现在红极一时的SpringMVC却又回归了  重新拥入了Web Container的大怀抱啦 (⊙o⊙)…)

第二阶段设计类如下:

了解了Struts2的大体流程,接下来我们再具体看一下XWork到底是怎么工作的。

首先,先让我们来看看XWork Container这个"大盒子"是怎么定义的吧

  1. public interface Container extends Serializable {
  2. /**
  3. * Default dependency name.
  4. */
  5. String DEFAULT_NAME = "default";
  6. /**
  7. * Injects dependencies into the fields and methods of an existing object.
  8. */
  9. void inject(Object o);
  10. /**
  11. * Creates and injects a new instance of type {@code implementation}.
  12. */
  13. <T> T inject(Class<T> implementation);
  14. /**
  15. * Gets an instance of the given dependency which was declared in
  16. * {@link com.opensymphony.xwork2.inject.ContainerBuilder}.
  17. */
  18. <T> T getInstance(Class<T> type, String name);
  19. /**
  20. * Convenience method.&nbsp;Equivalent to {@code getInstance(type,
  21. * DEFAULT_NAME)}.
  22. */
  23. <T> T getInstance(Class<T> type);
  24. /**
  25. * Gets a set of all registered names for the given type
  26. * @param type The instance type
  27. * @return A set of registered names or empty set if no instances are registered for that type
  28. */
  29. Set<String> getInstanceNames(Class<?> type);
  30. /**
  31. * Sets the scope strategy for the current thread.
  32. */
  33. void setScopeStrategy(Scope.Strategy scopeStrategy);
  34. /**
  35. * Removes the scope strategy for the current thread.
  36. */
  37. void removeScopeStrategy();
  38. }
  1. String DEFAULT_NAME = "default";//默认的对象获取标识
  2. void inject(Object o);//进行对象依赖注入的基本操作接口,作为参数的Object将被XWork Container进行处理,Object内部声明有@Inject的字段和方法,都将被注入受到“盒子”托管的对象,从而建立起依赖关系
  3. <T> T inject(Class<T> implementation);//创建一个类的实例并进行对象依赖注入
  4. <T> T getInstance(Class<T> type, String name);//根据type和name作为唯一标识获取声明在com.opensymphony.xwork2.inject.ContainerBuilder的对象实例
  5. <T> T getInstance(Class<T> type);//根据type和默认的DEFAULT_NAME 作为唯一标识获取“盒子”里的java类实例
  6. Set<String> getInstanceNames(Class<?> type);//通过type获取这个type对应“盒子”中注册过的name
  7. void setScopeStrategy(Scope.Strategy scopeStrategy);//设置当前线程的作用范围的策略
  8. void removeScopeStrategy();//删除当前线程的作用范围的策略

个人觉得这个Container于Spring中的BeanFactory有着异曲同工之妙。

Struts2 之 对xwork的理解的更多相关文章

  1. struts2 CVE-2010-1870 S2-005 XWork ParameterInterceptors bypass allows remote command execution

    catalog . Description . Effected Scope . Exploit Analysis . Principle Of Vulnerability . Patch Fix 1 ...

  2. 请说说你对Struts2的拦截器的理解?

    Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 拦截器栈(Interceptor Stac ...

  3. 请说说你对Struts2的拦截器的理解?

    Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 拦截器栈(Interceptor Stac ...

  4. 关于Struts2的碎碎念

    一:安全,还是安全 我入行比较晚,那会Spring MVC什么的都很流行了,一直觉得struts2作为一个Web MVC框架实在太笨重了点.所以虽然之前一直在用,但是其实没有真正研究过. 今天公司又遇 ...

  5. Struts2漏洞利用原理及OGNL机制

    Struts2漏洞利用原理及OGNL机制研究   概述 在MVC开发框架中,数据会在MVC各个模块中进行流转.而这种流转,也就会面临一些困境,就是由于数据在不同MVC层次中表现出不同的形式和状态而造成 ...

  6. Struts2中的设计模式----ThreadLocal模式

    http://www.cnblogs.com/gw811/archive/2012/09/07/2675105.html 设计模式(Design pattern):是经过程序员反复实践后形成的一套代码 ...

  7. 【转】Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式

    [转]Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式 博客分类: 企业应用面临的问题 java并发编程 Struts2的线程安全ThreadLocal模式St ...

  8. Struts2的经典入门

    一:Struts2的起源与背景 在了解Struts2之前我们先来聊聊Struts1,我们都知道在很长的一段时间内,所有的MVC框架中,Struts1他是处于一个超级大咖的地位,无论是从市场角度和使用的 ...

  9. struts2中的jar包

    核心包: (后面数字是版本号,不同struts2版本,数字可能不一样.) struts2-core-2.1.8.1 struts2的核心jar包,不可缺少的 xwork-core-2.1.6 xwor ...

随机推荐

  1. SQLserver日期函数

      ------------------日期转化成年月日时分秒毫秒--------------- select 'R'+CONVERT(varchar(100), GETDATE(), 112)+ri ...

  2. Spring3.0 与 MyBatis框架 整合小实例

    本文将在Eclipse开发环境下,采用Spring MVC + Spring + MyBatis + Maven + Log4J 框架搭建一个Java web 项目. 1. 环境准备: 1.1 创建数 ...

  3. 安装生物信息学软件-HUMAnN2

    先挖坑 因为这个软件需要memory>16G,所以应该要安装在服务器上

  4. 【转】C#多线程

    C#中的多线程编程 C#是.Net平台的通用开发工具,它能够建造所有的.Net应用.在.Net中所有线程都运行在应用程序域(AppDomain)中,这也许让你想到Win32进程,实际上它们还是有很大的 ...

  5. Bool 类型变量的使用

    定义一个bool类型的变量,默认为FALSE的 private bool BHaveBeenTip=false; private void label5_Click(object sender, Ev ...

  6. go语言的 数组、slice、map使用(转)

    golang群 点击加入 go语言的 数组.slice.map使用, 由于网上有很好的说明, 不需要再写了,请看这几篇: Go语言中的 Array, Slice和 Map 深入学习golang五篇,以 ...

  7. java文件编译及运行

    1 配置环境变量 使用鼠标右击“我的电脑”->属性->高级->环境变量 系统变量->新建->变量名:JAVA_HOME 变量值:C:\Program Files (x86 ...

  8. PHP使用字符串名称调用类的方法

    <?php class Game { function Play($id) { echo "Playing game $id\n"; } } $game = new Game ...

  9. (原创)VM中的CentOS6.4中安装CloudStack6.3②

    接着VM中的CentOS6.4中安装CloudStack6.3①中文章接着,往下面安装 4.更新 yum 仓库 默认情况下,CentOS的软件源中没有收录最新版本CloudStack,为了能顺利安装, ...

  10. stm32通用定时器步骤