JSF-2 f: selectItems with Map не отображает itemLabel
Когда я использую f: selectItems для отображения элементов на карте, я не могу отобразить значение элемента Map, только ключ. f: selectItems не использует itemLabel вообще. Когда я использую Список, вместо этого все работает.
Далее используется элемент itemLabel для отображения "описания" элемента в списке:
<h:selectOneMenu>
<f:selectItems value="#{testBB.testList}" var="s"
itemLabel="TEST #{s.description}" itemValue="#{TEST s.name}" />
</h:
selectOneMenu>
Следующая попытка отобразить значение элемента на карте не работает. Он отображает ключ элемента, но не использует атрибут itemLabel, как это можно заметить из-за отсутствия вывода текста "TEST".
<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?
Ответы
Ответ 1
Ваш вопрос звучит, но код делает его запутанным и неоднозначным. Я просто проигнорирую ваш код в этом ответе.
Что касается конкретного вопроса "Как использовать Map
в <f:selectItems>
", вам нужно понять, что ключи карты по умолчанию используются как метки элементов и что значения по умолчанию по умолчанию используются как значения элементов. Вы, кажется, ожидаете, что это будет наоборот (честно говоря, я бы тоже интуитивно ожидал этого, но это было всего лишь дизайнерское решение - ключевой ключ карты уникальности и метки опций должны в перспективе пользовательского интерфейса определенно быть уникальными, но значения опций не обязательно должен быть уникальным).
Итак, это должно быть сделано (обратите внимание, что здесь я использую LinkedHashMap
, поскольку он поддерживает порядок вставки):
map = new LinkedHashMap<String, String>();
map.put("Label 1", "value1");
map.put("Label 2", "value2");
map.put("Label 3", "value3");
с
<f:selectItems value="#{bean.map}" />
Если вы хотите, чтобы они меняли ключи и значения, вы должны перебирать Map#entrySet()
. Это работает только тогда, когда ваша среда поддерживает EL 2.2, поскольку вы должны вызывать ее прямым вызовом метода, поскольку для этого нет никакого getter.
например.
map = new LinkedHashMap<String, String>();
map.put("value1", "Label 1");
map.put("value2", "Label 2");
map.put("value3", "Label 3");
с
<f:selectItems value="#{bean.map.entrySet()}" var="entry"
itemValue="#{entry.key}" itemLabel="#{entry.value}" />
См. также: