【问题标题】:How to access ValueStack objects within Struts iterator?如何在 Struts 迭代器中访问 ValueStack 对象?
【发布时间】:2012-04-12 11:16:21
【问题描述】:

我有以下代码:

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

reviews 是包含评论详细信息的评论对象列表,例如评分和用户名称。

我的问题是我无法访问循环内 ValueStack 上的任何对象。

在循环外&lt;s:property value="#request.restaurant.portalImage.url" /&gt; 工作正常。但是在循环中它会打印 null。

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

为什么还是不行?

【问题讨论】:

    标签: java struts2 ognl valuestack


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢,这帮助很大!另一种解决方案是在迭代器之前使用标签 将“外部值”存储在局部变量中,并改为引用此局部变量( 或 ${theRestaurant})。
    【解决方案2】:

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

    <s:iterator value="userCollection">
    
    </s:iterator>
    

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

    <s:property name="userName"/>
    

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

    【讨论】:

    • 顶级对象无关紧要。 # 用于明确指定要解析的对象,无论它是否在顶部。
    【解决方案3】:

    你应该像下面这样改变它:

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

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

    【讨论】:

    • 这是保存当前索引对象供您访问的变量。有关更多信息,请查看此文档。 struts.apache.org/2.0.11/docs/iterator.html
    • 当前索引对象将是列表中的评论对象。我想访问列表之外的东西。存储在请求范围内的餐厅对象。
    • @MonikaMichael 是否要为迭代器中的所有条目映射相同的 URL?
    • 是的,一个餐厅标志,多个评论。
    • 在外面声明一个变量并使用它,而不是每次循环都通过对象图,这更昂贵。
    【解决方案4】:

    我认为它可以解决您的问题

    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>
    

    您的要求有点混乱

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多