Вопрос по el, jsf-2, map, jsf – JSF-2 f: selectItems with Map не отображает itemLabel

15

Когда я использую f: selectItems для отображения элементов на карте, я не могу отобразить значение элемента карты, только ключ. f: selectItems вообще не использует itemLabel. Когда я использую список, вместо этого все работает.

Следующее действительно использует itemLabel для отображения & quot; описания & quot; элемента в списке:

<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>

Используется простой поддерживающий бин:

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)#{TEST s.name} недействителен EL, но он сломает вашList только меню. 2)HashMap по природе неупорядочен, вы должны использоватьLinkedHashMap, но это вызвало бы проблемы только на представлениях. Какую версию / версию JSF вы используете? Кроме того, вы используете<rich:select> вместо<h:selectOneMenu> дляMap меню, это что-то подсказывает? BalusC

Ваш Ответ

1   ответ
39

но код делает его запутанным и неоднозначным. Я просто проигнорирую ваш код в этом ответе.

Что касается конкретного вопроса"How to use Map in <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, поскольку вы должны вызывать его прямым вызовом метода, поскольку для этого нет получателя.

Например.

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}" />
See also: Our selectOneMenu wiki page
@jack: это может произойти, если вы используете<f:selectItem> вместо<f:selectItems>, Берегись множественного числа.
@jack: укажите конвертер enum.
@jack: enum конвертер обязателен, только если у вас естьUISelectMany компонент, который связан сList<Enum> собственность вместоEnum[], Смотрите также среди другихstackoverflow.com/questions/3822058/… а такжеshowcase-omnifaces.rhcloud.com/showcase/converters/…
Вы имеете в виду пользовательский конвертер, аннотированный @FacesConverter, верно? Перечисление отображается правильно ... Так зачем реализовывать метод getAsString?
@BalusC, делает первый путь, но не может приступить к работе ... Запуск Jboss AS 7.1 "java.util.LinkedHashMap не может быть приведен к javax.faces.model.SelectItem & quot;

Похожие вопросы