与OGNL工作,你可以参考样动作上下文对象#application,#session,#root,#action,#request,#parameters,#attr,并用行动环境#context。
#application
#session
#root
#action
#request
#parameters
#attr
#context
该框架将OGNL上下文设置为我们的ActionContext,并将值堆栈设置为OGNL根对象。
OGNL []用作访问对象属性的索引引用。例如,如果对象foo具有属性,bar则可以像foo.bar或那样访问foo['bar']。如果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。
hello
我想知道这是如何工作的。我知道这#attr是一个对象,没有引用的属性#foo,即bar。但是,这可行。如果我使用#requestand #context,也可能#root代替,它也可以工作#attr。这两个对象都不具有属性bar,但是OGNL认为不是。我想知道OGNL对它引用的对象的属性有何看法,以及为什么此表达式起作用。另外,如果还有其他方法可以在OGNL表达式中hello使用#foo引用进行打印。
#foo
在给定的表达式中<s:property value="#attr[#foo]"/>,[]将首先评估内部的部分。将#foo被解析为bar这样表达式变为#attr['bar'](其等同于#attr.bar)。
<s:property value="#attr[#foo]"/>
#attr['bar']
#attr.bar
使用#attr.bar该值bar将被搜索,直到它在页面上下文中找到,然后在request,然后在session然后在application范围之内。
request
session
application
在#context.bar从OGNL上下文值地图Key获取价值bar。
#context.bar
在#request.bar试图获取请求属性与名称bar从请求地图,如果没有找到它,然后bar将在值栈进行搜索。这发生在Struts2请求包装器实现中。
#request.bar