我使用的是h:selectOneMenu
,我想获得的不是ID值,而是标签。在后台bean中,我创建了SelectItem
对象,用于加载h:selectOneMenu
。
new SelectItem("id", "label");
视图代码:
<h:selectOneMenu value="#{Metadata.thema}">
<f:selectItems value="#{ThemaBean.themes}" />
<f:valueChangeListener type="com.schober.events.SelectThemaEvent" />
</h:selectOneMenu>
这里的代码用"id"
设置Metadata.thema
,但是我需要设置"label"
。我尝试了label="#{Metadata.thema}"
,但它不适合我。
然后使用标签作为值。使用接受单个参数的SelectItem
构造函数:
new SelectItem("label");
这样,标签将同时用作项值和项标签。
更新你似乎错误地表达了问题和实际上想要得到两者。在这种情况下,只需自己持有ID-label值对的Map
,并通过所选ID从映射中获取标签。
private Map<Long, String> themaIdsAndLabels = new HashMap<Long, String>();
// ...
public void submit() {
String themaLabel = themaIdsAndLabels.get(thema);
// ...
}
您可以重用这个Map
来生成SelectItem
列表,甚至更多,如果您使用JSF 2.0和EL 2.2,您也可以直接在<f:selectItems>
中使用该映射,而无需将其复制到List<SelectItem>
中。
<f:selectItems value="#{bean.themaIdsAndLabels.entrySet()}" var="entry" itemValue="#{entry.key}" itemLabel="#{entry.value}" />
或者,如果您唯一的目的是在输出文本中重新显示标签,您也可以使用
<h:outputText value="#{bean.themaIdsAndLabels[bean.thema]}" />