Как получить как метку, так и значение из f: selectItems
Я работаю над страницей JSF с раскрывающимся списком на основе List<SelectItem>
:
<h:selectOneMenu value="#{bean.selectedItem}">
<f:selectItems value="#{bean.availableItems}" />
</h:selectOneMenu>
Мне нужно получить как значение и метку текущего выбранного элемента. Прямо сейчас я получаю только стоимость. Как я могу получить ярлык?
Ответы
Ответ 1
Вы не можете. Это как раз то, как работает 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, представляющий объект, и установку всего объекта как значения через конвертер.
См. также:
Ответ 2
Вместо использования Map я пробовал вот так, и он отлично работает для меня, чтобы получить как ItemValue, так и ItemLabel в том же свойстве, используя атрибут ItemValue в теге selectItems. Как бы то ни было, никаких дополнительных запятых в ItemLabel(@asfas....i имел ту же проблему, о которой упомянул, поэтому я выбрал этот подход).
<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 является строковым типом в Bean компании
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;
}
}
Ответ 3
Что делать, если значение должно быть целым и меткой String, и оба необходимы для поддержки bean. Использование карты в bean не работает, потому что JSF интерпретирует ключ карты как метку. В идеале это будет LinkedHashMap и поиск текста по номеру.
Кажется, что он перевернулся на поисковый номер (значение) текстом (клавишей). Что делать, если какая-то реализация JSF по какой-то причине добавляет дополнительное пространство для проверки или изменения кода письма. Тогда значение не найдено на карте.
Ответ 4
Следующий подход также может быть полезен при получении значения и метки с помощью List <SelectItem> :
Здесь, facade, statesFacade выбирает список состояний из базы данных/предприятия bean.
В представлении (страница 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}"/>
В управляемом Bean (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();
}
}