`
jinnianshilongnian
  • 浏览: 21499494 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2417782
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3008092
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5638961
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:259809
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597052
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250120
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5858161
Group-logo
跟我学Nginx+Lua开...
浏览量:701791
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:784902
社区版块
存档分类
最新评论

Struts2的Xwork2部分之OgnlValueStack的set与setValue的区别

阅读更多

今天早上一朋友向我咨询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"/>

 

6
6
分享到:
评论
11 楼 jinnianshilongnian 2013-05-18  
<s:property value=" '<font>123</font>' " default="120" escapeHtml="true"/><br/>
<s:property value=' "<font>123</font>" ' default="120" escapeHtml="true"/><br/>

结果都是正确的,之上我说过''在ognl里定义的是字符,其实不是完全正确


以下ognl.jjt文件中定义的部分语法:

如果长度为1  就是字符  否则就是字符串
/**
* Character and string literals, whose object value is stored in the token manager's
* "literalValue" field.
*/
MORE:
{
    "`"     : WithinBackCharLiteral
|
    "'"     { stringBuffer = new StringBuffer(); }: WithinCharLiteral
|
    "\""    { stringBuffer = new StringBuffer(); }: WithinStringLiteral
}

<WithinCharLiteral> MORE:
{
    < ESC: "\\" ( ["n","r","t","b","f","\\","'","`","\""]
                | (["0"-"3"])? ["0"-"7"] (["0"-"7"])?
                )
    >
        { charValue = escapeChar(); stringBuffer.append(charValue); }
|
    < (~["'","\\"]) >
        { charValue = image.charAt( image.length()-1 ); stringBuffer.append(charValue); }
}

<WithinCharLiteral> TOKEN:
{
    < CHAR_LITERAL: "'">
        {
           if (stringBuffer.length() == 1) {
                literalValue = new Character( charValue );
            } else {
                literalValue = new String( stringBuffer );
            }

        }
        : DEFAULT
}
10 楼 jinnianshilongnian 2013-05-18  
满手都是炸 写道
谢谢  非常感谢 

没事,你起的也够早,是在国内吗
9 楼 满手都是炸 2013-05-18  
谢谢  非常感谢 
8 楼 jinnianshilongnian 2013-05-18  
满手都是炸 写道
ognl表达式中的:
[0]表示截取栈中从0位置开始的子集合; 假设栈中的数据是[a,b] 则结果就是[a,b]
[1]表示截取栈中从1位置开始的子集合; 假设栈中的数据是[a,b] 则结果就是[b]
以此类推。


[1].top表示截取栈中从1位置开始的子集合 并返回顶部对象(集合中的栈顶对象),即第一个。


这一段怎么理解呢  能说的再详细点么 谢谢

strut2的官方文档上都有 建议看下
7 楼 jinnianshilongnian 2013-05-18  
满手都是炸 写道
ognl表达式中的:
[0]表示截取栈中从0位置开始的子集合; 假设栈中的数据是[a,b] 则结果就是[a,b]
[1]表示截取栈中从1位置开始的子集合; 假设栈中的数据是[a,b] 则结果就是[b]
以此类推。


[1].top表示截取栈中从1位置开始的子集合 并返回顶部对象(集合中的栈顶对象),即第一个。


这一段怎么理解呢  能说的再详细点么 谢谢


比如栈中的数据是
a
b
c
d

你使用<s:property value="[0]"/> 可以得到一个集合[a,b,c,d] 如果你需要栈顶数据 则可以使用<s:property value="[0].top"/>获取

如果<s:property value="[1]"/> 那么得到自己和[b,c,d] <s:property value="[1].top"/>得到b

意思就是可以使用[N] 得到栈的子集合,[N].top得到子集合的顶部数据
6 楼 满手都是炸 2013-05-18  
ognl表达式中的:
[0]表示截取栈中从0位置开始的子集合; 假设栈中的数据是[a,b] 则结果就是[a,b]
[1]表示截取栈中从1位置开始的子集合; 假设栈中的数据是[a,b] 则结果就是[b]
以此类推。


[1].top表示截取栈中从1位置开始的子集合 并返回顶部对象(集合中的栈顶对象),即第一个。


这一段怎么理解呢  能说的再详细点么 谢谢
5 楼 jinnianshilongnian 2013-05-17  
满手都是炸 写道
不论是哪一种,我们要是System.out.println(vs.findString("uuid"));  得到的都是最后一次放进去的那个值 

你把你的测试用例贴下 我测试下
4 楼 jinnianshilongnian 2013-05-17  
满手都是炸 写道
不论是哪一种,我们要是System.out.println(vs.findString("uuid"));  得到的都是最后一次放进去的那个值 

现在就是这种情况啊


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);

System.out.println(vs.findString("uuid"));  就是567啊
3 楼 满手都是炸 2013-05-17  
不论是哪一种,我们要是System.out.println(vs.findString("uuid"));  得到的都是最后一次放进去的那个值 
2 楼 jinnianshilongnian 2013-05-17  
qunianshilongnian 写道
        阅


1 楼 qunianshilongnian 2013-05-17  
        阅

相关推荐

    Struts2.2.3 Xwork帮助文档

    Struts2.2.3与Xwork是两个在Java Web开发中至关重要的框架,它们主要用于构建企业级的应用程序。Struts2是基于Model-View-Controller(MVC)设计模式的开源框架,而Xwork是它的一个核心组件,负责处理Action和业务...

    struts2之xwork

    在深入理解Struts2与XWork的关系之前,我们首先需要了解MVC模式的基本概念。 MVC模式是一种软件设计模式,它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。模型负责管理数据和...

    struts2xwork2帮助文档

    Struts2和XWork2是两个非常重要的Java Web框架,它们在开发企业级应用程序时扮演着核心角色。Struts2是基于MVC(Model-View-Controller)设计模式的开源框架,而XWork2则是其底层的核心工作引擎,负责处理Action、...

    struts-xwork-core源码

    Struts-xwork-core是Struts2框架的核心组件,它提供了Action和结果的执行模型,以及类型转换、数据验证和国际化等功能。在这个压缩包中,包含了该核心库的源代码,对于学习和理解Struts2的工作原理及其内部机制极具...

    struts2 xwork2 源码

    Struts2和XWork2是两个非常重要的Java Web框架,它们在开发企业级应用程序时起着核心作用。Struts2是基于MVC(Model-View-Controller)设计模式的开源框架,而XWork2则是其底层工作框架,负责处理Action和业务逻辑。...

    struts2.3xwork2.chm中文帮助文档

    最全的struts2.3和xwork2.chm中文帮助文档

    struts2 xwork源文件

    在这个“struts2 xwork源文件”压缩包中,包含了XWork框架的源代码,这对于开发者深入理解Struts2的工作原理和扩展功能非常有帮助。 在Eclipse这样的集成开发环境中导入XWork的源代码,可以使开发者在调试和查看类...

    struts2 xwork-core 类图 chm

    struts2 xwork-core 类图 chm

    Struts2中xwork源码

    XWork是Struts2的核心组件,负责处理请求、动作调度、数据绑定以及异常处理等核心功能。本文将深入探讨XWork的源码,解析其设计理念和关键实现,帮助开发者更好地理解和使用Struts2。 1. **ActionInvocation**:...

    struts2下的xwork源码

    7. **OgnlValueStack**:Struts2使用OGNL(Object-Graph Navigation Language)作为默认的表达式语言,OgnlValueStack是ValueStack的实现,提供OGNL表达式的解析和操作。 8. **ResultTypes**:Struts2支持多种...

    Struts2 Xwork API

    struts-2.3.16.1-all API xwork-core core

    Struts2中的xwork源代码

    1. **ActionInvocation**:这是Struts2框架的核心类之一,代表了一个动作的执行过程。它管理着动作调用的栈,并且支持AOP(面向切面编程)的拦截器链,使得在执行动作前后可以插入自定义逻辑。 2. **ActionContext*...

    struts2_xwork2下载

    根据提供的文件信息,我们可以深入探讨Struts2与XWork2的相关知识点,特别是关于它们的下载、功能特性以及在实际项目中的应用。 ### Struts2框架简介 Apache Struts2是基于MVC(Model-View-Controller)设计模式的...

    Struts2源代码 包含struts-core和xwork-core源码

    - 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半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档

    struts2 xwork源代码

    XWork是Struts2的核心组件之一,它负责处理动作调度、异常处理、类型转换以及数据绑定等功能。这个压缩包“xwork.rar”包含了XWork的源代码,对于理解Struts2的工作原理和进行二次开发是非常有价值的资源。 XWork...

    Xwork——Struts2核心

    Xwork作为Struts2的核心组件之一,它的设计理念和技术实现对整个Struts2框架起着决定性的作用。Struts2是一个流行的Java Web开发框架,它采用了MVC(Model-View-Controller)架构模式来帮助开发者构建易于维护和扩展的...

    Struts2 2.3.16xwork_doc

    5. **国际化(Internationalization, I18N)与本地化(Localization, L10N)**: Struts2支持多语言环境,文档会解释如何实现I18N和L10N。 6. **异常处理**: Struts2提供了一套优雅的异常处理机制,包括全局异常映射...

    struts2 依赖核心包 --xwork 源文件

    在深入理解Struts2与XWork的关系之前,我们首先需要了解这两个概念的基础知识。 Struts2框架是在原有的Struts1的基础上进行改进和升级的,它克服了Struts1的一些局限性,提供了更灵活的配置和更强的类型安全。...

    struts2中xwork源码

    XWork是Struts2的核心组件,负责处理Action的业务逻辑和控制流程。深入理解XWork的源码有助于开发者更好地掌握Struts2的工作原理,提高开发效率和解决实际问题的能力。 在Struts2中,XWork扮演着以下几个关键角色:...

Global site tag (gtag.js) - Google Analytics