Struts2 之 对xwork的理解
对象的生命周期的管理是面向对象编程亘古不变的话题,从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有着异曲同工之妙。
Struts2 之 对xwork的理解的更多相关文章
- 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 ...
- 请说说你对Struts2的拦截器的理解?
Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 拦截器栈(Interceptor Stac ...
- 请说说你对Struts2的拦截器的理解?
Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 拦截器栈(Interceptor Stac ...
- 关于Struts2的碎碎念
一:安全,还是安全 我入行比较晚,那会Spring MVC什么的都很流行了,一直觉得struts2作为一个Web MVC框架实在太笨重了点.所以虽然之前一直在用,但是其实没有真正研究过. 今天公司又遇 ...
- Struts2漏洞利用原理及OGNL机制
Struts2漏洞利用原理及OGNL机制研究 概述 在MVC开发框架中,数据会在MVC各个模块中进行流转.而这种流转,也就会面临一些困境,就是由于数据在不同MVC层次中表现出不同的形式和状态而造成 ...
- Struts2中的设计模式----ThreadLocal模式
http://www.cnblogs.com/gw811/archive/2012/09/07/2675105.html 设计模式(Design pattern):是经过程序员反复实践后形成的一套代码 ...
- 【转】Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式
[转]Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式 博客分类: 企业应用面临的问题 java并发编程 Struts2的线程安全ThreadLocal模式St ...
- Struts2的经典入门
一:Struts2的起源与背景 在了解Struts2之前我们先来聊聊Struts1,我们都知道在很长的一段时间内,所有的MVC框架中,Struts1他是处于一个超级大咖的地位,无论是从市场角度和使用的 ...
- struts2中的jar包
核心包: (后面数字是版本号,不同struts2版本,数字可能不一样.) struts2-core-2.1.8.1 struts2的核心jar包,不可缺少的 xwork-core-2.1.6 xwor ...
随机推荐
- mysql 获取当前日期及格式化 (转)
MYSQL 获取当前日期及日期格式获取系统日期: NOW()格式化日期: DATE_FORMAT(date, format)注: date:时间字段format:日期格式 返回系统日期,输出 2009 ...
- 【转】 数据库系统——B+树索引
原文来自于:http://blog.csdn.net/cjfeii/article/details/10858721 1. B+树索引概述 在上一篇文章中,我们讨论了关于index的几个中重要的课题: ...
- C#方法参数传递机制
1:value(值传递).ref(引用传递).out(输出传递) ref和out使用效果上面是等效的,它们的区别在于:参数标记为ref,那么必须在调用函数之前初始化参数的值:参数标记为out,调用函数 ...
- linux装JDK
一.安装sun java升 级到ubuntu 11.10之后.ubuntu 默认自带的是openjdkjava.默认情况这个是能够使用的,但是如果你想搭建专业的开发环境,还是需要使用sun的靠谱.另外 ...
- canvas转盘抽奖
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" ...
- 探索软件工程道路上的我II (Θ∀Θ#)
------作业要求------ 第一版本程序Prog1:+ 给定一个数组,实现数组元素求和:具体要求:实现对一维数组(a[100])的所有元素相加运算.+ 数据准备:a)数组长度:100:b)数组数 ...
- github上下载的文件如何在本地运行
最近想学习自己写插件,所以先下载大神写的插件膜拜下,下载下来以后,直接双击运行报错,大神怎么会犯这么低级的错误咧!所以在网上查资料,找到了解决方法. (1)上传到github上面的插件都很规范,文件根 ...
- codeforces 341d (树状数组)
problem Iahub and Xors 题目大意 一个n*n的矩阵,要求支持两种操作. 操作1:将一个子矩阵的所有值异或某个数. 操作2:询问某个子矩阵的所以值的异或和. 解题分析 由于异或的特 ...
- [.NET] CErrStack 方便地管理错误或异常
Option Explicit On Option Strict On Imports System.Reflection Imports System.Diagnostics Public Stru ...
- IOS设备 UIDevice 获取操作系统 版本 电量 临近手机触发消息检测 (真机亲测可用)
- (void)viewDidLoad { [super viewDidLoad]; // 操作系统 NSString * osName =[[UIDevice currentDevice]syste ...