我在SO上看到了一些其他的例子,讨论了一些奇怪的变通方法,但似乎没有一个是有效的,它们都是在JSF 2之前的版本中解决的。那么,是否有可能简单地输出映射的键呢?我尝试了ui:repeat和c:forEach,但没有成功:
<c:forEach items="${myBean.myMap.keySet}" var="var">
<h:outputText value="#{var}"/>
</c:forEach>
从你的代码:
<c:forEach items="${myBean.myMap.keySet}" var="var">
这是行不通的。这需要Map
接口上的getKeySet()
方法,但是没有。
如果你的环境支持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
和array。<c:forEach>
和<ui:repeat>
之间的区别在于,<c:forEach>
在视图构建时生成多个JSF组件,而<ui:repeat>
创建一个JSF组件,在视图呈现时多次生成HTML输出。
输出映射键的正确语法是:
<ui:repeat value="#{myBean.myMap().keySet().toArray()}" var="var">
<h:outputText value="#{var}"/><br/>
</ui:repeat>