今天早上一朋友向我咨询Struts2的Xwork2部分之OgnlValueStack的set与setValue的区别。
struts2版本:struts2.3.4.1
1、set(key, value)的实现
public void set(String key, Object o) { //set basically is backed by a Map pushed on the stack with a key being put on the map and the Object being the value Map setMap = retrieveSetMap(); setMap.put(key, o); } private Map retrieveSetMap() { Map setMap; Object topObj = peek(); if (shouldUseOldMap(topObj)) { setMap = (Map) topObj; } else { setMap = new HashMap(); setMap.put(MAP_IDENTIFIER_KEY, ""); push(setMap); } return setMap; }
set()的实现其实是构造一个Map(里边有一个特殊的key,MAP_IDENTIFIER_KEY),然后把key-value放入此map。通过如下代码可看出:
ActionContext ctx = ActionContext.getContext(); ValueStack vs = ctx.getValueStack(); vs.peek();
2、setValue(String expr, Object value)的实现其实最终委托给如下:
private void trySetValue(String expr, Object value, boolean throwExceptionOnFailure, Map<String, Object> context, boolean evalExpression) throws OgnlException { context.put(XWorkConverter.CONVERSION_PROPERTY_FULLNAME, expr); context.put(REPORT_ERRORS_ON_NO_PROP, (throwExceptionOnFailure) ? Boolean.TRUE : Boolean.FALSE); ognlUtil.setValue(expr, context, root, value, evalExpression); }
javadoc:
/** * Attempts to set a property on a bean in the stack with the given expression using the default search order. * * @param expr the expression defining the path to the property to be set. * @param value the value to be set into the named property */
即从栈的顶部往下找,找到第一个匹配的赋值然后结束,不同于set()。
总结:
set(key, value):首先查找栈顶的一个特殊Map(里边有一个特殊的key,MAP_IDENTIFIER_KEY),如果找不到就创建一个,然后把对应的key-value放入。
setValue(String expr, Object value):从栈的顶部往下找,找到第一个匹配ognl表达式的赋值然后结束。
思考:
如下代码中我们往栈中添加了多少个对象?(不包括默认的添加的)
ActionContext ctx = ActionContext.getContext(); ValueStack vs = ctx.getValueStack(); UserModel user = new UserModel(); user.setUuid(123); vs.set("uuid", 456); vs.push(user); vs.set("uuid", 567);
答案:3个。
1、vs.set("uuid", 456); 第一个肯定往栈中压个Map
2、vs.push(user); 第二个 往栈中压user
3、vs.set("uuid", 567); 第三个 因为栈顶是user,所以再压一个
如何鉴定:可以通过vs.findValue("[0]")获取栈中数据,具体去参考struts2的官方文档。
ognl表达式中的:
[0]表示截取栈中从0位置开始的子集合; 假设栈中的数据是[a,b] 则结果就是[a,b]
[1]表示截取栈中从1位置开始的子集合; 假设栈中的数据是[a,b] 则结果就是[b]
以此类推。
[1].top表示截取栈中从1位置开始的子集合 并返回顶部对象(集合中的栈顶对象),即第一个。
此时大家可以在如jsp页面中使用:
s:debug 或者如下代码校验
<s:property value="[0].top.uuid"/>
<s:property value="[1].top.uuid"/>
<s:property value="[2].top.uuid"/>
相关推荐
Struts2.2.3与Xwork是两个在Java Web开发中至关重要的框架,它们主要用于构建企业级的应用程序。Struts2是基于Model-View-Controller(MVC)设计模式的开源框架,而Xwork是它的一个核心组件,负责处理Action和业务...
在深入理解Struts2与XWork的关系之前,我们首先需要了解MVC模式的基本概念。 MVC模式是一种软件设计模式,它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。模型负责管理数据和...
Struts2和XWork2是两个非常重要的Java Web框架,它们在开发企业级应用程序时扮演着核心角色。Struts2是基于MVC(Model-View-Controller)设计模式的开源框架,而XWork2则是其底层的核心工作引擎,负责处理Action、...
Struts-xwork-core是Struts2框架的核心组件,它提供了Action和结果的执行模型,以及类型转换、数据验证和国际化等功能。在这个压缩包中,包含了该核心库的源代码,对于学习和理解Struts2的工作原理及其内部机制极具...
Struts2和XWork2是两个非常重要的Java Web框架,它们在开发企业级应用程序时起着核心作用。Struts2是基于MVC(Model-View-Controller)设计模式的开源框架,而XWork2则是其底层工作框架,负责处理Action和业务逻辑。...
最全的struts2.3和xwork2.chm中文帮助文档
在这个“struts2 xwork源文件”压缩包中,包含了XWork框架的源代码,这对于开发者深入理解Struts2的工作原理和扩展功能非常有帮助。 在Eclipse这样的集成开发环境中导入XWork的源代码,可以使开发者在调试和查看类...
struts2 xwork-core 类图 chm
XWork是Struts2的核心组件,负责处理请求、动作调度、数据绑定以及异常处理等核心功能。本文将深入探讨XWork的源码,解析其设计理念和关键实现,帮助开发者更好地理解和使用Struts2。 1. **ActionInvocation**:...
7. **OgnlValueStack**:Struts2使用OGNL(Object-Graph Navigation Language)作为默认的表达式语言,OgnlValueStack是ValueStack的实现,提供OGNL表达式的解析和操作。 8. **ResultTypes**:Struts2支持多种...
struts-2.3.16.1-all API xwork-core core
1. **ActionInvocation**:这是Struts2框架的核心类之一,代表了一个动作的执行过程。它管理着动作调用的栈,并且支持AOP(面向切面编程)的拦截器链,使得在执行动作前后可以插入自定义逻辑。 2. **ActionContext*...
根据提供的文件信息,我们可以深入探讨Struts2与XWork2的相关知识点,特别是关于它们的下载、功能特性以及在实际项目中的应用。 ### Struts2框架简介 Apache Struts2是基于MVC(Model-View-Controller)设计模式的...
- XWork的`OgnlValueStack`是表达式语言OGNL(Object-Graph Navigation Language)在Struts2中的实现,用于在Action和视图之间传递数据。 - 类型转换是XWork的一个重要特性,它可以自动将请求参数转换为Action字段...
Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档
XWork是Struts2的核心组件之一,它负责处理动作调度、异常处理、类型转换以及数据绑定等功能。这个压缩包“xwork.rar”包含了XWork的源代码,对于理解Struts2的工作原理和进行二次开发是非常有价值的资源。 XWork...
Xwork作为Struts2的核心组件之一,它的设计理念和技术实现对整个Struts2框架起着决定性的作用。Struts2是一个流行的Java Web开发框架,它采用了MVC(Model-View-Controller)架构模式来帮助开发者构建易于维护和扩展的...
5. **国际化(Internationalization, I18N)与本地化(Localization, L10N)**: Struts2支持多语言环境,文档会解释如何实现I18N和L10N。 6. **异常处理**: Struts2提供了一套优雅的异常处理机制,包括全局异常映射...
在深入理解Struts2与XWork的关系之前,我们首先需要了解这两个概念的基础知识。 Struts2框架是在原有的Struts1的基础上进行改进和升级的,它克服了Struts1的一些局限性,提供了更灵活的配置和更强的类型安全。...
XWork是Struts2的核心组件,负责处理Action的业务逻辑和控制流程。深入理解XWork的源码有助于开发者更好地掌握Struts2的工作原理,提高开发效率和解决实际问题的能力。 在Struts2中,XWork扮演着以下几个关键角色:...