0

JSF でドロップダウン ボックスを作成しようとしています。指定された有効な範囲内の数値で埋める必要があります。したがって、指定された範囲がドロップダウン値よりも5 から 20の間である場合の例です。

  "5, 10 15, 20" 

いくつか問題があります。コントローラーでこのようなものを作成し、for ループで値を設定します。

List<Integer> validAmounts  OR
List<String>  validAmounts

それで

  <myapp:selectRowElem id="autoreloadamount"
            type="dropdown" selectItems="#{settingsController.validAmounts}"/>

次のようなエラーが表示されます

itemValue="#{i.value}": String does not have a property 'value'

何か案は?

また、有効な金額を設定するためのより良い「JSF」方法はありますが、コントローラに for ループを作成して validAmounts リストを設定することはできませんか?

myapp:selectRowElem」は長いですが、ドロップダウン用にこれがあります。

 <h:selectOneMenu id="input" value="#{cc.attrs.item}" validatorMessage="#{msg[validatorMsgKey]}">
                            <f:validateRequired disabled="#{cc.attrs.forceRequired ne 'true'}"/>
                            <f:selectItems value="#{cc.attrs.selectItems}" var="i" itemValue="#{i.value}" itemLabel="#{i.label}" />
                        </h:selectOneMenu>
4

1 に答える 1

2

これ、

<f:selectItems value="#{cc.attrs.selectItems}" var="i" itemValue="#{i.value}" itemLabel="#{i.label}" />

は、各項目がループ変数として割り当てられている asList<SomeObject>を想定しており、ループ変数は、項目の値とラベルをそれぞれ返すメソッドを持つことが期待されています。#{cc.attrs.selectItems}SomeObject#{i}getValue()getLabel()

これらのゲッターメソッドIntegerもありません。Stringこれは、 の場合に例外が伝えようとしているものでもありますStringgetValue()メソッドが見つかりませんでした。

は、これらの getter を持つ標準の JSFオブジェクトである#{cc.attrs.selectItems}を期待しList<SelectItem>いるようです。SelectItemjavax.faces.model.SelectItem

したがって、次のようにリストを宣言して作成する必要があります。

List<SelectItem> validAmounts; 

// ...

validAmounts = new ArrayList<SelectItem>();
validAmounts.add(new SelectItem(5));
validAmounts.add(new SelectItem(10));
validAmounts.add(new SelectItem(15));
validAmounts.add(new SelectItem(20));

技術的に有効な代替手段はSomeObject、必要な値を返す getter メソッドのようなカスタム クラスを作成することです。しかし、この車輪の再発明は機能的に単純で不器用なので、お勧めできません。


<portal:selectRowElem>ところで、これは明らかに他の誰かによって開発された複合コンポーネントの少なくとも 2 つの問題を示しています。

  1. には、エンドユーザー (あなた) に正確に期待する値を明確に説明<cc:attribute name="selectItems">するshortDescription属性がありません。を期待していることを伝える必要がありますList<SelectItem>。このようにして、コードのオートコンプリート中に、またはタグのドキュメントをちらりと見るだけで、すぐに気付くはずです。

  2. これらすべてvaritemLabelおよびitemValue属性は完全に不要です。これらはすべて、 aList<SelectItem>が指定された時点ですでにデフォルトになっています。これは、元の複合コンポーネントの開発者が自分が何をしているのかわからなかったことも示しています。

于 2013-10-04T13:17:41.397 に答える