2012-01-04 7 views
5

Primefacesウィザードコンポーネントを使用しています。あるタブでは、以前のタブ入力(ユーザータイプ)に基づいて入力ボックスを動的に作成しています。入力ボックスのテキストラベルは、リストから派生したものです。私のバッキングビーンでは、キーとしての入力ラベルと値としての入力ボックス入力を含むマップを持っています。ウィザードを使用している場合、入力ボックス値をバッキングBeanプロパティのマップ値にバインドする方法

次、私は、ユーザー入力で更新されるマップ(値)(キーに対応)

<c:forEach items="#{gdsiGeodataBean.actionCommand.fields}" var="reqs"> 
    <h:outputLabel for="#{reqs.name}" value="#{reqs.name}:* " /> 
    <pou:inputText value="#{gdsiGeodataBean.actionCommand.values['reqs.name']}" required="true" requiredMessage="Input is required."/> 
</c:forEach> 

私のバッキングBeanたいクリック:私は基本的に

private List<RequiredParam> fields; // +getter (no setter required) 
private Map<String, String> values; // +getter (no setter required) 

public CommandAction(String actionName, String actionParams, String context) { 
    this.actionName = actionName; 
    this.actionParams = actionParams; 
    this.contextName = context; 

    //Set up parameters 
    getRequiredParams(); 
    getOptionalParams(); 
    fields = getFields(); 
    values = new HashMap<String, String>(); 
} 

をテキスト入力ボックスからのユーザ入力によってマップ値が更新されることが望ましい。

+0

私はこの例に従っていました。私はこの例に従っていました。http://stackoverflow.com/questions/7010256/how-to-dynamically-build-a-back-bean-edit-form – algone

+0

FlowListenerイベントを追加してみてください'flowListener ="#{managedBean.onFlowListener} "。 これが発生していない場合は、例外や検証を受けていないことを確認してくださいエラーが発生しました。ポストバックの検証フェーズ中にエラーが発生しました。 –

+0

@maple_shaft私は既に私の見解を持っています。 algone

答えて

12

入力値をマップにバインドする方法は完全に正しいとは限りません。

<pou:inputText value="#{gdsiGeodataBean.actionCommand.values['reqs.name']}" required="true" requiredMessage="Input is required."/> 

あなたは固定マップキーの代わりに、現在#{reqs}反復に基づく動的マップキーを指定しています。このようにして、提出されたすべての値は、同じ固定マップキー"reqs.name"になります。これにより、マップ内の最後のフィールドの値だけを取得できるように、それぞれが互いにオーバーライドされます。

本当に動的なキーにするには、これらの単一引用符を削除する必要があります。あなたの質問にあるように使用されるときに、このアプローチが機能するにもかかわらず、具体的な質問への

<pou:inputText value="#{gdsiGeodataBean.actionCommand.values[reqs.name]}" required="true" requiredMessage="Input is required."/> 

無関係

<c:forEach>は、特定の状況で失敗します。例えば。複合コンポーネントまたは反復JSFコンポーネントの内部で使用される場合むしろ代わりに <ui:repeat>を使用してください。参照してください JSTL in JSF2 Facelets... makes sense?

+1

'actionCommand.values'では、本当にバインドされたプロパティであるゲッターとセッターが必要ですか? OPは彼のコードでこれを示していませんでしたが、真に私が知りませんでしたので、前に 'c:forEach'コンポーネントを使ったことはありませんでした。 –

+2

@maple_shaft:getterのみgetValues()が必要です。地図/リストではセッターは不要です。 JSF ELは取得したマップ/リストの値をin EL指定のキー/インデックスで設定します。 'gdsiGeodataBean.getActionCommand()。getValues()。put(reqs.getName()、newValue)'のようにします。これは、それが ''、 ''などの中にあるかどうかにかかわらずです。 – BalusC

+0

その説明をありがとう、それは今意味があります! –

関連する問題