ValueStack 与 OGNL
值栈的含义正如它的名字所表示的那样——对象所组成的栈。OGNL的全称是Object Graph Navigational Language(对象图导航语言),提供了访问值栈中对象的统一方式。
值栈中的对象构成及其排列顺序如下所示:
1. 临时对象——在执行过程中,临时对象被创建出来并放到了值栈中。举个例子来说,像JSP标签所遍历的对象容器中,当前访问到的值就是临时对象
2. 模型对象——如果模型对象正在使用,那么会放在值栈中action的上面
3. Action对象——正在被执行的action
4. 上下文中固定名称的对象(Named Objects)——这些对象包括有#application, #session, #request, #attr 和 #parameters,以及相应的servlet作用域
struts2中的OGNL上下文
struts2对OGNL上下文的概念又做了进一步扩充,在struts2中,OGNL上下文通常如下所示:
|--request
|
|--application
|
context map---|--OgnlValueStack(root) [ user, action, OgnlUtil, ... ]
|
|--session
|
|--attr
|
|--parameters
代码示例
public interface User {
public String getName();
public Date getRegisterDate();
public Customer getCustomer();
}
public interface Customer {
public String getId();
public String getName();
public boolean isVip();
}
public interface EntCustomer extends Customer {
public String getTrustId(); // 组织机构代码证号
}
那么在上面的环境中,我们可以有如下的OGNL表达式:
Java代码
#user.name // 取用户的姓名
#user.age // 取用户年龄
#user.birthday // 取用户生日
#user.customer.name // 取用户所属客户的名称
#request.parameters // 取请求参数
请注意上面表达式中的"#user"和"#request"的用法,"#"表示访问环境/上下文中的对象。
现在可以很方便地访问环境中的对象了,那么如果你比较懒惰的话(记住:在程序员群体,懒惰是褒义词!),你是否觉得访问用户的姓名,年龄,生日,等等其它属性如果全部要使用"#user"来访问会不会太麻烦了呢?OK,ONGL的设计者早就考虑了这个问题,我们可以指定user为环境中的特权对象,访问该对象可以不需要使用#user的方式,如下所示代码与上面的完全等价,当然,前提是要预先指定user为特权对象:
name // 取用户的姓名
age // 取用户年龄
birthday // 取用户生日
customer.name // 取用户所属客户的名称
#request.parameters // 取请求参数
我们上面所说的"特权对象"在OGNL中称为"根对象"(root)
我们可以使用"#requet"访问HttpServletRequest对象, "#session"访问HttpSession对象,但请注意"根对象"是什么?是ValueStack!
那么ValueStack是什么?值栈。也就是一组对象的堆栈。也就是说,在struts2中,根对象不是我们通常的一个对象,而是一组对象。我们可以push新的对象到值栈中,也可以弹出值栈的栈顶对象。如上图所示,假设我们将user对象push到值栈中,那么如下的表达式将与之前我们见过的表达式一样,具有相同的结果.
也就是说,我们使用name这个表达式的时候,ONGL会取"根对象"的name属性,但现在根对象是ValueStack!那么访问ValueStack的name属性意味着什么呢?这意味着: ValueStack会先查看栈顶元素是否有name属性,如果有就返回该属性值,否则取出栈顶下的元素,继续查看,直到栈底为止。
其实,我们可以ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");直接去访问.
//获取封装输出信息的ValueStack对象
ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");
//调用ValueStack的fineValue方法获取Action中的books属性值
String[] books = (String[])vs.findValue("books");
<%@taglib prefix="s" uri="/struts-tags"%>
通过s:iterator迭代出value
<table border="1" width="360">
<caption>
作者李刚的图书
</caption>
<!-- 迭代输出ValueStack中的books对象,其中status是迭代的序号 -->
<s:iterator value="books" status="index">
<!-- 判断序号是否为奇数 -->
<s:if test="#index.odd == true">
<tr style="background-color: #cccccc">
</s:if>
<!-- 判断迭代元素的序号是否不为偶数 -->
<s:else>
<tr>
</s:else>
<td>
书名:
</td>
<td>
<s:property />
</td>
</tr>
</s:iterator>
</table>
分享到:
相关推荐
Struts2 demo,使用struts2的ognl表达式传值,以及页面的数据的实时的刷新。
深入讲解Struts中的ognl和valueStack
Struts用的ognl和valueStack(vs)实例
3.由于ValueStack(值栈)是Struts 2中OGNL的根对象,如果用户需要访问值栈中的对象,在JSP页面可以直接通过下面的EL表达式访问ValueStack(值栈)中对象的属性 4.为何使用EL表达式能够访问valueStack中对象的属性 原因...
3、 WebWork的ValueStack底层有第三方开源项目OGNL实现。所以EL也都遵循OGNL的规范。我们在开发中,几乎不需要知道OGNL的细节。 4、 WebWork为每一次请求构建一个ValueStack,并将所有相关的数据对象(例如:...
然后把action放进ValueStack,所以action的实例变量可以被OGNL访问。 访问上下文中的对象需要使用#符号标注命名空间,如#application、#session 另外OGNL会设定一个根对象(root对象),在Struts2中根对象是...
1、什么是值栈 2、值栈的内部结构 3、ActionContext和ValueStatck的关系 4、如何获取值栈对象 5、向值栈存数据 6、从值栈中获取数据
ognl2.7相对于2.6在性能上有了“显著”的提升.所以该jar包能对struts2的调优有很大帮助,尤其是ValueStack中的操作比较多的情况下。
我们知道,Struts2完成参数传递处理工作的基础是OGNL和ValueStack。而在这个 过程中,我也把Struts2所要做的工作大致归纳为两个方面: 1. 对OGNL操作进行封装,完成OGNL表达式所表示的值到Java对象的值传递机制 2. ...
栈是限制在表的一端进行插入和删除运算的线性表,插入、删除的这一端成为栈定,另一端为...Strtus2对OGNL进行了扩充,将值栈作为OGNL的根对象。 什么是值栈?符合先进后出的特点,能给valueStack值栈放入删除和查询的对象.
OGNL表达式 interceptor拦截器 valuestack的存入 /取出
这是通过ParametersInterceptor来执行的,使用用户提供的HTTP参数调用ValueStack.setValue()。 除了获取和设置属性外,OGNL还支持其他一些功能: * 方法调用:foo() * 静态方式调用: @java.lang.System@exit...
Struts2是处理访问服务器的请求 学习struts2的(重点) Struts.xml的配置 参数传递 Ognl ValueStack Action原理 Result原理 拦截器 struts将会完全的取代我们的servlet技术
Struts的开发步骤、OGNL、ValueStack、Action核心、Result基本原理、Struts2核心标记库、Struts2拦截器、自定义拦截器、UI标记、非UI标记、资源文件国际化等等实例全面使用。
精简全面讲解Struts 2.0Struts2产生背景 工作原理 实现步骤 标签 命名空间 转换器 国际化 输出 令牌机制 拦截器 表单校验(jQuery.validate验证框架) ...OGNL(ActionContext StackContext ValueStack区别)
6.1.2 虚拟对象ValueStack 111 6.2 Struts 2标签概要 113 6.2.1 Struts 2标签API语法 113 6.2.2 使用OGNL设置标签属性 115 6.3 数据标签 117 6.3.1 property标签 117 6.3.2 set标签 118 6.3.3 push标签 119 6.3.4 ...
四、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....
ognl 对象图导航语言 struts2框架默认 优点: 1.支持对象方法的调用 2.支持类的静态方法调用和常量值的调用 3.操作集合对象 <s:property value="#"></s:property> 除了ValueStack不加#,直接取用,其他都要加#,...