使用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中将某些东西放入请求范围的奇怪方式,但我相信你知道你在做什么!