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);
}