【问题标题】:How to set default value to <h:selectOneMenu>如何将默认值设置为 <h:selectOneMenu>
【发布时间】:2011-05-03 05:11:19
【问题描述】:

我正在尝试将默认值设置为 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;
}

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    您正在使用项目标签而不是项目值设置selectedItem

    替换

    selectedItem = "V" + v1.getVersion() + "/" + sdf.format(v1.getDate());
    

    通过

    selectedItem = v1.getVersion();
    

    【讨论】:

    • 嗨,BalusC,我已经按照你说的那样改变了它。尽管如此,还是没有运气。我正在打印 selectedItem。它正在打印所选的,但是,它没有设置值。
    【解决方案2】:

    一些可能的解决方案:

    1) 将 selectItems 的类型设置为SelectItem[],而不是未键入的List

    或 2) 尝试设置 selectItems 的 var、itemValue 和 itemLabel 属性,如下所示,并将实际的 Version 对象放入列表中。

    或者我最喜欢的,3) 制作一个知道如何将版本对象从字符串转换为字符串的 VersionConverter。下面的示例,如果您的 Version 对象保存在数据库中并具有 Id。构建完成后,您的 selectedItem 和 List selectItems 应该具有典型的版本(和列表),而不是字符串。 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());
        }
    }
    

    【讨论】:

    • 弗兰克先生您好,感谢您的回复。我会试试这个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2020-12-14
    相关资源
    最近更新 更多