`
conkeyn
  • 浏览: 1524649 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Ongl 与 ValueStack ActionContext

阅读更多

转自:http://blog.sina.com.cn/s/blog_5c0522dd0100luqx.html

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中的ActionContext与ognl

    而在控制器层,Action类的属性可以通过ActionContext的ValueStack与HTTP请求参数进行绑定,或者在Action的执行过程中,使用OGNL进行数据的读写和计算。 总的来说,ActionContext是Struts2框架处理请求上下文的核心...

    ValueStack使用参考

    ValueStack是Struts2框架中的核心组件之一,它是ActionContext和ActionInvocation之间的一个数据传递层,负责在Action与视图之间传递和管理数据。ValueStack的作用在于简化模型-视图-控制器(MVC)架构中的数据交互...

    JavaEE ActionContext存取数据示例

    ActionContext提供了在Action、Servlet、ValueStack以及其他的Struts2组件之间传递数据的桥梁。在这个“JavaEE ActionContext存取数据示例”中,我们将深入探讨ActionContext的使用方法及其与OGNL(Object-Graph ...

    在线培训:ValueStack

    ValueStack是Struts2框架的核心组件之一,它是一个存储ActionContext中的值的对象栈。ValueStack的主要功能是处理视图和模型之间的数据传递。在Struts2中,Action类的属性可以直接映射到JSP页面上的标签,这是因为...

    s20505_valueStack_OGNL

    2. **ActionContext**:与ValueStack密切相关的是ActionContext,它包含了当前请求的上下文信息,包括ValueStack、Session、Request和Application等数据。 3. **动作方法与结果转发**:Action类中定义的方法通常对应...

    struts学习笔记(3)

    Struts2提供了多种机制来实现这一目标,其中最为常用的是通过`ActionContext`与`ValueStack`来完成值的传递。 #### 1. `ValueStack`与`ActionContext`的基本作用 - **`ValueStack`**:每当一个新的请求被处理时,...

    `Strtus2 OGNL表达式的结合

    在Struts2中,OGNL与ActionContext和ValueStack紧密集成。ActionContext是一个上下文对象,它包含了当前请求的所有环境信息,包括请求参数、session、应用上下文等。在OGNL表达式中,ActionContext作为Context,提供...

    Struts2中关于ValueStack的一些操作

    关于ValueStack的描述: 1、 ValueStack其实就是一个放置Java对象的堆栈而已,唯一特别的是可以使用EL来获得值堆栈中对象属性的数据,并可以为值堆栈的对象属性赋值。 2、 EL,全称Express Language,即表达式...

    Struts2 ActionContext 中的数据详解

    值栈(ValueStack)与ActionContext之间的关系和区别是: - 相同点:两者都在一次HTTP请求的生命周期内存在,即它们的生命周期与一次请求的生命周期相同。 - 不同点:值栈采用栈的结构,用于存储Action实例和其他...

    Struts中的ognl和valueStack

    深入讲解Struts中的ognl和valueStack

    java详解教程-structs 2

    Struts 2 框架作为Java Web开发中的明星框架,其数据传递模型的设计尤为关键,它不仅优化了传统的Servlet架构,还引入了一系列创新机制,如ValueStack和ActionContext,使得数据的处理更加灵活和高效。 **1.1 ...

    struts2OGNL表达式ActionContext及valuesStack.pdf

    `#`前缀可以用来获取`ActionContext`,这包含了四个重要的域:parameters、request、session和application。`#parameters`提供了当前HTTP请求的所有参数,`#request`、`#session`和`#application`则分别对应...

    Struts2访问request,session,application的四种方式

    例如,研究`ActionSupport`类如何与ActionContext交互,或者查看`ValueStack`如何管理栈中的对象。此外,开发工具如IDE的调试功能,可以帮助我们跟踪代码执行流程,直观地看到数据在不同范围间的传递过程。 总结来...

    struts2中OGNL的一些概念及原理说明

    除了`ActionContext`之外,`ValueStack`也是一个重要的工具类,它与`ActionContext`一起创建,并同样存储在`ContextMap`中。通过`ActionContext.getValueStack()`方法可以获取`ValueStack`对象。 1. **ValueStack的...

    struts2框架面试题及答案02

    1. **通过ActionContext**: `ValueStack valueStack = ActionContext.getContext().getValueStack();` 2. **通过ServletActionContext**: `ValueStack valueStack = ServletActionContext.getValueStack...

    Struts2的三种传值方式比较(附demo)

    总结来说,Struts2的传值方式包括Action属性、ValueStack和Ognl以及ActionContext与请求/Session域的使用。选择合适的方式取决于业务需求和代码的可维护性。了解并熟练掌握这些方法,对于提高Struts2应用的开发效率...

    赵栋struts2 笔记

    - 第一种:通过ActionContext对象获取,`ValueStack valueStack1 = ActionContext.getContext().getValueStack();` - 第二种:通过ServletActionContext对象结合HttpServletRequest获取,`ValueStack valueStack2 ...

    struts2 接收参数

    这一过程主要由两个关键部分完成:ActionContext和ValueStack。 ActionContext是Struts2框架的核心上下文对象,它存储了有关当前请求的所有信息,包括请求参数、session、application等数据。在每次请求处理时,...

    struts2.0.9-api

    ActionContext与ValueStack** ActionContext是存储请求上下文信息的容器,包括Action、Session、Request、Response等。ValueStack是ActionContext中的一个核心概念,它是一个对象栈,用于存放Action实例和其他需要...

Global site tag (gtag.js) - Google Analytics