首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Struts迭代器中访问ValueStack对象?

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

Stack Overflow用户
提问于 2012-04-12 19:16:21
回答 4查看 4.4K关注 0票数 7

我有以下代码:

代码语言:javascript
复制
<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表达式都解析它。但是我使用了#,这意味着我显式地指定了解析的根对象。

为什么它仍然不能工作?

EN

回答 4

Stack Overflow用户

发布于 2012-07-04 06:27:21

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

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

如果您的评论迭代器有一个名为restaurant的字段,它将覆盖外部的restaurant变量,无论您如何努力:(

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-04-12 19:24:49

您应该如下所示进行更改:

代码语言:javascript
复制
 <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>

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

票数 1
EN

Stack Overflow用户

发布于 2012-04-12 19:35:49

我不确定您在每个迭代器的Iterator.As中使用的集合中包含什么对象当您使用S2迭代器标记迭代集合时,它会将对象推送到值堆栈的顶部,这意味着,假设您有正在迭代的用户对象的集合,如下所示

代码语言:javascript
复制
<s:iterator value="userCollection">

</s:iterator>

因此,当这将迭代时,S2迭代器将把user对象推到值堆栈的顶部,如果我们想引用user对象的name属性,我们只需要引用name属性

代码语言:javascript
复制
<s:property name="userName"/>

由于OGNL将尝试在值栈中解析userName,并且我们已经将user对象作为值栈中的顶级对象,因此我建议您浏览一下迭代器标记文档以及它是如何推送值的

  • S2 Iterator tag
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10122460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档