我有以下代码:
<s:iterator value="reviews">
<img src="<s:property value="#request.restaurant.portalImage.url" />" />
<s:property value="user.firstName" />
<s:property value="user.lastName" />
<s:property value="rating" />
<s:property value="review" />
</s:iterator>评论是评论对象的列表,其中包含评论的详细信息,如评分和用户名。
我的问题是我不能在循环中访问ValueStack上的任何对象。
在循环之外,<s:property value="#request.restaurant.portalImage.url" />工作正常。但是在循环中,它输出null。
AFAIK是一个迭代器,它在ValueStack上推送它的集合,以便所有OGNL表达式都解析它。但是我使用了#,这意味着我显式地指定了解析的根对象。
为什么它仍然不能工作?
发布于 2012-07-04 06:27:21
我整个下午都在与一个类似的问题作斗争。在我的例子中,问题是我的迭代器变量(在您的例子中是reviews)有一个与外部变量同名的字段。
无论我多么努力地尝试突破迭代器的局部堆栈,它都不会访问外部变量。
如果您的评论迭代器有一个名为restaurant的字段,它将覆盖外部的restaurant变量,无论您如何努力:(
我找到的解决方案是简单地重命名外部变量。(例如:theRestaurant)
一旦我重命名它,它就不再与内部变量冲突,并且我能够从迭代器中访问它。
发布于 2012-04-12 19:24:49
您应该如下所示进行更改:
<s:iterator value="reviews" var="varrequest">
<img src="<s:property value="#varrequest.restaurant.portalImage.url" />" />
<s:property value="#varrequest.user.firstName" />
<s:property value="#varrequest.user.lastName" />
<s:property value="#varrequest.rating" />
<s:property value="#varrequest.review" />
</s:iterator>使用迭代器引用变量来获取唯一的索引对象。
发布于 2012-04-12 19:35:49
我不确定您在每个迭代器的Iterator.As中使用的集合中包含什么对象当您使用S2迭代器标记迭代集合时,它会将对象推送到值堆栈的顶部,这意味着,假设您有正在迭代的用户对象的集合,如下所示
<s:iterator value="userCollection">
</s:iterator>因此,当这将迭代时,S2迭代器将把user对象推到值堆栈的顶部,如果我们想引用user对象的name属性,我们只需要引用name属性
<s:property name="userName"/>由于OGNL将尝试在值栈中解析userName,并且我们已经将user对象作为值栈中的顶级对象,因此我建议您浏览一下迭代器标记文档以及它是如何推送值的
https://stackoverflow.com/questions/10122460
复制相似问题