1

JSF 2、PrimeFacces 3.4、および CDI を使用しています。私は 2 つのページを持っています:page1.xhtmlpage2.xhtml. 各ページには独自のマネージド Bean があります:Page1BeanおよびPage2Bean.

page1.xhtmlには<p:remoteCommand>actionListener表示されますpage2.xhtml

page2.xhtml下に 3 つのコンポーネント<ui:include>と 1 つの送信ボタンが含まれています。これら 3 つのコンポーネントはそれぞれ、異なるマネージド BeanComponent1BeanにバインドされComponent2BeanていComponent3Beanます。送信ボタンが表示されますpage1.xhtml

これら 3 つComponentXBeanの s には、@PostConstructいくつかの初期化コードを含むメソッドがあります。これらの Bean で次のスコープを試しました。

  • @SessionScoped: 単一の送信操作ではすべてが正常に機能します。私がそれを繰り返すと、これらのBeanは@PostConstructセッションスコープであるため、再初期化されません。
  • @ViewScoped:@PostConstruct複数回呼び出されます。
  • @ConversationScoped: と同じ動作@ViewScoped

@PostConstructビューと会話のスコープで が複数回呼び出されるのはなぜですか? サブミット操作ごとに1回だけ呼び出されるようにするにはどうすればよいですか?

4

1 に答える 1

0

毎回「preRender」の下で初期化コードを実行するのは、おそらく正しくありません。初期化すると、必要なデータが消去されるためです。

あなたの初期化からあなたを分離してpreRenderください。それらを個別にフックするか、initialize() を 1 回だけ呼び出すフラグを設定することができます。

可能であれば、Session スコープの Bean は避けてください。セッション スコープは、Web アプリケーションの設計が不適切であることの特徴であり、(最も単純な形式では) ページ間フローを実装するための非常に悪い方法です。フローを実装するために、Web ページ間で URL または POST パラメーターを渡します。

必要に応じて、ページ間パラメーターをHttpSession に格納されたオブジェクトへの一意のハンドルにすることができます。ただし、アプリケーションに対して真にグローバル (「loggedInUser」など) であるか、一意に割り当てられたハンドルによって参照されることなく、単にセッションに何かをダンプしないでください。

于 2013-08-24T11:58:40.593 に答える