0

StudentManagedBean という名前で Bean を管理しました。その Bean では、post コンストラクトを使用して studentsList を初期化しました。別のマネージド Bean テスト Bean では、FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); を使用していました。学生を表示していたページ students.xhtml にリダイレクトします。

私の質問は、FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); を使用したときです。Student.xtml ページにリダイレクトされ、init メソッド (post コンストラクト) が 2 回呼び出されていました。上記の行にコメントすると、init メソッド (post 構造) が 1 回だけ呼び出されるようになりました。

この無効なセッションが正確に何をするのか教えてください。

  @ManagedBean(name = "studentManagedBean" )
    @SessionScoped
    public class StudentManagedBean implements Serializable {


        private List<SBean> stud;



        @PostConstruct
        private void init(){
            this.stud=dao.getAllStudInfo();
        }





 @ManagedBean(name = "testBean" )
    @SessionScoped
    public class TestBean implements Serializable {

public String navigate(String name){
        if(name.equals("Add student")){
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
             return  "student";

        }
4

1 に答える 1

0

どうやら、セッション スコープ BeanStudentManagedBeanも現在のビューで参照されています。ビューがビルド/復元されると、ビューのビルド時に参照された場合、Bean が作成される場合があります。ただし、その後セッションを無効にすると、セッション スコープ Bean は破棄され (明らかに、セッション スコープに格納されているため)、ビューのレンダリング中にターゲット ビューがまだそれを参照している場合に再度作成されます。

これは完全に理にかなっています。セッションを無効にする前に Bean を作成したくない場合は、ビュー内で直接参照するか、管理プロパティとして間接的に参照するか、別の Bean のプログラムによる EL 評価として間接的に参照しないでください。現在のビューで直接参照されています。

参照されている場所がすぐにわからない場合は、Bean のコンストラクターにデバッグ ブレークポイントを配置し、コール スタックを調べて、誰が/何を/なぜを調べます。

于 2013-03-18T17:46:28.430 に答える