`

Ongl 与 ValueStack ActionContextStruts2

阅读更多
Ongl 与 ValueStack ActionContextStruts2 2010-01-30 22:48:37 阅读377 评论0   字号:大中小 订阅
——————————————————————————————————————————————————

Ognl.setValue(String expr, Object obj, Object value) 与 Ognl.getValue(String expr, Object obj)执行规则:

上面两个函数都不支持以“#”开头的ognl表达式。

以Ognl.getValue(“a.b.myFunction()”, obj)为例,执行规则如下:

1. 如果obj实现map接口:obj.get("a")
2. 如果obj不实现map接口:obj.getA()/isA()

返回的对象又根据上面的规则来执行get("b")或getB()/isB(),接着返回的对象执行myFunction()函数。



对应的,Ognl.setValue(“a.b.myFunction().d”, obj, value)的执行规则开始时与上面一样,到最后一步时:

1. 如果当前对象实现map接口则执行 put("d",value)
2. 如果当前对象不实现map接口则执行 setD(value)
正规的代码一个类不应该既有getA()方法又有isA()方法,所以我就没测试若这两个方法都有会执行哪个了。



Ognl.getValue(String expr, Map map, Object obj)执行规则:

如果expr以“#”开头,执行Ognl.getValue(expr.substring(1), map),否则执行Ognl.getValue(expr, obj)。



关于异常:
1.如果在执行函数之前没有获得对象,譬如说obj.getA()返回的是null,null再执行getB()/isB()就会产生空指针异常。
2.如果得到的对象没有下一个要执行的函数,譬如说obj.getA()返回一个对象,但这个对象没有getB()/isB()函数,也产生异常。
Ognl把上面两种异常都进行了封装,转抛出它定义的Ognl异常。

——————————————————————————————————————————————————

获得当前ActionContext:
ActionContext ctx = ActionContext.getContext();
ActionContext里面包含了一个Map结构,称为context。



获得ValueStack:
ValueStack stack = ActionContext.getContext().getValueStack();
ValueStack里面包含了一个List结构,称为root。



获得Root:
CompoundRoot root = ActionContext.getContext().getValueStack().getRoot();
CompoundRoot的数据结构是一个List,作为一个栈来使用。



获得Context:
Map<String,Object> context = ActionContext.getContext().getContextMap();
Map<String,Object> context = ActionContext.getContext().getValueStack().getContext();

——————————————————————————————————————————————————

根据ognl取出对象:
Object obj =  stack.findValue(String expr);
expr是指定对象的ongl表达式。找不到返回null,不抛异常。

根据ognl设置对象:
stack.setValue(String expr, Object value);
expr是被设置对象的ongl表达式。找不到等于什么都没干,不抛异常。
value是设置为该对象。

Root操作:
Object obj = stack.pop();   取出Root栈顶对象并把它从Root移除。
Object obj = stack.peek();  取出Root栈顶对象不把它从Root移除。
stack.push(Object o);       把对象o放入Root栈顶。

Context操作:
actionctx.put(String key, Object value); 把一个对象放入Context里。
key是放入Context时对象的key,value是放入Context的对象。

——————————————————————————————————————————————————
ValueStack的findValue(String expr)与setValue(String expr, Object value)的查找顺序:
如果ognl以#开始,只从context查找,否则从root的栈顶对象开始往下查找,找到后不会继续往下查找,如果root找遍后也没有,再到context里查找。

函数的执行规则与上面的Ognl.setValue/Ognl.getValue一样,根据当前对象的类型来判断执行get("a")/put("a",value)还是getA()/SetA(value)。

估计ValueStack的findValue()与setValue()函数就是上面Ognl的setValue,getValue等相关函数的封装。

——————————————————————————————————————————————————

struts2标签doTag()猜想
根据struts2标签的功能和上面说明,很容易猜想到struts2标签doTag()里面的结构,下面列出几个(只是我的猜想,没确认过源代码):

<s:property />   输出root栈顶对象
{
ValueStack stack = ActionContext.getContext().getValueStack();
Object obj = stack.peek();
通过pageContext获得response的输出流对象out;
out.print(obj);
}


<s:property value="name" />
{
ValueStack stack = ActionContext.getContext().getValueStack();
Object obj = stack.findValue("name");
通过pageContext获得response的输出流对象out;
out.print(obj);
}


<s:property value="#msg.time" />
{
ValueStack stack = ActionContext.getContext().getValueStack();
Object obj = stack.findValue("#msg.time");
通过pageContext获得response的输出流对象out;
out.print(obj);
}


<s:set name="firstEmp" value="empList[0]" />  往context放入对象:
{
ActionContext ctx = ActionContext.getContext();
ValueStack stack = ActionContext.getContext().getValueStack();
Object obj =  stack.findValue("empList[0]");
ctx.put("firstEmp", obj);
}


<s:push value="empList[0]">  往root栈顶放入对象
......
</s:push>  push标签结束就把对象从root栈顶取出恢复原状
{
ValueStack stack = ActionContext.getContext().getValueStack();
Object obj = stack.findValue("empList[0]");
stack.push(obj);
......
stack.pop();
}
分享到:
评论

相关推荐

    Struts2中关于ValueStack的一些操作

    2、 EL,全称Express Language,即表达式语言。不要被语言吓倒,它是简单的对象导航语言。有字符串(例如:方法名)和特殊字符组成(例如用.表示调用对应的属性方法)。通过EL,我们可以存、取对象数据,而且还可以...

    ValueStack使用参考

    ValueStack的使用方法和一些技能

    在线培训:ValueStack

    培训主要学习以下几个知识点: 1、制作PPT,讲解栈的特点和使用方法 2、编码实现回文对 3、制作PPT,讲解Struts2中的ValueStack 4、编码改变ValueStack中的对象的顺序

    Struts中的ognl和valueStack

    深入讲解Struts中的ognl和valueStack

    Struts用的ognl和valueStack(vs)实例

    Struts用的ognl和valueStack(vs)实例

    s20505_valueStack_OGNL

    Struts2 demo,使用struts2的ognl表达式传值,以及页面的数据的实时的刷新。

    linjin101#javaStudy#Struts2中的OGNL和值栈ValueStack1

    1、什么是值栈 2、值栈的内部结构 3、ActionContext和ValueStatck的关系 4、如何获取值栈对象 5、向值栈存数据 6、从值栈中获取数据

    OGNL表达归纳

    3.由于ValueStack(值栈)是Struts 2中OGNL的根对象,如果用户需要访问值栈中的对象,在JSP页面可以直接通过下面的EL表达式访问ValueStack(值栈)中对象的属性 4.为何使用EL表达式能够访问valueStack中对象的属性 原因...

    struts学习笔记(3)

    和com.opensymphony.xwork2.util.ValueStack 1)ValueStack和ActionContext的作用: 当客户端向action发送请求并且最后跳转到另外一个页面的时候,在跳转的同时,struts2框架会帮我们自动把需要传到页面的值放这两...

    Struts2中的参数传递

    我们知道,Struts2完成参数传递处理工作的基础是OGNL和ValueStack。而在这个 过程中,我也把Struts2所要做的工作大致归纳为两个方面: 1. 对OGNL操作进行封装,完成OGNL表达式所表示的值到Java对象的值传递机制 2. ...

    OGNL表达式语言.txt

    OGNL表达式语言: 相对EL表达式,它提供了平时我们需要的一些功能,如: ...另外OGNL会设定一个根对象(root对象),在Struts2中根对象是ValueStack。 如果访问根对象中的对象的属性,则可以省略#命名空间。

    栈的简单代码

    值栈(ValueStack)是Struts2的一个核心概念,类似于正常的栈,符合后进先出的 栈的特点,可以在值栈中放入、删除和查询对象。Strtus2对OGNL进行了扩充,将值栈作为OGNL的根对象。 什么是值栈?符合先进后出的特点,能给...

    xwork-sources

    struts2.0 ValueStack 相关源码

    Struts2 Value Stack Contents 中取值、多个集合数组

    Struts2 Value Stack Contents 中取值、多个集合数组示例

    Struts2基础教程

    讲解Struts2入门基础,包括Action、Result、ValueStack等,Struts2初学者会有帮助

    Struts2入门教程(全新完整版)

    四、OGNL与ValueStack(VS) 22 1.值栈入门 22 2.OGNL入门 24 3.普通方法访问 24 4.静态方法访问 24 5.默认类Math的访问 24 6.调用普通类的构造方法 25 7.集合对象初步 25 8.集合对象进阶 25 9.N语法top语法 26 10....

    struts2 学习例子

    非UI标签可分为流程控制标签(包括用于实现分支、循环等流程控制的标签)和数据访问标签(主要包括用户输出ValueStack中的值,完成国际化等功能的) (3)ajax标签 3.Struts2标签使用前的准备: (1)在要使用标签...

    struts2 标签库使用文档

    Struts2标签库的组成 ...数据访问标签:主要包含用于输出值栈(ValueStack)中的值,完成国际化等功能的标签。 流程控制标签:主要包含用于实现分支,循环等流程控制的标签。 AJAX标签:用于支持Ajax效果

    马士兵Struts2笔记2013

    建立一个Struts2 工程,用Action的属性接收参数,使用Domain Model (实体模型) 接收参数,Struts2_2.1.6版本的中文问题,Struts模块包含,Struts简单数据验证 ,Struts ValueStack(值栈) Debug,Value Stack ...

Global site tag (gtag.js) - Google Analytics