使用OGNL,您可以引用操作上下文对象,例如#application
,#session
,#root
,#action
,#request
,#parameters
,{ {1}}以及#attr
的操作上下文。
框架将OGNL上下文设置为我们的ActionContext,并且 值栈是OGNL根对象。
OGNL使用#context
作为索引引用来访问对象属性。例如,如果对象[]
具有属性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
和#request
,并且可能#context
而不是#root
,它也可以使用。这两个对象都没有属性#attr
,但OGNL认为不是这样。我想知道OGNL对它引用的对象的属性的看法以及为什么这个表达式正在工作。此外,如果有其他方法可以在OGNL表达式中使用bar
引用打印hello
。
答案 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请求包装器实现中。