4

Bean コンストラクターと ViewScope の呼び出しに関する他の質問を見てきましたが、まだ問題があります。私が見ている問題は、アプリケーションの 2 つの特定のページに関係しています。1 つ目は dataTable (現時点ではランダムに生成されたデータで満たされていますが、最終的にはデータベースを呼び出します) です。2 つ目のページはかなり単純な表示ページで、選択した行の情報が編集または表示用のフォームに表示されます。これは私のdetail.xhtmlページです。問題となるのは、このページの Bean です。そのコンストラクターは 2 回呼び出されます。最初にページに移動したとき、もう一度 commandButton を押したときに、変更を送信するかキャンセルするかは関係ありません。detail.xhtml バッキング Bean のコンストラクターが 2 回目に呼び出されます。

私のビーンは@ViewScoped、インポート中javax.faces.bean.ViewScopedです。違いを生む可能性のあるその他の詳細がいくつかありますが、そうである場合、その理由はわかりません。私の UserDetailBean.java はベース Bean から継承されます (私はもともとこれを UIBaseBean.java と呼んでいます)。今、私の UIBaseBean は@RequestScoped. 私が理解しているように、私の UserDetailBean は@ViewScopedであるため、これは違いはありません。間違っている場合は修正してください。

違いを生む可能性のあるその他の詳細は、UIBaseBean と UserDetailBean の両方のコンストラクターでの変数の設定です。ページ上部のツールバーにユーザーの場所を表示したいと考えています。そのために、UIBaseBean に変数を作成しました。

protected String toolbarDescription;

また、UIBaseBean でセッターとゲッターを提供しました。UIBaseBean のコンストラクターで、変数を定義します。

toolbarDescription = "fix me";

この定義は、アプリケーションの特定のページのバッキング Bean の変数をオーバーライドすることを知っているためです。UserDetailBean で、String toolbarDescription に新しい値を割り当てます。この値は、detail.xhtml ページに表示されます。それ以外の場合、私の detail.xhtml ページの Bean は非常に単純で、detail.xhtml ページのフォームにデータを表示するためのプロパティを取得および設定します。

詳細ページは、そこへのナビゲーションがリダイレクトで発生し、(commandButton が押されたときの) ナビゲーションがリダイレクトで発生するように設定されています。リダイレクトの有無にかかわらずfaces-configナビゲーションルール、およびリダイレクトの有無にかかわらず暗黙のナビゲーションを使用してみましたが、 UserDetailBean コンストラクターは常に2回呼び出されます。

ああ、UserDetailBean コンストラクターの toolbarDescription 変数にブレークポイントを設定すると、プログラムが 2 回停止します。つまり、ページが最初に呼び出されたときと、詳細ページで commandButton を押した後でもう一度停止します。

私が説明したことから、私のコンストラクターが2回呼び出されている理由を誰か教えてもらえますか? Bean の設計が間違っていたのでしょうか、それとも問題はアプリケーションの奥深くにあるのでしょうか?

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import [package name].UIBaseBean;    
import java.util.Locale;
import javax.faces.bean.ManagedProperty;


@ManagedBean
@ViewScoped

public class UserDetailBean extends UIBaseBean {

@ManagedProperty(value = "#{param.action}")
private String action;

private String firstName;
private String lastName;
private String jobTitle;
private String DOH;
private String location;
private String status;
private String comments;
@ManagedProperty(value = "#{param.id}")
private String id;
private String tabTitle;

private boolean editMode;
private boolean viewMode;

private ClUserDetail dBUserDetail;      

    /** Creates a new instance of UserDetailBean */
    public UserDetailBean() {   
        toolbarDescription = CoreMsgBundle.getMessageFromResourceBundle("UserDetail", Locale.ENGLISH);
    }
4

1 に答える 1

4

@RequestScopedおよびその他の関連する注釈を から削除する必要がありますUIBaseBean(そして にしますabstract)。

それが完了したら、代わりに@ManagedPropertyon#{param}を定義する<f:viewParam>か、代わりに取得するように修正する必要がありますExternalContext#getRequestParameterMap()。つまり、より短いスコープを持つものをより大きなスコープを持つものに注入することはできません (アクセプターのスコープ中にそれらの多くが存在する可能性があるため、どれを注入する必要があるかが明確ではないため)。JSF は、Bean の構築中に例外をスローします。

于 2011-02-04T17:59:41.470 に答える