在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>
从某种意义上说, map 的值将在选项的value属性中设置,而键将在其标签中设置。
我找到了这个JIRA JIRA 1808,其中解释了必须写错 map 的含义(主要是唯一性),但我不太明白为什么要纠正它
'disruptive and backwards incompatible'.
这是否来自JSF的早期版本?如果是这样,有人知道这样的原因吗?
只是好奇是否有不解决此问题的解释。
最佳答案
最初的推理毕竟很简单:下拉列表标签唯一性的优先级要高于下拉列表标签的唯一性。带有两个相同标签的下拉菜单更像是“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>
也可以看看:
<h:selectOneMenu>
tag info page 关于dictionary - f :selectItem's key and value inverted when feeding from a map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9893556/