如何使用OGNL索引引用运算符

时间:2014-05-28 18:29:16

标签: java jsp struts2 ognl valuestack

使用OGNL,您可以引用操作上下文对象,例如#application#session#root#action#request#parameters,{ {1}}以及#attr的操作上下文。

  

框架将OGNL上下文设置为我们的ActionContext,并且   值栈是OGNL根对象。

OGNL使用#context作为索引引用来访问对象属性。例如,如果对象[]具有属性foo,则可以访问barfoo.bar。如果foo['bar']是地图而foo是关键字,那么它也有效。

现在,我想将一个变量和一个值放到值堆栈上下文中,就像那样

bar

并打印值

<s:set var="bar" value="'hello'"/>
<s:set var="foo" value="'bar'"/>

应打印<s:property value="%{#attr[#foo]}"/>

我想知道这是如何运作的。我知道hello是一个没有#attr引用的属性的对象,即#foo。然而这是有效的。如果我使用bar#request,并且可能#context而不是#root,它也可以使用。这两个对象都没有属性#attr,但OGNL认为不是这样。我想知道OGNL对它引用的对象的属性的看法以及为什么这个表达式正在工作。此外,如果有其他方法可以在OGNL表达式中使用bar引用打印hello

1 个答案:

答案 0 :(得分:2)

在给定的表达式<s:property value="#attr[#foo]"/>中,将首先评估[]内的部分。 #foo已解析为bar,因此表达式变为#attr['bar'](相当于#attr.bar)。

使用#attr.bar将搜索bar的值,直到在页面上下文中找到该值,然后在request中,然后在session中,然后在application范围。

#context.bar从密钥为bar的OGNL上下文值映射中获取值。

#request.bar尝试从请求映射中获取名为bar的请求属性,如果未找到,则将在值堆栈中搜索bar。这种情况发生在Struts2请求包装器实现中。