6

在 JSF 的标签中,如果您使用Map<Key, Value>

<h:selectOneMenu value="#{bean.integerProperty}">
  <f:selectItems value="#{bean.mapProperty}"/>
</h:selectOneMenu>

生成的 HTML 将与预期相反

<select>
  <option selected="selected" value="MapValue1">MapKey1</option>
  <option value="MapValue2">MapKey2</option>
  <option value="MapValue3">MapKey3</option>
</select>

从某种意义上说,地图的值将在选项的 value 属性中设置,而键将在其标签中设置。

我发现这个 JIRA JIRA 1808解释了必须编写错误地图的含义(主要是唯一性),但不太明白为什么要纠正这个问题

'破坏性和向后不兼容'。

这是否来自 JSF 的早期版本?如果是这样,有人知道它是否有理由这样吗?

只是好奇是否有解释不能解决这个问题。

4

1 回答 1

11

最初的推理毕竟相当简单:下拉标签比下拉值具有更高的唯一性优先级。具有两个相同标签的下拉菜单更像是“wtf?” 对于最终用户,而不是具有两个相同值的下拉列表。映射键确保唯一性。我确实曾经在您自己链接的问题报告中报告过技术上的不直观性。但是,这是一个 WONTFIX。如果在 JSF 2.2 中进行更改,它将不再与 JSF 2.0 / 2.1 向后兼容。

如果您的环境支持 EL 2.2(Tomcat 7、Glassfish 3 等),您可以轻松地交换它,如下所示:

<h:selectOneMenu value="#{bean.integerProperty}">
  <f:selectItems value="#{bean.mapProperty.entrySet()}" var="entry" 
     itemValue="#{entry.key}" itemLabel="#{entry.value}" />
</h:selectOneMenu>

也可以看看:

于 2012-03-27T16:26:45.143 回答