2

我无法使用 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

4 回答 4

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,所以这里的标签和值是相同的。如果它是一个更复杂的对象,例如用户,您可以#{user.name}对 itemLabel 和#{user.id}itemValue 使用类似的对象。为 itemValue 渲染的内容就是被推送到组件的值绑定中的selectOneMenu内容。

另一个提示:一般来说,你应该尽量避免SelectItem在你的 backing bean 中使用该类型。更喜欢简单的域对象和它们的集合,而不是 JSF 特定类型。

于 2011-08-28T16:48:33.073 回答
4

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

价格.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,则必须使用转换器。这里显示了一个示例。

于 2011-08-28T16:05:39.340 回答
0

假设 JSF 2.0,请尝试<f:selectItems>来自官方文档的示例:

<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 属性指向 a Collection<HobbitBean>。HobbitBean 只是一个常规的 Java 对象 (POJO),它的属性符合 JavaBeans 命名约定。第 2 行的 value 属性指向 a List<HobbitBean>,尽管它也可以指向 a Collection、数组或javax.faces.model.DataModel。第 3 行到第 9 行(含)上的属性利用了值是 POJO 集合这一事实。

于 2011-08-28T15:40:49.787 回答
0

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

<h:selectOneMenu>
    <c:forEach items="#{price.typeCode}" var="code">
        <f:selectItem itemValue="#{code}" itemLabel="#{code}"/>
    </c:forEach>
</h:selectOneMenu>
于 2011-08-29T16:16:35.957 回答