#jsf #jsf-2
#jsf ( СПС ) #jsf-2 #jsf
Вопрос:
Я пытаюсь установить значение по умолчанию в h:selectOneMenu. Но это не работает.
Это мой код
index.xhtml
<h:body>
<h:form id="test">
<h:selectOneMenu value="#{selectMenuBean.selectedItem}"
title="select version"
onchange="submit()"
disabled="false" id="combo">
<f:selectItems value="#{selectMenuBean.selectItems}" />
</h:selectOneMenu>
</h:form>
</h:body>
BackingBean
private String selectedItem;
private List selectItems;
private int version=3;
public List getSelectItems() {
List<Version> selectedItems = ExportDao.getVersionsList();
System.out.println("List size: " selectedItems.size());
selectItems = new ArrayList();
for (Version v1 : selectedItems) {
String DATE_FORMAT = "yyyy-MM-dd HH:mm";
//Create object of SimpleDateFormat and pass the desired date format.
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
selectItems.add(new SelectItem(v1.getVersion(), "V" v1.getVersion() "/" sdf.format(v1.getDate())));
if(version = v1.getVersion()) // I have to check the version and set the matching version as selected.
selectedItem = "V" v1.getVersion() "/" sdf.format(v1.getDate());
}
return selectItems;
}
Ответ №1:
Вы устанавливаете selectedItem
с меткой элемента вместо значения элемента.
Заменить
selectedItem = "V" v1.getVersion() "/" sdf.format(v1.getDate());
Автор:
selectedItem = v1.getVersion();
Комментарии:
1. Привет, БалусК, я изменил его, как ты и сказал. По-прежнему, безуспешно. Я печатаю выбранный элемент. Он печатает выбранное, но не устанавливает значение.
Ответ №2:
Несколько возможных решений:
1) Установите тип элементов выбора на SelectItem[]
вместо и нетипизированный List
.
или 2) Попробуйте установить атрибуты var, itemValue и itemLabel для элементов выбора, как показано ниже, и поместить объекты фактической версии в свой список.
или мой любимый, 3) Создайте VersionConverter, который знает, как преобразовать объект Version из строки и в строку. Пример ниже, если ваш объект Version сохраняется в базе данных и имеет идентификатор. После того, как это будет сконструировано, ваши SelectedItem и элементы выбора списка должны иметь типовую версию (и список), а не строку. JSF обработает преобразование самостоятельно.
@FacesConverter(forClass=Version.class)
public class VersionConverter implements Converter{
public VersionConverter() {
}
@Override
public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
if (value == null || value.length() == 0) {
return null;
}
try {
// Get an EJB that can fetch the Version from a DB. Alternativly, do whatever you need to get your object from a string.
InitialContext ic = new InitialContext();
MyDao myDao = (MyDao)ic.lookup(String.format("java:global/%s/MyBean", (String)ic.lookup("java:module/ModuleName")));
return myDao.findEntity(Version.class, getKey(value));
} catch (NamingException e) {
return null;
}
}
Long getKey(String value) {
Long key;
key = Long.valueOf(value);
return key;
}
String getStringKey(Long value) {
StringBuilder sb = new StringBuilder();
sb.append(value);
return sb.toString();
}
@Override
public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
if (object == null) {
return null;
}
if (object instanceof Version) {
Version e = (Version) object;
return getStringKey(e.getId());
}
else
throw new IllegalArgumentException("object " object " is of type " object.getClass().getName() "; expected type: " Version.class.getName());
}
}
Комментарии:
1. Здравствуйте, мистер Франке, спасибо за ответ. Я попробую это решение.