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这个"大盒子"是怎么定义的吧

Java代码  

  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. }

Java代码  

  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有着异曲同工之妙。

时间: 2024-08-02 11:12:00

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

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

catalog 1. Description 2. Effected Scope 3. Exploit Analysis 4. Principle Of Vulnerability 5. Patch Fix 1. Description XWork是一个命令模式框架,用于支持Struts 2及其他应用  在Atlassian Fisheye,Crucible和其他产品中使用的Struts 2.0.0至2.1.8.1版本中的Xwork中的OGNL表达式赋值功能使用许可的白名单,远程攻击者可以借助

学习之Struts2框架实现原理----个人理解

以下是个人中学习过程中对struts2的一些理解,有不对的地方大家多多提出指正,小弟拜谢! 解析MyStruts.xml文件的过程:需要几个核心类:包括StrutsInfo类,用来装struts标签里的属性参数name.class.method,还需要一个集合用来装result标签里的属性,所以需要另一个类:ResultInfo类,同样是装result标签里的属性参数,name.type.location(是跳转的地址) 然后需要一个ActionMapper来解析该文件,内有一个解析的方法par

Struts2之Session Token机制理解及使用

一.学习案例:关于表单重复提交的问题,其实没什么可讲的,这个功能可以说很鸡肋,特别在现在的项目中很少会用,实际意义不大,之所以讲,是为了引出拦截器,给下一章学习拦截器做个铺垫,大家就当看杂文一样,随便瞟几眼就OK. 二.案例分析:token机制很类似于验证码的实现方式,当页面请求扫描到<s:token/>便签时就会调用标签处理类,而标签处理类会生成一个随机数返回给页面,另外在服务器端拷贝一份也就是防止session中,当请求到达服务器后,就会对比两个字符串,相等则通过,不相等证明是重复提交则跳

【J2EE】关于struts2自动填充参数的理解

特性: 1.请求时 请求参数自动填充Action对应的属性  2.响应时自动把Action的属性放到requestScope里 原理概述: 1.在request到达Action之前 有一层拦截器截获request 将请求参数放入ValueStack  2.根据url判断要进哪个Action的声明方法 根据请求(ValueStack)里的参数然后通过反射机制获取Action中的同名属性的get.set方法 并进行赋值  3.响应时将Action里的属性放入request域中  4.在下一次转发前值

关于Struts2的碎碎念

一:安全,还是安全 我入行比较晚,那会Spring MVC什么的都很流行了,一直觉得struts2作为一个Web MVC框架实在太笨重了点.所以虽然之前一直在用,但是其实没有真正研究过. 今天公司又遇到一个比较严重的struts的安全问题,最后检查了很久,换最新版也无效.但是因为公司一直在用strtus2,作为一个爱着自己工作的人(逃),还是决定大致了解一下struts2的源码了. 直接读代码难免一头雾水,这里推荐一本书<Struts2技术内幕>,有书上的理论作指导就容易得多.这本书讲的挺详细

Struts2漏洞利用原理及OGNL机制

Struts2漏洞利用原理及OGNL机制研究   概述 在MVC开发框架中,数据会在MVC各个模块中进行流转.而这种流转,也就会面临一些困境,就是由于数据在不同MVC层次中表现出不同的形式和状态而造成的: View层-表现为字符串展示 数据在页面上是一个扁平的.不带数据类型的字符串,无论数据结构有多复杂,数据类型有多丰富,到了展示的时候,全都一视同仁的成为字符串在页面上展现出来.数据在传递时,任何数据都都被当作字符串或字符串数组来进行. Controller层-表现为java对象 在控制层,数据

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

[转]Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式 博客分类: 企业应用面临的问题 java并发编程 Struts2的线程安全ThreadLocal模式Struts2调用流程 转载自  http://downpour.iteye.com/blog/1335991 Struts2中的设计模式 设计模式(Design pattern)是经过程序员反复实践后形成的一套代码设计经验的总结.设计模式随着编程语言的发展,也由最初的“编程惯例”逐步发展成为被反复使用

Struts2学习第一天——struts2基本流程与配置

struts2框架 什么是框架,框架有什么用? 框架 是 实现部分功能的代码 (半成品),使用框架简化企业级软件开发 ,提高开发效率. 学习框架 ,清楚的知道框架能做什么? 还有哪些工作需要自己编码实现 ? 什么是struts2框架,它有什么用? Struts 2是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架. 其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大.Struts 2以WebWork为核心 struts2=struts1+

Struts2之ValueStack笔记

1.web基础知识——redirect和dispatch的区别 “redirect”方式中,服务器做的工作是处理浏览器请求然后告诉浏览器你访问的资源在另一位置(url),然后浏览器再次发起请求访问指定的资源: “dispatch”方式中,服务器会把浏览器的请求看做一种资源(request),这份资源会在服务器中流通,不同处理程序都能对其加工处理: respone在这两种不同方式中也有这种区别: 在struts2中,我认为理解redirect和dispatch的区别很重要. 2.没有读struts