Как получить метку и значение из f: selectItems - PullRequest
17 голосов
/ 29 июня 2010

Я работаю над страницей JSF с раскрывающимся списком на основе List<SelectItem>:

<h:selectOneMenu value="#{bean.selectedItem}">
    <f:selectItems value="#{bean.availableItems}" />
</h:selectOneMenu>

Мне нужно получить и значение и метку текущего выбранного элемента. Прямо сейчас я получаю только значение. Как я тоже могу получить этикетку?

Ответы [ 5 ]

45 голосов
/ 29 июня 2010

Вы не можете. Вот так работает HTML. Вы знаете, JSF является генератором HTML-кода. JSF <h:selectOneMenu> генерирует HTML <select><option>. Элемент HTML <select> будет отправлять только атрибут value выбранного элемента <option>. Он не отправит свой ярлык.

Но это не должно быть большой проблемой. Вы уже знаете как значение, так и метку на стороне сервера, внутри #{bean.availableItems}. Все, что вам нужно сделать, чтобы получить связанную метку, это получить ее по значению в качестве ключа. Я предлагаю сделать это Map, что, в свою очередь, также может быть использовано в f:selectItems.

Базовый стартовый пример:

public class Bean {
    private String selectedItem; // +getter +setter
    private Map<String, String> availableItems; // +getter

    public Bean() {
        availableItems = new LinkedHashMap<String, String>();
        availableItems.put("value1", "label1");
        availableItems.put("value2", "label2");
        availableItems.put("value3", "label3");
    }

    public void submit() {
        String selectedLabel = availableItems.get(selectedItem);
        // ...
    }
}

с

<h:selectOneMenu value="#{bean.selectedItem}">
    <f:selectItems value="#{bean.availableItems.entrySet()}" var="entry"
        itemValue="#{entry.key}" itemLabel="#{entry.value}" />
</h:selectOneMenu>

и в результате

<p>Selected label is #{bean.availableItems[bean.selectedItem]}</p>

Альтернативой является завершение имени и значения в javabean-объекте, представляющем сущность, и установка целого объекта как значения через преобразователь.

Смотри также:

4 голосов
/ 30 сентября 2012

Вместо использования карты я попробовал вот так, и у меня отлично получается получить ItemValue и ItemLabel в одном и том же свойстве, используя атрибут «ItemValue» в теге selectItems. Как никогда не предоставлялось никаких дополнительных запятых в ItemLabel ( @ asfas .... У меня была та же проблема, о которой вы упоминали, поэтому я выбрал этот подход ).

<h:selectOneMenu  value="#{company.issueDesc}"   required="true" onchange="submit()">
     <f:selectItem itemLabel="-- Select a Issue -- " itemValue="0"/>  
     <f:selectItems value="#{company.issueList}" var="model" itemLabel="#{model.IssueDesc}" itemValue="#{model.Code},#{model.IssueDesc}" >
      </f:selectItems>
</h:selectOneMenu>

В основном IssueDesc - это тип String в бобовой компании

    public Class Company{

      private String issueDesc;    // getters and setters
      private int code;  // getters and setters
      private List<T>issueList; // getters and setters.


         public void getLblandVal(){

           String desc=getIssueDesc();
           String[] str_ary=desc.split(",");
           String s1=str_ary[0];
           String s2=str_ary[1];
          // parse **s1** to int;
    }


}
2 голосов
/ 09 февраля 2011

Что, если значение должно быть Integer и меткой String, и оба необходимы в компоненте поддержки. Использование Map в bean не работает, потому что JSF интерпретирует ключ карты как метку. В идеале это будет LinkedHashMap и поиск текста по номеру.

Кажется с ног на голову, чтобы найти номер (значение) по тексту (ключ). Что если некоторая реализация JSF по какой-либо причине добавляет дополнительное пространство для проверки или изменения регистра букв. Тогда значение не найдено из карты.

1 голос
/ 29 марта 2018

Это сделает свое дело.

private String getLabel(List<SelectItem> list, String selection) {
    String label = "";
    for (int i = 0; i < list.size(); i++) {
        if(selection.equals((String)list.get(i).getValue())) {
            label = (String)list.get(i).getLabel();
            break;
        }
    }

    return label;
}

В вашем примере вы передали бы availableItems как «список» и selectedItem как «выбор». Этот метод вернет значение метки, соответствующее selectedItem.

1 голос
/ 19 апреля 2014

Следующий подход также может быть полезен при получении значения и метки с использованием Список :
Здесь, фасад, StatesFacade извлекает список состояний из базы данных / корпоративного компонента.

Просмотр (страница в формате xhtml):

    <h:selectOneMenu id="statesSelectUi" value="#{applicationBean1.state}">
        <f:selectItems value="#{applicationBean1.stateSelectItems}"/>
        <f:ajax render="selectedItem" event="change" execute="statesSelectUi"/>
    </h:selectOneMenu>
    <br/>
    <br/>
    <h:outputText id="selectedItem" value="#{applicationBean1.selectedState}"/>

В управляемом компоненте (applicationBean1.java):

private String state;

/**
     * @return the stateSelectItems
     */
    public List<SelectItem> getStateSelectItemsItems() {
        stateSelectItems.add(new SelectItem("-1","--- Select state ---"));
        int statesCount = statesFacade.count();
        List<StateSelectItems> states;
        states = statesFacade.findAll();
        for (int i = 0; i < statesCount; i++) {
            stateSelectItems.add(new SelectItem(states.get(i).getStateSlNo(), states.get(i).getStateName()));
        }
        return stateSelectItems;
    }


       public String getSelectedState(){
       if("".equals(getState()) || getState() ==null){
        return "";
       }else{
        return "Selected State : " + getStateSelectItems.get(Integer.parseInt(getState())).getValue()+", "++ getStateSelectItems.get(Integer.parseInt(getState())).getLabel();
       }
    }
...