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();
}
分享到:
相关推荐
ValueStack是Struts2框架中的核心组件之一,它是ActionContext和ActionInvocation之间的一个数据传递层,负责在Action与视图之间传递和管理数据。ValueStack的作用在于简化模型-视图-控制器(MVC)架构中的数据交互...
2、 EL,全称Express Language,即表达式语言。不要被语言吓倒,它是简单的对象导航语言。有字符串(例如:方法名)和特殊字符组成(例如用.表示调用对应的属性方法)。通过EL,我们可以存、取对象数据,而且还可以...
在本次培训中,参与者将全面了解栈数据结构的基础知识,以及在Struts2框架中ValueStack的重要角色。以下是详细的知识点讲解: 1. **栈的特点与使用方法** 栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO)...
2. **ActionContext**:与ValueStack密切相关的是ActionContext,它包含了当前请求的上下文信息,包括ValueStack、Session、Request和Application等数据。 3. **动作方法与结果转发**:Action类中定义的方法通常对应...
深入讲解Struts中的ognl和valueStack
OGNL(Object-Graph Navigation Language)是一种基于 Java 的表达式语言,Struts2 框架中使用 OGNL 来访问和操作 ValueStack 中的对象。在 Struts2 中,OGNL 是一个强大的工具,允许开发者访问和操作 ValueStack 中...
1、什么是值栈 2、值栈的内部结构 3、ActionContext和ValueStatck的关系 4、如何获取值栈对象 5、向值栈存数据 6、从值栈中获取数据
在Struts2中,每个Action实例都有一个与之关联的ValueStack对象,该对象贯穿整个Action的生命周期。ValueStack不仅包含了Action对象本身,还可能包含其他辅助对象或数据,比如表单数据、验证错误等。 #### 获取...
在Struts2框架中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。本文将深入探讨OGNL中`#`,`%`,`$`这三个特殊符号的用法。 首先,`#`符号在OGNL中的主要作用是...
在Struts2框架中,ActionContext被设置为OGNL的上下文,值栈(ValueStack)作为根对象。值栈是一个存储Action实例和相关数据的结构,它使得在栈顶的Action实例的属性可以直接通过OGNL表达式访问,无需添加#前缀。...
ValueStack 对象在 Struts2 中扮演着非常重要的角色,它将属性值从一个拦截器传到了另一个拦截器(当然,在这其间,属性值可能改变),最后会传到 Action 对象,并将 ValueStack 对象中的属性的值终值赋给 Action 类...
Struts2提供了多种机制来实现这一目标,其中最为常用的是通过`ActionContext`与`ValueStack`来完成值的传递。 #### 1. `ValueStack`与`ActionContext`的基本作用 - **`ValueStack`**:每当一个新的请求被处理时,...
这是通过Struts2的内建机制实现的,其中ValueStack对象起着至关重要的作用。ValueStack是一个数据结构,它像一个栈一样,用于存储Action类的属性和它们的值。当一个HTTP请求到达时,Struts2会创建Action类的一个实例...
Action类是业务逻辑的载体,与ValueStack交互。 3. **配置Struts2的配置文件**:在`struts.xml`或`struts.properties`中,定义Action的映射,包括结果类型、方法名和对应的JSP页面。 4. **编写JSP页面**:使用`s`...
2. Struts2根据配置文件找到对应的Action类,并创建一个实例。 3. 将Action实例压入Value Stack。 4. 执行Action的execute方法,业务逻辑处理完成后,Action的属性会被填充。 5. OGNL通过Value Stack获取Action的...
综上所述,OGNL是Struts2框架中的一个重要组成部分,它不仅提供了强大的表达式语言功能,还与框架的核心机制(如ValueStack)紧密结合,使得开发者能够更高效地处理对象之间的导航和访问。通过深入理解OGNL的工作...
- 第二种:通过ServletActionContext对象结合HttpServletRequest获取,`ValueStack valueStack2 = ServletActionContext.getValueStack(ServletActionContext.getRequest());` - 第三种:直接从HttpServletRequest...
在Struts2中,OGNL被广泛用于表示层与业务层数据的交互。 1. **OGNL的基本语法** - OGNL表达式通常以`#`字符开始,用于引用ActionContext的ValueStack。 - 属性访问:如`#myObject.myProperty`,用于获取或设置...
《Struts2技术内幕——深入解析Struts2架构设计与实现原理》这本书深入讲解了这些内容,包括但不限于Action的设计模式、Interceptor的实现原理、ValueStack的工作流程、以及Struts2与其他框架的整合策略,对于想要...