Как установить значение по умолчанию в

#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. Здравствуйте, мистер Франке, спасибо за ответ. Я попробую это решение.