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 や itemValue などに使用できます#{user.id}。itemValue に対してレンダリングされるものはすべて、selectOneMenuコンポーネントの値バインディングにプッシュされます。

もう 1 つのヒント: 一般SelectItemに、バッキング 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属性は。を指していCollection<HobbitBean>ます。HobbitBeanは、プロパティのJavaBeans命名規則に準拠する単なる通常のJavaオブジェクト(POJO)です。2行目のvalue属性は、を指しますが、、配列、またはList<HobbitBean>を指すこともできます。3行目から9行目までの属性は、値がPOJOのコレクションであるという事実を利用しています。Collectionjavax.faces.model.DataModel

于 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 に答える