使用JSF,MyFaces和Facelets迭代HashMap的麻烦

我在循环HashMap以将其值打印到屏幕上时遇到一些麻烦。 有人可以仔细检查我的代码,看看我做错了什么。 我似乎找不到任何错误,但必须有一些东西。

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

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

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

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

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

    我也尝试过ac:forEach,但我得到了相同的结果。 所以有人有任何想法我会出错吗?

    谢谢你的任何意见,李

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

    有了2.2支持,您可以迭代下面的地图。

      

    我发生了三件事:

    1。

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

    2。

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

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

    如果将“discipline”更改为List >类型 ,则可以绑定到键和值属性:

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

    您可以像这样创建列表:

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

    3。

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


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

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