一尘不染

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

jsp

与OGNL工作,你可以参考样动作上下文对象#application#session#root#action#request#parameters#attr,并用行动环境#context

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

OGNL
[]用作访问对象属性的索引引用。例如,如果对象foo具有属性,bar则可以像foo.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。但是,这可行。如果我使用#requestand
#context,也可能#root代替,它也可以工作#attr。这两个对象都不具有属性bar,但是OGNL认为不是。我想知道OGNL对它引用的对象的属性有何看法,以及为什么此表达式起作用。另外,如果还有其他方法可以在OGNL表达式中hello使用#foo引用进行打印。


阅读 279

收藏
2020-06-08

共1个答案

一尘不染

在给定的表达式中<s:property value="#attr[#foo]"/>[]将首先评估内部的部分。将#foo被解析为bar这样表达式变为#attr['bar'](其等同于#attr.bar)。

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

#context.bar从OGNL上下文值地图Key获取价值bar

#request.bar试图获取请求属性与名称bar从请求地图,如果没有找到它,然后bar将在值栈进行搜索。这发生在Struts2请求包装器实现中。

2020-06-08