1

私は、JSF 2.0 と Richfaces 4 を使用するアプリケーションに取り組んでいます。このアプリケーションは、要素を表示する多くのテーブルと、もちろん通常の表示/編集/削除オプションで構成されています。いくつかのSOブラウジングとGoogle検索の後、見つけた回答では問題が解決しなかったため、質問を投稿することにしました。

現在、要点を言えば、リクエスト Bean に格納されている特定の属性を処理するときに、アプリケーションで問題が発生し、特定の時点で、連続するリクエストが原因で失われます。

たとえば、オブジェクトを編集したい場合、オブジェクトはフォームにデータを表示するリクエスト Bean に送信 (f:propertyActionListener) され、リクエストが終了すると破棄されます。保存すると、新しいオブジェクトが作成され、フォームの属性がそれに設定され、ID がないため (JPA + Hibernate)、アイテムは更新される代わりに保存されます。

私は多くのオプションを調査しましたが、これまでに行ったことと結果は次のとおりです。

f:param + h:link または h:commandLink: @ManagedProperty を使用すると、param が null であり、JNDI を介して検索するコンテキストでそれを見つけることができません。

f:setPropertyActionListener + h:commandLink + Request Bean:動作しますが、一部のデータが失われています。データを表示するフォームには条件付きでレンダリングされたフィールドがいくつかあり、その情報を保持できないため、検証フェーズで無効なデータが見つかった場合、フォームが混乱します。

f:viewParam + h:commandLink + View Scoped Bean:ここに奇妙なものがあります。Bean はクリーンであるため、フォームは情報なしでレンダリングされるため、フォームをレンダリングする前に Bean が破棄されるように見えるため、これは直接機能しません。

セッション Bean の使用:魅力的に機能しますが、JSF ライフサイクルについてまだ学んでいるという理由だけで、すべてのフォームに対してセッション Bean を作成したくはありません。適切な方法で作成したいと考えています。

リクエスト セッション アプローチを維持したい場合、パラメータ (オブジェクトまたはプレーン文字列のいずれか) を保存し、後でリクエスト Bean で取得する方法はありますか?

これが役立つかどうかはわかりませんが、ui:insert と ui:define を介してマスター ページを使用しています。

4

1 に答える 1

1

ビュー スコープ Bean を使用します。それはうまくいくはずです。そこに記載されている問題は、それを JSTL タグidまたはbinding属性にバインドしていることを示唆しています。ビュー スコープの Bean でそれを行うべきではありません。@ViewScopedタグ ハンドラの失敗も参照してください。別の考えられる原因は@Named、JSF の代わりに CDI を使用して Bean を管理していることです@ManagedBean@ManagedPropertyまた、JSF によって Bean を管理する必要があるため、試みの 1 つで機能しない理由も説明できます@ManagedBean

マスター/詳細ページのアプローチに関しては、テーブル ページ<h:link>で with<f:param>を使用して、マスター ページに表示/編集リンクを作成します。

例えばuser/list.xhtml

<h:dataTable value="#{userList.users}" var="user">
    <h:column>#{user.id}</h:column>
    <h:column>#{user.name}</h:column>
    <h:column>
        <h:link value="Edit" outcome="edit">
            <f:param name="id" value="#{user.id}" />
        </h:link>
    </h:column>
</h:dataTable>

Bean はリクエストスコープのみにすることができます。

次に、詳細ページ (この場合は編集ページ) で、 を使用<f:viewParam>して as を変換、検証、および設定しidますUser

例えばuser/edit.xhtml

<f:metadata>
    <f:viewParam name="id" value="#{userEdit.user}"
        converter="#{userConverter}" converterMessage="Bad request. Unknown user."
        required="true" requiredMessage="Bad request. Please use a link from within the system." />
</f:metadata>

<h:messages />
<h:link value="Back to all users" outcome="users" />

<h:form id="user" rendered="#{not empty userEdit.user}">
    <h:inputText value="#{userEdit.user.name}" required="true" />
    ...

    <h:commandButton value="Save" action="#{userEdit.save}">
        <f:ajax execute="@form" render="@form" />
    </h:commandButton>
</h:form>

Bean を使用し@ViewScopedて、データ、サービス、およびアクション メソッドを保持します。

@ManagedBean
@ViewScoped
public class UserEdit {

    private User user;

    @EJB
    private UserService service;

    public String save() {
        service.save(user);
        return "users";
    }

    // Getter+setter.
}
于 2012-04-27T04:34:14.483 に答える