5

の内部でactionスルーを実行しようとしていますが、以下に示すように、がデータテーブル内に配置されている場合は呼び出されませんcommandButtondataTableactioncommandButton

<h:form>
    <h:dataTable value="#{bean.list}" var="item">
        <h:column>
            <h:commandButton value="submit" action="#{bean.submit}" />
        </h:column>
    </h:dataTable>
</h:form>

から移動するcommandButtondataTableactionは正常に実行されます。データテーブル内にある場合の問題は何commandButtonですか?commandLink同じ問題があります。

4

1 に答える 1

15

この問題は、フォームの送信を処理する HTTP リクエスト中のリストが、フォームの表示リクエスト中とまったく同じでない場合に発生する可能性が#{bean.list}あります。つまり、JSF はリストを繰り返し処理して、押されたボタンを見つけ、そのアクションを呼び出します。

Bean がリクエスト スコープであり、Bean の (ポスト) 構築中にリストが再作成されない場合、またはリストの作成がフォーム送信中に失われたリクエスト スコープ変数に依存している場合、JSF は処理中に空のリストまたはまったく異なるリストを取得します。フォームを送信すると、押されたボタンを見つけることができず、アクションを呼び出すことができません。

最善の解決策は、Bean をビュー スコープに配置し、データ モデルを適切な方法でロードしていることを確認することです。

@ManagedBean
@ViewScoped
public class Bean implements Serializable {

    private List<Item> list;

    @EJB
    private ItemService service;

    @PostConstruct
    public void init() {
        list = service.list();
    }

    // ...
}

以下も参照してください。

于 2011-11-07T12:58:32.290 に答える