对象的生命周期的管理是面向对象编程亘古不变的话题,从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这个"大盒子"是怎么定义的吧
public interface Container extends Serializable { /** * Default dependency name. */ String DEFAULT_NAME = "default"; /** * Injects dependencies into the fields and methods of an existing object. */ void inject(Object o); /** * Creates and injects a new instance of type {@code implementation}. */ <T> T inject(Class<T> implementation); /** * Gets an instance of the given dependency which was declared in * {@link com.opensymphony.xwork2.inject.ContainerBuilder}. */ <T> T getInstance(Class<T> type, String name); /** * Convenience method. Equivalent to {@code getInstance(type, * DEFAULT_NAME)}. */ <T> T getInstance(Class<T> type); /** * Gets a set of all registered names for the given type * @param type The instance type * @return A set of registered names or empty set if no instances are registered for that type */ Set<String> getInstanceNames(Class<?> type); /** * Sets the scope strategy for the current thread. */ void setScopeStrategy(Scope.Strategy scopeStrategy); /** * Removes the scope strategy for the current thread. */ void removeScopeStrategy(); }
String DEFAULT_NAME = "default";//默认的对象获取标识 void inject(Object o);//进行对象依赖注入的基本操作接口,作为参数的Object将被XWork Container进行处理,Object内部声明有@Inject的字段和方法,都将被注入受到“盒子”托管的对象,从而建立起依赖关系 <T> T inject(Class<T> implementation);//创建一个类的实例并进行对象依赖注入 <T> T getInstance(Class<T> type, String name);//根据type和name作为唯一标识获取声明在com.opensymphony.xwork2.inject.ContainerBuilder的对象实例 <T> T getInstance(Class<T> type);//根据type和默认的DEFAULT_NAME 作为唯一标识获取“盒子”里的java类实例 Set<String> getInstanceNames(Class<?> type);//通过type获取这个type对应“盒子”中注册过的name void setScopeStrategy(Scope.Strategy scopeStrategy);//设置当前线程的作用范围的策略 void removeScopeStrategy();//删除当前线程的作用范围的策略
个人觉得这个Container于Spring中的BeanFactory有着异曲同工之妙。
相关推荐
而XWork是Struts2的核心组件,它负责处理Action的业务逻辑和控制流程。在深入理解Struts2与XWork的关系之前,我们首先需要了解MVC模式的基本概念。 MVC模式是一种软件设计模式,它将应用程序分为三个主要部分:模型...
Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档
XWork是Struts2的核心组件,负责处理请求、动作调度、数据绑定以及异常处理等核心功能。本文将深入探讨XWork的源码,解析其设计理念和关键实现,帮助开发者更好地理解和使用Struts2。 1. **ActionInvocation**:...
根据提供的文件信息,我们可以深入探讨Struts2与XWork2的相关知识点,特别是关于它们的下载、功能特性以及在实际项目中的应用。 ### Struts2框架简介 Apache Struts2是基于MVC(Model-View-Controller)设计模式的...
Struts2是基于Model-View-Controller(MVC)设计模式的开源框架,而Xwork是它的一个核心组件,负责处理Action和业务逻辑。 **Struts2** 是一个强大的MVC框架,它的出现是为了改进原先的Struts1框架,提供了更灵活、...
XWork是Struts2的核心,它提供了一系列的工具和功能,使得开发者能够更高效地处理请求、控制业务流程以及管理应用状态。2.3.16是Struts2的一个稳定版本,包含了许多修复和改进。 XWork Doc文档集是关于Struts2 ...
Struts2和XWork2是两个非常重要的Java Web框架,它们在开发企业级应用程序时扮演着核心角色。Struts2是基于MVC(Model-View-Controller)设计模式的开源框架,而XWork2则是其底层的核心工作引擎,负责处理Action、...
XWork是Struts2的核心组件,负责处理Action的执行,而OGNL(Object-Graph Navigation Language)则是Struts2中的表达式语言,用于数据绑定和访问对象属性。这个压缩包包含了这三个关键组件的源代码,对于开发者来说,...
Struts2和XWork2是两个非常重要的Java Web框架,它们在开发企业级应用程序时起着核心作用。Struts2是基于MVC(Model-View-Controller)设计模式的开源框架,而XWork2则是其底层工作框架,负责处理Action和业务逻辑。...
Struts-xwork-core是Struts2框架的核心组件,它提供了Action和结果的执行模型,以及类型转换、数据验证和国际化等功能。在这个压缩包中,包含了该核心库的源代码,对于学习和理解Struts2的工作原理及其内部机制极具...
通过`com.opensymphony.xwork2.DefaultActionInvocation`类,XWork会根据配置文件中的定义执行Action的相应方法。 2. **类型转换**:XWork提供了强大的类型转换机制,允许用户在表单提交的数据和Action字段之间进行...
最全的struts2.3和xwork2.chm中文帮助文档
struts2+xwork的源代码调试项目,包含简单的demo项目。次项目可直接导入eclispe、部署在服务器上要加入servlet-api.jar包的支持,此项目为研究源代码者提供,这也是个人好长时间自己探索出来的,希望大家努力。...
包含Struts2和Xwork的核心API,字体适中,方便阅读,chm格式,方便查询
XWork是Struts2的核心组件,负责动作处理和业务逻辑的执行。XWork2.3.4_API和Struts2 Core2.3.4_API这两个CHM文件分别包含了这两个关键组件的API文档。 Struts2 Core2.3.4_API.chm文档将详细阐述Struts2的核心组件...
- XWork的核心类`ActionSupport`是所有Struts2 Action的基类,包含了默认的错误处理和验证机制。 - XWork的`OgnlValueStack`是表达式语言OGNL(Object-Graph Navigation Language)在Struts2中的实现,用于在...
1. **Action**:在Struts2中,Action是业务逻辑的载体,它实现了`com.opensymphony.xwork2.Action`接口。当你在Struts2配置文件中定义一个Action时,实际上是在定义一个请求处理类。 2. **ActionContext**:...
1. **Action**: Action是处理用户请求的实体,它实现了`com.opensymphony.xwork2.Action`接口。在Struts2中,Action是业务逻辑的载体,负责处理用户的请求并返回结果。 2. **ActionContext**: ActionContext封装了...
XWork是Struts2的核心组件,负责处理动作和业务逻辑,而OGNL(Object-Graph Navigation Language)则是Struts2中的表达式语言,用于在模型、视图和控制器之间传递数据。这个压缩包提供了这三部分的Java文档(Javadoc...