0

基本的にここと同じ質問

別のブラウザー タブにリダイレクトするページで ViewScoped Bean を保持するにはどうすればよいですか。

firstPage.xhtml:

<h:commandLink action="#{controller.redirect}" value="#{bean.value} target="_blank"/>

リダイレクト/ナビゲーションが他の Bean の初期化で終了すると、プロセスでこの #{bean} を破棄します。リダイレクトされたコードでは、#{bean} も使用していません。これは以前は

<a4j:keepAlive>

これが私の現在のセットアップです。豆クラス:

@ViewScoped
public class Bean{ 
    @PreDestroy
    public void onDestroy(){ // being destroyed when I don't want to }
}

顔構成:

<navigation-rule>
  <from-view-id>/firstPage.xhtml</from-view-id>
    <navigation-case>
      <from-outcome>redirect</from-outcome>
      <to-view-id>/secondPage.xhtml</to-view-id>
  </navigation-case>
</navigation-rule>
4

1 に答える 1

2

Luiggiが提案したように実行し、セッションにデータを一時的に保存するか、クエリパラメータを介してデータ(またはデータを再フェッチするのに十分なキー)をターゲットビューに渡す必要があります。これは、新しいウィンドウ/タブをリダイレクトおよび/またはターゲットにしていない場合でも当てはまります。

ビュースコープがおかしい。これは、ユーザーが同じビューに留まっている間だけ存在します。JSFは、ビューが移動されたことを確認すると、そのビューにスコープされているBeanを自動的に破棄します。

別のビューに移動するには、2つの方法があります。h:link1つ目は、fromや。などの顔以外のリクエストh:buttonです。この場合、前のビューは復元されていないため、JSFは、破棄するビュースコープのBeanがあることを認識しません。2つ目は、または以外のものを返すfromh:commandLinkや、などのfacesリクエストです。この場合、アクションを処理するために復元されるビューへのポストバックがあります。そのアクションの結果が、リダイレクトするかどうかに関係なく、そのビューから移動することである場合、そのビューにスコープされたBeanはすべて破棄されます。h:commandButtonvoidnull

内部的には、ビュースコープは基本的にセッションスコープであり、「古い」データをクリーンアップするためのいくつかの組み込みセマンティクスがあります。これは、ユーザーが複数のウィンドウ/タブでアプリケーションを開かず、アプリケーション内で提供されるナビゲーションのみを使用する場合(つまり、ブラウザーの戻る/進むボタンではない場合)に実際にうまく機能します。ただし、Webブラウザーのターゲット設定について話しているので、私の意見では、ビュースコープはまったく役に立ちません(ターゲットブラウザーを制御して、戻る/転送/再読み込み/場所を完全に無効にできる場合を除いて、例外はありませんが、そうではありません。あなたがそのような環境にいるようには聞こえません)。

于 2012-04-11T15:00:16.277 に答える