f:selectItems を使用して Map 内の項目を表示すると、Map 項目の値を表示できず、キーのみが表示されます。f:selectItems は itemLabel をまったく使用しません。代わりにリストを使用すると、うまくいきます。
次の例では、itemLabel を使用して、リスト内のアイテムの「説明」を表示します。
<h:selectOneMenu>
<f:selectItems value="#{testBB.testList}" var="s"
itemLabel="TEST #{s.description}" itemValue="#{TEST s.name}" />
</h:
selectOneMenu>
Map 内のアイテムの値を表示しようとする次の試みは機能しません。アイテムのキーを表示しますが、「TEST」テキストの出力がないことからわかるように、itemLabel 属性を使用しません。
<rich:select>
<f:selectItems value="#{testBB.testMap}" var="s"
itemLabel="TEST #{s.value}" itemValue="TEST #{s.key}" />
</rich:select>
使用される単純なバッキング Bean は次のとおりです。
public class TestBB {
private Map<String, String> testMap;
private List<TestItem> testList;
public TestBB() {
testMap = new HashMap<String, String>();
testMap.put("1_key", "Item One");
testMap.put("2_key", "Item Two");
testMap.put("3_key", "Item Three");
testList = new ArrayList<TestItem>();
testList.add( new TestItem("name_1", "description_1") );
testList.add( new TestItem("name_2", "description_2") );
testList.add( new TestItem("name_3", "description_3") );
}
public Map<String, String> getTestMap() {
return testMap;
}
public List<TestItem> getTestList() {
return testList;
}
}
では、これを機能させる方法、つまり selectItems でマップを効果的に使用する方法についてのアイデアはありますか?