【问题标题】:Troubles Iterating Over A HashMap with JSF, MyFaces & Facelets使用 JSF、MyFaces 和 Facelets 遍历 HashMap 的麻烦
【发布时间】:2009-05-12 12:34:11
【问题描述】:

我在遍历 HashMap 以将其值打印到屏幕时遇到了一些麻烦。有人可以仔细检查我的代码,看看我做错了什么。我似乎找不到任何问题,但一定有什么问题。

在一个 servlet 中,我将以下内容添加到请求中:

Map<String, String> facetValues = new HashMap<String, String>();
// Filling the map
req.setAttribute(facetField.getName(), facetValues);

在一种情况下,“facetField.getName()”的计算结果为“纪律”。所以在我的页面中,我有以下内容:

<ui:repeat value="${requestScope.discipline}" var="item">
  <li>Item: <c:out value="${item}"/>, Key: <c:out value="${item.key}"/>, Value: <c:out value="${item.item}"/></li>
</ui:repeat>

循环运行一次,但所有输出都是空白的?!?如果它在循环中循环一次,我至少会预料到 item 中的某些东西。检查 Facelets 的调试弹出窗口,纪律在那里并且在循环中。将它打印到屏幕上会产生一些对我来说看起来像地图的东西(我已经缩短了输出):

{300=0, 1600=0, 200=0, ... , 2200=0}

我也尝试过使用 c:forEach,但我得到了相同的结果。那么有人知道我哪里出错了吗?

感谢您的任何意见, 李

【问题讨论】:

  • 您能否澄清一下:您是否看到地图中每个项目的“Item:, Key:, Value:”(但实际值没有打印出来)?
  • 不是每个值。循环只迭代一次。但我很确定我将正确的 HashMap 传递到循环中。

标签: java jsf facelets myfaces


【解决方案1】:

有了 el 2.2 支持,您可以像下面那样迭代地图。

<ui:repeat value="#{myBean.stats.keySet().toArray()}" var="x">
    <h:outputText value="#{myBean.stats.get(x)}" /><br />
</ui:repeat>

【讨论】:

  • Cheers Berkay,为我省去了很多麻烦。
【解决方案2】:

&lt;ui:repeat&gt; 只接受 List 或 DataModel,不接受 Sets 或 Maps。这是 JSF 2.1 的路线图。

【讨论】:

    【解决方案3】:

    我想到了三件事:

    1.

    documentation for ui:repeat 没有说它(它只说 List),但我看到 UIRepeat 使用DataModel 作为它的模型(以 h:dataTable 的方式)。 Map 不会自动用 DataModel 类型包装 - 该类型不受隐式支持。您需要将该值设为您自己的 DataModel 实现的实例,或者将它们作为隐式支持的类型提供(例如 java.util.List)。

    2.

    我不确定您打算将这些值映射到什么:

    ${item}
    ${item.key}
    ${item.item}
    

    如果您将“纪律”更改为 List> 类型,则可以绑定到 key and value 属性:

    ${item.key}
    ${item.value}
    

    您可以像这样创建您的列表:

    Map<String, String> facetValues = new HashMap<String, String>();
    // Filling the map
    List<Map.Entry<String, String>> discipline
            = new ArrayList<Map.Entry<String, String>>(facetValues.entrySet());
    

    3.

    FAQ suggests JSTL 标记仅在组件树创建时进行评估。我不清楚使用 c:out 作为 ui:repeat 的子级是否可以正常工作。您可能需要改用 h:outputText 。 (当然,我可能错了 - 我没有尝试过。)


    在一个 servlet 中,我将以下内容添加到请求中

    这听起来像是在 JSF 中将某些内容放入请求范围的奇怪方式,但我相信您知道自己在做什么!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多