`

ValueStack 与 OGNL

阅读更多

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>

 

分享到:
评论

相关推荐

    s20505_valueStack_OGNL

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

    Struts中的ognl和valueStack

    深入讲解Struts中的ognl和valueStack

    Struts用的ognl和valueStack(vs)实例

    Struts用的ognl和valueStack(vs)实例

    OGNL表达归纳

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

    Struts2中关于ValueStack的一些操作

    3、 WebWork的ValueStack底层有第三方开源项目OGNL实现。所以EL也都遵循OGNL的规范。我们在开发中,几乎不需要知道OGNL的细节。 4、 WebWork为每一次请求构建一个ValueStack,并将所有相关的数据对象(例如:...

    OGNL表达式语言.txt

    然后把action放进ValueStack,所以action的实例变量可以被OGNL访问。 访问上下文中的对象需要使用#符号标注命名空间,如#application、#session 另外OGNL会设定一个根对象(root对象),在Struts2中根对象是...

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

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

    struts项目调优需要的ognl2.7的jar包

    ognl2.7相对于2.6在性能上有了“显著”的提升.所以该jar包能对struts2的调优有很大帮助,尤其是ValueStack中的操作比较多的情况下。

    Struts2中的参数传递

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

    栈的简单代码

    栈是限制在表的一端进行插入和删除运算的线性表,插入、删除的这一端成为栈定,另一端为...Strtus2对OGNL进行了扩充,将值栈作为OGNL的根对象。 什么是值栈?符合先进后出的特点,能给valueStack值栈放入删除和查询的对象.

    Struts2框架基础 二

    OGNL表达式 interceptor拦截器 valuestack的存入 /取出

    XWork绕过安全限制执行任意命令漏洞补丁

    这是通过ParametersInterceptor来执行的,使用用户提供的HTTP参数调用ValueStack.setValue()。 除了获取和设置属性外,OGNL还支持其他一些功能: * 方法调用:foo() * 静态方式调用: @java.lang.System@exit...

    struts.docx

    Struts2是处理访问服务器的请求 学习struts2的(重点) Struts.xml的配置 参数传递 Ognl ValueStack Action原理 Result原理 拦截器 struts将会完全的取代我们的servlet技术

    Struts2练习Demo以及随笔

    Struts的开发步骤、OGNL、ValueStack、Action核心、Result基本原理、Struts2核心标记库、Struts2拦截器、自定义拦截器、UI标记、非UI标记、资源文件国际化等等实例全面使用。

    精讲Struts2

    精简全面讲解Struts 2.0Struts2产生背景 工作原理 实现步骤 标签 命名空间 转换器 国际化 输出 令牌机制 拦截器 表单校验(jQuery.validate验证框架) ...OGNL(ActionContext StackContext ValueStack区别)

    Struts2 in action中文版

    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 ...

    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....

    struts.ppt

    ognl 对象图导航语言 struts2框架默认 优点: 1.支持对象方法的调用 2.支持类的静态方法调用和常量值的调用 3.操作集合对象 &lt;s:property value="#"&gt;&lt;/s:property&gt; 除了ValueStack不加#,直接取用,其他都要加#,...

Global site tag (gtag.js) - Google Analytics