12

我在 SO 上看到了一些其他示例,讨论了一些奇怪的解决方法,但似乎都不起作用,而且它们都在 JSF 2 之前的版本中得到解决。那么,是否可以简单地输出地图的键?我试过 ui:repeat 和 c:forEach 如下所示,但没有成功:

<c:forEach items="${myBean.myMap.keySet}" var="var">
   <h:outputText value="#{var}"/>
</c:forEach>
4

2 回答 2

17

从您的代码:

<c:forEach items="${myBean.myMap.keySet}" var="var">

这是行不通的。这需要接口上getKeySet()方法,但没有。Map

如果您的环境支持 EL 2.2(Servlet 3.0 容器,如 Tomcat 7、Glassfish 3 等),那么您应该直接keySet()调用该方法,而不是将其作为属性调用:

<c:forEach items="#{myBean.myMap.keySet()}" var="key">
    <h:outputText value="#{key}"/>
</c:forEach>

或者,如果您的环境还不支持 EL 2.2,那么您应该直接迭代地图本身,这会在每次迭代时提供一个Map.Entry实例,而该实例又具有一个getKey()方法,所以这也应该这样做:

<c:forEach items="#{myBean.myMap}" var="entry">
    <h:outputText value="#{entry.key}"/>
</c:forEach>

以上都不适用,<ui:repeat>因为它不支持Map也不Set。它只支持List和数组。两者之间的区别在于<c:forEach><ui:repeat><c:forEach>视图构建期间生成多个 JSF 组件,而<ui:repeat>在视图渲染期间创建单个 JSF 组件多次生成其 HTML 输出。

于 2011-11-17T11:23:40.700 回答
10

事实证明,输出映射键的正确语法是:

<ui:repeat value="#{myBean.myMap().keySet().toArray()}" var="var">
   <h:outputText value="#{var}"/><br/>
</ui:repeat>
于 2011-11-17T22:52:35.207 回答