JSF组合框:显示Collection中的项目

时间:2011-08-28 15:32:52

标签: jsf combobox items

我无法使用Java集合中的预定义数据填充JSF组合框。

后端,简单收集存根:

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

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

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

4 个答案:

答案 0 :(得分: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>

因为您的值是简单的long,所以标签和值在这里是相同的。如果它是一个更复杂的对象,例如对于用户,您可以对itemLabel使用#{user.name}之类的内容,对itemValue使用#{user.id}。无论为itemValue呈现什么,都会被推入selectOneMenu组件的值绑定中。

另一个提示:一般来说,您应该尽量避免在后台bean中使用类型SelectItem。首选简单域对象及其集合,而不是JSF特定类型。

答案 1 :(得分:4)

我不确定究竟是什么问题,但我可以举一个非常简单的例子来说明如何使用<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.

答案 2 :(得分: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行的value属性指向Collection<HobbitBean>。 HobbitBean只是一个常规Java对象(PO​​JO),符合其属性的JavaBeans命名约定。第2行的value属性指向List<HobbitBean>,但它也可以指向Collection,数组或javax.faces.model.DataModel。第3行到第9行的属性(包括端点)利用了值是POJO集合的事实。

答案 3 :(得分:0)

要使您的网页正常工作,您可以使用c:forEach来迭代项目:

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