4

Primefaces データテーブルに新しい行を追加しようとしています。次に、このテーブルの内容を送信して、いくつかのビジネス ロジックを実行したいと考えています。データテーブル モデルは、ViewScoped マネージド Bean で維持されるコレクションです。

Primefaces 3.3 で JSF 2.1 を使用しています。

短い例:

    <h:form id="my-form">
        <p:dataTable value="#{testBean.list}" var="s" id="datatable">
            <p:column>
                <h:inputText value="#{s}"/>
            </p:column>
            <f:facet name="footer">
                <p:commandButton value="Add row" action="#{testBean.addRow()}" process="@form" update="@form" immediate="true" />
                <p:commandButton value="Do stuff" action="#{testBean.doSomeLogic()}" process="@form" update="@form"/>
            </f:facet>     
        </p:dataTable>
    </h:form>

マネージド Bean:

@ManagedBean
@ViewScoped
public class TestBean implements Serializable {

private List<String> list;

public TestBean() {
}

@PostConstruct
public void init() {
    list = new ArrayList<String>();
    list.add("one");
    list.add("two");
}

public void addRow(){
    list.add(new String());
}

public void doSomeLogic(){
    for (String string : list) {
        System.out.println(string);
    }
}

// getters and setters

}

実際に何が起こるか:

  • ユーザーが「行の追加」ボタンをクリックすると、新しい行が追加されます (すぐに真になる必要があるため、検証は行われません。これらのフィールドはより大きなフォームの一部です)。
  • ユーザーが「do stuff」をクリックすると、コレクションは適切なサイズ (新しい行を含む) になりますが、ユーザーの入力は考慮されません (既存の行への変更も、新しく追加された行の新しい値もありません)。

新しい値も送信するにはどうすればよいですか? 私は JSF を始めたばかりで、すでに 100% 理解できているかどうかわかりません。

ご協力いただきありがとうございます。

可能な重複:

編集: Jitesh のおかげで問題は解決しました。実際の例は次の場所にあります: JSF2、JSF コンポーネントを動的に追加できますか?

4

2 に答える 2

2

唯一の問題は、inputText で不変オブジェクトを使用していることです。これを理解するには、BaluCの回答をチェックしてください

それによると、「不変オブジェクトであるため、文字列にはセッターメソッドがありません。入力された値を設定することはできません。」

commandButton から immediate 属性を削除してみてください。各行の挿入時にデータがクリアされることがわかります。

于 2013-04-30T19:02:56.377 に答える
0

私の理解が正しければ、フォームの他の場所で失敗している検証がいくつかあります。送信されたフォーム値のいずれかが検証に失敗すると、immediateが使用されない限り、送信された値はマネージド Bean に適用されません。doStuffこれが、メソッドではなく、新しい行を追加できるように見える理由です。immediateに追加しませんでしたdoStuff

しかし、もっとクリーンで効率的にできることがいくつかあると述べています。

まず、action属性は実際にはナビゲーション アクションに使用する必要があります。actionJSF は、 にバインドされたメソッドがナビゲーション結果を表す戻り値を持つことを期待しています。voidメソッドについては、 を使用することをお勧めしますactionListener。と の違いの詳細については、こちらactionをおactionListener読みください:アクションとアクションリスナーの違い

第 2 に、データ テーブル コンポーネントのみにprocessandupdateを設定して、他のフォームの検証について心配する必要がないのはなぜですか? 次に例を示します。

<h:form id="my-form">
    <p:dataTable value="#{testBean.list}" var="s" id="datatable">
        <p:column>
            <h:inputText value="#{s}"/>
        </p:column>
        <f:facet name="footer">
            <p:commandButton value="Add row" actionListener="#{testBean.addRow}"
               process=":my-form:datatable" update=":my-form:datatable" />
            <p:commandButton value="Do stuff" actionListener="#{testBean.doSomeLogic}"
               process=":my-form:datatable" update=":my-form:datatable" />
        </f:facet>
    </p:dataTable>
</h:form>
于 2013-04-29T11:35:12.070 に答える