2011-05-03 49 views
2

我想将默认值设置为h:selectOneMenu。但是,它不起作用。如何将默认值设置为<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; 
} 

回答

3

一些可能的解决方案:

1)设置的类型selectItems改为SelectItem[],而不改为List

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

或我的最爱,3)制作一个VersionConverter,知道如何将Version对象转换为字符串。以下示例说明如果您的Version对象在数据库中持久存在且具有Id。在构建完成之后,您的selectedItem和List selectItems应该具有typ(和List),而不是String。 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()); 
    } 
} 
+0

您好弗兰克先生更换

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

,谢谢你的回复。我会尝试这个解决方案。 – neni 2011-05-04 05:34:09

4

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

通过

selectedItem = v1.getVersion(); 
+0

嗨BalusC,我已经改变了它,就像你说的。但是,没有运气。我正在打印selectedItem。它正在打印所选的一个,但不是设置值。 – neni 2011-05-04 05:31:09