3

我在遍历 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>

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

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

我也尝试过 ac:forEach 但我得到了相同的结果。那么有人知道我哪里出错了吗?

感谢您的任何意见,李

4

3 回答 3

12

使用 el 2.2 支持,您可以迭代如下地图。

<ui:repeat value="#{myBean.stats.keySet().toArray()}" var="x">
    <h:outputText value="#{myBean.stats.get(x)}" /><br />
</ui:repeat>
于 2012-06-07T14:40:59.567 回答
10

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

于 2010-08-18T18:22:21.720 回答
1

我想到了三件事:

1.

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

2.

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

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

如果将“学科”更改为List<Map.Entry<String,String>>类型,则可以绑定到键和值属性:

${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.

FAQ 建议仅在组件树创建时评估 JSTL 标记。我不清楚使用 c:out 作为 ui:repeat 的子级是否可以正常工作。您可能需要改用 h:outputText 。(当然,我对此可能是错的 - 我没有尝试过。)


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

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

于 2009-05-12T13:50:58.550 回答