7

我有以下代码:

<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" />正常工作。但在循环内它打印空。

AFAIK 迭代器将其集合推送到 ValueStack 上,以便所有 OGNL 表达式都针对它进行解析。但是我使用了 # 这意味着我明确指定了要解析的根对象。

为什么它仍然不起作用?

4

4 回答 4

2

我整个下午都在与一个类似的问题作斗争。在我的情况下,问题是我的迭代器变量(在你的情况下reviews)有一个与外部变量同名的字段。

无论我多么努力地尝试突破迭代器的本地堆栈,它都不会访问外部变量。

如果您的评论迭代器有一个名为restaurant的字段,无论您多么努力,它都会覆盖外部餐厅变量:(

我找到的解决方案是简单地重命名外部变量。(例如:餐厅

一旦我重命名它,它就不再与内部变量发生冲突,并且我能够从迭代器中访问它。

于 2012-07-03T22:27:20.803 回答
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>

使用迭代器引用变量来获取唯一索引对象。

于 2012-04-12T11:24:48.700 回答
1

我不确定您在迭代器中使用的集合中包含什么对象。根据迭代器,当您使用 S2 迭代器标记迭代集合时,它会将对象推送到值堆栈的顶部,这意味着,假设您有您正在迭代的用户对象的集合

<s:iterator value="userCollection">

</s:iterator>

所以当 this 进行迭代时,S2 迭代器会将user对象推入值堆栈顶部,如果我们想引用对象的name属性user,我们只需要引用 name 属性

<s:property name="userName"/>

因为 OGNL 将尝试userName在值堆栈中解析,并且我们已经将用户对象作为值堆栈中的顶级对象。我建议阅读 Iterator 标签文档以及它如何推送值

于 2012-04-12T11:35:49.120 回答
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>

你的要求有点混乱

于 2012-04-12T12:57:56.723 回答