如何使用OGNL索引引用运算符
使用OGNL,您可以使用#application
引用操作上下文对象,如#application
, #session
, #root
, #action
#application
, #session
, #root
, #action
和action上下文。
框架将OGNL上下文设置为我们的ActionContext,将值堆栈设置为OGNL根对象。
OGNL使用[]
作为索引引用来访问对象属性。 例如,如果对象foo
有一个属性bar
那么它可以像foo.bar
或foo['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请求包装器实现中。