在曼宁的书“Struts2在行动中”第106页中提到了以下内容
如果在图5.1中查看这一点,您可能会认为表达式需要更类似于
myAction.user.username。相反,只有user.username是必需的。这是因为ValueStack是一种虚拟对象,它将包含的对象的属性公开为自己的。
在同样的行里,它也说
如果存在重复属性(堆栈中的两个对象都具有name属性),则堆栈中最高对象的属性将是在
ValueStack表示的虚拟对象上公开的属性。
我怀疑,如果我们能像第一段所描述的那样使用user.username,那么可以有另一个用户名,但是是不同的类。它可以再次用objectname.user语法访问。那麽,他们为何要提及重复物业的问题呢?
发布于 2014-09-11 17:25:44
值堆栈看起来像一个Stack,它是一个对象集合,您可以使用push()、pop()或peek()在顶部访问这些对象,并且它有一个根,即OGNL的复合根到期XWork扩展。
XWork在OGNL之上提供的最大补充是对ValueStack的支持。虽然OGNL是在假设只有一个“根”的情况下运行的,但是XWork的ValueStack概念需要有许多“根”。
这个复合根有一个“根”列表,在表达式计算期间从顶部(0-索引)遍历到堆栈(size()-1),直到找到值。因此,每个根都可以包含这个值,例如user.username,但是第一个找到的值将被返回。问题是如何访问其他“根”中重复的属性。解决方案是通过索引访问根。例如,top对象以[0].作为前缀,[1].是以前推送的对象,依此类推。这就是OGNL在值堆栈上的工作方式。您还可以看到当模型驱动实现在Struts 2中通过ModelDriven传递参数到操作时,我尝试访问动作bean属性的示例。
参考资料:
https://stackoverflow.com/questions/25792420
复制相似问题