2

ユーザーをレコード付きのdataTableから編集ページにリダイレクトしているため、RequestScoped Beanがあります。この dataTable には、削除ボタンがあります。

<p:column>
    <p:commandButton update=":deleteNewsDialog" oncomplete="deleteNewsDlg.show()" icon="ui-icon-closethick">
        <f:setPropertyActionListener value="#{news}" target="#{newsBean.news}" />
    </p:commandButton>
</p:column>

ダイアログは次のとおりです。

<p:confirmDialog id="deleteNewsDialog" message="Czy na pewno chcesz usunąć wiadomość o tytule &quot;#{newsBean.news.title}&quot;?"
    header="Usuwanie wiadomości" severity="alert"
    widgetVar="deleteNewsDlg" appendToBody="true">
    <h:form>
        <p:commandButton value="Usuń" actionListener="#{newsBean.delete}" update=":newsesTableForm:newsesTable, :newsesTableForm:newsGrowl"/>
        <p:commandButton value="Anuluj" oncomplete="deleteNewsDlg.hide();"/>
    </h:form>
</p:confirmDialog>

newsBean.delete が起動されると、newsBean が存在しなくなるため、多くの醜い検証例外が発生します。ViewScoped Bean を使用したこのようなページが他にもあり、魅力的に機能しています。ヘルプ?

4

1 に答える 1

5

リクエスト スコープの Bean の有効期間は、1 つの HTTP リクエスト/レスポンスだけです。したがって、フォームを使用してビュー全体を取得することは、すでに 1 つの HTTP 要求/応答です。リクエスト スコープの Bean は、レスポンスの最後まで破棄されます。ビューで ajax リクエストを発行すると、基本的に新しい HTTP リクエストが送信されます。したがって、これにより、HTTP 応答の終わりまでに破棄される新しい要求スコープ Bean が作成されます。したがって、同じビューに対するすべての ajax リクエストは、独自のリクエスト スコープ Bean インスタンスを取得します。

ビューに関連するデータを維持する必要がある場合、これは望ましくありません。代わりに、Bean をビュー スコープに配置する必要があります。nullajax と returnまたはvoidin action リスナー メソッドによって同じビューを操作している限り、Bean は存続します。を返すとString、空の場合でもビューが再作成されるため、ビュー スコープの Bean は破棄されることに注意してください。

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

于 2012-05-05T17:53:17.630 に答える