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

使用OGNL,您可以使用#application引用操作上下文对象,如#application#session#root#action #application#session#root#action和action上下文。

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

OGNL使用[]作为索引引用来访问对象属性。 例如,如果对象foo有一个属性bar那么它可以像foo.barfoo['bar'] 。 如果foo是一个地图而bar是一个键,它也可以工作。

现在,我想将一个变量和一个值放到值栈上下文中

   

并打印该值

  

它应该打印hello

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

在给定的表达式 ,将首先评估[]内的部分。 #foo被解析为bar因此表达式变为#attr['bar'] (相当于#attr.bar )。

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

#context.bar从带有键bar OGNL上下文值映射中获取值。

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