我无法使用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>
答案 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对象(POJO),符合其属性的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>