2011-08-28 58 views
2
的项目

我无法使用Java集合中的预定义数据填充JSF组合框。JSF组合框:显示来自Collection

后端,简单的存根集合:

PriceRecord pr = new PriceRecord(); 
pr.setTypeCode(Arrays.asList(123L,456L)); 

这不起作用,组合框为空:

<h:selectOneMenu value="#{price.typeCode}" var="code"> 
    <f:selectItem value="#{code}"/> 
</h:selectOneMenu> 

回答

0

假设JSF 2.0,尝试<f:selectItems>代替。从official docs例如:

<h:selectOneListbox size="1" id="escape02" value="#{select05NoSelection.initialCollectionValues}"> 
    <f:selectItems value="#{select05NoSelection.hobbitList}" 
       var="n" 
       itemValue="#{n}" 
       itemLabel="#{n.bio}" 
       itemDescription="#{n.description}" 
       itemDisabled="#{n.disabled}" 
       itemLabelEscaped="true" 
       noSelectionValue="#{select05NoSelection.hobbitList[0]}"/> 
</h:selectOneListbox> 

在前面的例子中,线路上的值属性1个指向一个Collection<HobbitBean>。 HobbitBean只是一个普通的Java对象(PO​​JO),它符合JavaBeans对其属性的命名约定。第2行的值属性指向List<HobbitBean>,但它也可以指向Collection,数组或javax.faces.model.DataModel。第3至9行的属性(包括第3到第9行)利用了这个值是POJO集合的事实。

+0

它不是线1和线2之间相当明显的区别:是什么select05NoSelection.initialCollectionValues和select05NoSelection.hobbitList – sergionni

+0

评论更新之间的区别实际上,我对组合有兴趣,但不是在列表框中。 – sergionni

+0

组件的“值”是当前选定的对象,“f:selectItems”的“值”是应出现在列表中的那些值。所有''组件都使用'',包括''。 – meriton

3

我不确定问题到底是什么,但我可以给你一个非常简单的例子,你如何使用<h:selectOneMenu />组件。

price.xhtml:

<h:selectOneMenu id="priceMenu" value="#{priceBean.selectedPrice}"> 
    <f:selectItems value="#{priceBean.prices}" /> 
</h:selectOneMenu> 

PriceBean.java:

.. 
private String selectedPrice; 
.. 
public String getSelectedPrice() { 
    return selectedPrice; 
} 

public void setSelectedPrice(String newPrice) { 
    selectedPrice = newPrice; 
} 
.. 
public List<SelectItem> getPrices() { 
    List<SelectItem> retVal = new ArrayList<SelectItem>(); 

    retVal.add(new SelectItem("2")); 
    retVal.add(new SelectItem("4")); 
    retVal.add(new SelectItem("6")); 

    return retVal; 
} 

有关SelectItem进一步信息。如果您想直接使用特定对象,例如名为Price的对象,则必须使用转换器。 Here an example is shown.

7

您给出的代码似乎没有多大意义。成语更是这样的:

<h:selectOneMenu value="#{backingBean.typeCode}">    
    <f:selectItems value="#{backingBean.typeCodes}" var="typeCode" itemLabel="#{typeCode}" itemValue="#{typeCode}" /> 
</h:selectOneMenu> 

这里,#{backingBean.typeCode}是最初返回表示默认选择的值中的单个值的属性。如果它是空的,最初没有选择任何值。用户提交表单后,会收到用户选择的值。对于您的代码,这将是类型Long

#{backingBean.typeCodes}是返回用户可以选择的所有值的集合的属性。对于你的代码,这将是List<Long>

因为你的值是简单的长整型,所以标签和值在这里是一样的。如果它是一个更复杂的对象,例如一个用户,您可以对itemLabel使用#{user.name},对itemValue使用#{user.id}。无论为itemValue呈现什么,都会将其推送到组件的值绑定中。

另一个暗示:一般来说,你应该尽量避免在你的后备豆中使用SelectItem类型。优先选择简单的域对象及其集合,而不是JSF特定类型。

0

为了使您的页面只是工作,你可以使用c:forEach迭代项目:

<h:selectOneMenu> 
    <c:forEach items="#{price.typeCode}" var="code"> 
     <f:selectItem itemValue="#{code}" itemLabel="#{code}"/> 
    </c:forEach> 
</h:selectOneMenu>