在facelets JSF 2中输出地图集合

时间:2011-11-17 04:37:28

标签: jsf map jsf-2 facelets uirepeat

我在SO上讨论了一些其他的例子,讨论了一些奇怪的解决方法,但似乎都没有工作,它们都是在JSF 2之前的版本中解决的。因此,它可以简单地输出映射的键吗?我尝试过ui:repeat和c:forEach就像下面没有运气一样:

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

2 个答案:

答案 0 :(得分:17)

从你的代码:

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

这不起作用。这需要the Map interface上的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 instance,而getKey() method也是如此,所以这应该做以及:

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

上述内容均不适用于<ui:repeat>,因为它不支持MapSet。它仅支持List和数组。 <c:forEach><ui:repeat>之间的区别在于<c:forEach>在视图构建期间生成多个JSF组件的方式,<ui:repeat>创建了一个生成其HTML的JSF组件在视图渲染时间内多次输出。

答案 1 :(得分:10)

事实证明输出地图键的正确语法是:

<ui:repeat value="#{myBean.myMap().keySet().toArray()}" var="var">
   <h:outputText value="#{var}"/><br/>
</ui:repeat>