使用JSF,MyFaces&和Ishaces对HashMap进行迭代的麻烦Facelets的

时间:2009-05-12 12:34:11

标签: java jsf facelets myfaces

我在循环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>

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

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

我也尝试过使用c:forEach,但我得到的结果相同。所以有人在我出错的地方有任何想法吗?

感谢任何输入, 利

3 个答案:

答案 0 :(得分:12)

如果支持el 2.2,您可以迭代下面的地图。

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

答案 1 :(得分:10)

<ui:repeat>仅接受List或DataModel,而不接受Sets或Maps。这是JSF 2.1的路线图。

答案 2 :(得分:1)

我发生了三件事:

1

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

2

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

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

如果您将“training”更改为 List&lt; Map.Entry&lt; String,String&gt;&gt; 类型,则可以绑定到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

仅在组件树创建时评估JSTL标记的FAQ suggests。我不清楚是否使用c:out作为ui的孩子:重复将正常工作。您可能需要使用h:outputText。 (我当然可能错了 - 我还没试过。)


  

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

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