如何在Struts迭代器中访问ValueStack对象?

时间:2012-04-12 11:16:21

标签: java struts2 ognl valuestack

我有以下代码:

<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表达式都能解决它。但是我使用了#,这意味着我明确指定了解析的根对象。

为什么它仍然不起作用?

4 个答案:

答案 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>

您的要求有点混乱