我在循环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,但我得到的结果相同。所以有人在我出错的地方有任何想法吗?
感谢任何输入, 利
答案 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中将某些东西放入请求范围的奇怪方式,但我相信你知道你在做什么!