【问题标题】:problem with iterate over java.util.Map using "JSF" OR JSTL TAGS使用“JSF”或 JSTL TAGS 迭代 java.util.Map 的问题
【发布时间】:2010-11-30 11:09:25
【问题描述】:

我正在使用 Richfaces JSF,我想遍历 Map<Object,Object>。我在 Sun 论坛和其他网站上看到了很多示例,但在我的情况下它不起作用。这是我的 XHTML 代码:

<c:forEach items="#{order.customOptions}" var="option">
    <h:outputText value="this text does not print" />
    <h:outputText value="#{option.value.name}" />
    <h:outputText value="#{option.value.key}" />
</c:forEach>

“订单”对象的类型为Order。 “customOptios”的类型为Map&lt;CustomOption,CustomOptionValue&gt;。当我创建一个 Javascript 警报以打印“#{order.customeOptions}”时,它的内容是正确的,但它甚至没有输入c:forEach loop

更新 1::我尝试了一个列表,但它不起作用。我使用了列表并在其他页面中得到了答案。我也使用a4j:poll 和其他一些ajax 组件,它们有什么问题吗?

<c:forEach items="#{order.food.cusomableOptions}" var="option">
    <h:outputText value="this text does not print" />
    <h:outputText value="#{option.title}" />
</c:forEach>

更新2:这是&lt;h:outputText value="#{order.customOptions}" /&gt;的输出:

{model.CustomOption@be8464=model.CustomOptionValue@14e8ac9, 
 model.CustomOption@1ea0c8b=model.CustomOptionValue@78f4, 
 model.CustomOption@24389c=model.CustomOptionValue@3f0bc0, 
 model.CustomOption@a765c=model.CustomOptionValue@3b34ca, 
 model.CustomOption@95868c=model.CustomOptionValue@199de59}

更新 3: 当我在 rich:column 之外使用它时,它可以工作, 但是当我在 rich:dataTablerich:column 标签中使用它时,它不起作用:

<rich:column>
    <f:facet name="header">
        <h:outputText value="xf" />
    </f:facet>
    <c:forEach items="#{order.customOptions}" var="option">
        <p><h:outputText value="option : #{option.key.title}" /></p>
    </c:forEach>
</rich:column>

【问题讨论】:

  • 不是items="${order.customOptions}" and value="${option....}"吗?
  • 我也使用 ui:repeat 但它不起作用!
  • 我使用 JSF 的次数越多,我就越喜欢 JSTL...
  • @daveb 我也尝试过,但它不起作用:(

标签: java jsp jsf map jstl


【解决方案1】:

如果我需要遍历 Map,我会使用如下帮助类(例如 Entry):

public class Entry {
    private String value;
    private String key;

    public Entry(String value, String key) {
        super();
        this.value = value;
        this.key = key;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

以及将map转为List的方法:

private List<Entry> mapToList(Map<String,String> map) {
    List<Entry> list = new ArrayList<Entry>();
    for(String key: map.keySet()) {
        list.add(new Entry(key, map.get(key)));
    }
    return list;        
}

xhtml:

<ui:repeat var="entry" value="#{bean.list}" varStatus="i">
    <div>#{entry.key} : #{entry.value}</div>
</ui:repeat>

也许这会对你有所帮助……也许不会;)

【讨论】:

    【解决方案2】:

    JSTL 和 JSF 不能像您从源代码中的顺序直观地期望的那样无缝地同步工作。粗略地说,JSTL 首先从上到下处理整个页面,然后将生成的输出(因此,没有任何 JSTL 标记,但带有生成的输出)交给 JSF,JSF 依次处理整个页面再次从上到下。

    在 JSTL 运行时,JSF UIData 组件(如 h:dataTablerich:dataTable)尚未生成任何行,这导致您不会在列中看到来自 c:forEach 的任何内容。

    要解决此问题,您应该使用 JSF 提供的迭代组件,例如 RichFaces 的 a4j:repeat,或 Facelets 的 ui:repeat,或 Tomahawk 的 t:dataList。它们都或多或少与 JSTL c:forEach 相同。

    对于剩余的 JSTL 标签,只有functions 标签库在 JSF 中有用,所有其他标签库在 JSF 环境中都是多余的,因为它要么提供开箱即用的相同功能( JSTL 核心和格式标记库),或者它根本不适合 MVC 思想(JSTL sql 和 xml 标记库)。

    【讨论】:

      【解决方案3】:

      您应该使用等效的 JSF 标记。你试过&lt;a4j:repeat/&gt;吗?

      【讨论】:

        【解决方案4】:

        只需将您的 MAP 转换为 ArrayList,然后使用 h:dataTable 即可解决您的问题。

        【讨论】:

          【解决方案5】:

          也许你不应该混合使用 JSTL:core 标签和 JSF:h 标签。

          问候。

          【讨论】:

          • 我已经将它们混合并得到了答案!但我的问题是迭代地图
          • 遍历 map.entrySet 怎么样?
          【解决方案6】:

          如果连循环都没有进入,那说明地图是空的。

          你可以通过输入类似的东西来诊断它

          <h:outputText value="map size: #{order.customOptions.size()}" />
          

          在循环标记之前,但是您应该真正设置一个像 eclipse 或 Netbeans 这样的 IDE 并在其中运行您的代码,以便您可以使用真正的调试器 - 您将能够更轻松地确定问题并且这样更快。

          【讨论】:

          • tnx 4 你的答案。但我说我看到带有 javascript 警报的 customOptions 内容,这是正确的!当我使用 时,它会打印“map size”并且不会打印 size !我使用 eclipse 和 JBoss Web 开发者插件。
          【解决方案7】:

          This blog 可能会有所帮助,因为在 JSF 上使用 JSTL 标记时会出现一些问题。

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-04
          • 1970-01-01
          • 2014-10-02
          • 2013-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多