1

在 Manning 的书Struts2 in Action第 106 页中,它被提及为

如果您查看图 5.1 中的内容,您可能会认为表达式需要更像myAction.user.username. 相反,只有user.username 是必需的。这是因为它ValueStack是一种虚拟对象,它将其包含的对象的属性公开为自己的。

在同一行中,它还说

如果存在重复的属性——堆栈中的两个对象都有一个 name 属性——那么堆栈中最高对象的属性将是由ValueStack.

我的疑问是我们是否可以user.username按照第一段中的描述使用,那么可以有另一个用户名,但属于不同的类。可以再次使用objectname.user语法访问它。那为什么他们提到重复属性的问题呢?

4

1 回答 1

0

值堆栈看起来像Stack这样一个对象集合,您可以在顶部使用push()pop()或访问它,peek()并且它有一个根,即由于 OGNL 的 XWork 扩展而产生的复合根。

XWork 在 OGNL 之上提供的最大补充是对 ValueStack 的支持。虽然 OGNL 在只有一个“根”的假设下运行,但 XWork 的 ValueStack 概念要求有许多“根”。

这个复合根有一个“根”列表,在表达式评估期间从顶部(0-index)到堆栈(size()-1)向下遍历,直到找到值。因此,每个根都可以包含例如该值,user.username但将返回第一个找到的值。问题是如何访问其他“根”中的那些重复属性。解决方案是通过索引访问根目录。例如,顶部对象以 为前缀[0].[1].是之前推送的对象,依此类推。这就是 OGNL 在值堆栈上的工作方式。您还可以看到我在实现模型驱动时尝试访问动作 bean 属性的示例 在 Struts 2 中通过 ModelDriven 将参数传递给动作

参考:

于 2014-09-11T17:25:44.077 回答