在Manning的书“Struts2 in action”第106页中,提到了
如果你 看看图5.1中的这个,您可能希望表达式需要更像
myAction.user.username
。相反,只需要user.username。这是因为ValueStack
是一种虚拟对象,它将包含对象的属性公开为自己的属性。
并且在同一行中也说
如果存在重复属性,则堆栈中的两个对象都具有名称 property - 然后堆栈中最高对象的属性将是 一个暴露在由
ValueStack
表示的虚拟对象上。
我怀疑的是,如果我们可以使用第一段中描述的user.username
,那么可以有另一个用户名但不同的类。可以使用objectname.user
语法再次访问哪个。那他们为什么提到重复属性的问题呢?
答案 0 :(得分:0)
值堆栈看起来像Stack
这样的对象集合,您可以使用push()
,pop()
或peek()
在顶部访问它并且它具有根,这是由于OGNL的XWork扩展而产生的复合根。
XWork在OGNL之上提供的最大附加功能就是支持 对于ValueStack。虽然OGNL在假设的情况下运作 只有一个" root",XWork的ValueStack概念需要很多 "根"
这个复合根有一个"根"在表达式求值期间从顶部(0指数)遍历到堆栈(size() - 1),直到找到该值。因此,每个根都可以包含示例user.username
的值,但会返回第一个找到的值。问题是如何访问其他"根"中的那些重复属性。解决方案是通过索引访问根。例如,top对象的前缀为[0].
,[1].
是之前推送的对象,依此类推。那就是OGNL如何在价值堆栈上运作。您还可以在实现模型驱动Passing parameters to action through ModelDriven in Struts 2时看到我尝试访问操作bean属性的示例。
<强>参考文献:强>