我有以下代码:
<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表达式都能解决它。但是我使用了#,这意味着我明确指定了解析的根对象。
为什么它仍然不起作用?
答案 0 :(得分:2)
我整个下午都在与一个类似的问题作斗争。
在我的例子中,问题是我的迭代器变量(在你的情况下reviews
)有一个与外部变量同名的字段。
无论我多么努力地打破迭代器的本地堆栈,它都不会访问外部变量。
如果你的评论迭代器有一个名为 restaurant 的字段,它将覆盖外部餐厅变量,无论你怎么努力:(
我发现的解决方案是简单地重命名外部变量。 (例如: theRestaurant )
一旦我重命名它,它就不再与内部变量冲突了,我能够从迭代器中访问它。
答案 1 :(得分:1)
你应该改变它如下:
<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>
使用迭代器引用变量来获取唯一索引对象。
答案 2 :(得分:1)
我不确定您在Iterator中使用的集合中包含哪个对象。根据迭代器,当您使用S2迭代器标记迭代集合时,它会将对象推送到值堆栈的顶部,这意味着,假设你有像
那样迭代的用户对象的集合<s:iterator value="userCollection">
</s:iterator>
所以当这将迭代时,S2迭代器会将user
对象推到值堆栈之上,如果我们想要引用name
对象的user
属性,我们只需要引用名称属性
<s:property name="userName"/>
因为OGNL将尝试解析值堆栈中的userName
并且我们已经将用户对象作为值栈中的顶级对象。我建议通过Iterator标记文档以及它如何推送值
答案 3 :(得分:0)
我认为它可以解决您的问题
s:iterator value="reviews" status="position">
<img src="<s:property value="#request.restaurant.portalImage.url"/>"/>
<s:property value="#position.user.firstName"/>
<s:property value="#position.user.lastName"/>
<s:property value="#position.rating"/>
<s:property value="#position.review"/>
</s:iterator>
您的要求有点混乱