37

JSF 2 の Mojarra 実装には、次のコンテキスト パラメータがあります。

  • com.sun.faces.numberOfViewsInSession(デフォルトは 15)
  • com.sun.faces.numberOfLogicalViews(デフォルトは 15)

それらの違いは何ですか?ドキュメントは、これらについてあまり語っていません。私のアプリはViewExpiredExceptionいくつかのページで問題を抱えていましたが、これらの設定を (はるかに) 高い値に上げた後、問題は発生しなくなりました。

私のアプリは、金融、フォームの多い、ajax 対応のアプリです (一部の画面には 50 以上の入力があり、AJAX を介してさらに多くのデータ/入力を追加するオプションがあります)。

この動作の原因は何ですか?最初のパラメーターは、セッションに保持される「ページ」の数を定義することを理解しています。これは戻るボタンに役立つ場合がありますが、トリガーするユースケースでViewExpiredExceptionは戻るボタンを使用しません。2番目のパラメータは何を参照していますか? 同じ画面にとどまり、AJAX を介して大量のデータを追加し続けると、ページに多数の論理ビューが必要になりますか?

4

2 に答える 2

68

まず第一に、Mojarra の実装は意図せずにこれらのコンテキスト パラメータの意味を入れ替えてしまいました。そのため、説明が文字通りのコンテキスト パラメータ名が意味するものとはまったく逆であるという印象を持っている場合、これは実際に真実です。


com.sun.faces.numberOfLogicalViews

これは基本的にGETリクエストベースです。すべての GET 要求は、セッションで新しいビューを作成します。

実験するには、値を 3 に設定し、新しいブラウザー セッションを開始して、4 つの異なるブラウザー タブ (URL に関係なく、同じ場合も異なる場合もあります) を順番に開き、最初のタブに戻って送信します。そこにあるフォーム。このViewExpiredExceptionビューは、セッション内のビューの LRU (Least Recent Used) マップからプッシュされているため、 が表示されます。最大 3 つのタブを開いた場合、これは発生しません。

デフォルト値の 15 では、これはまれな現実の問題です。Web アプリケーションが実際にこのように使用されるように設計されている場合 (たとえば、ディスカッション フォーラムや Q&A など、複数のタブで開くことを勧めるソーシャル/コミュニティ サイト)、デフォルト値を増やす代わりに、クライアント側の状態保存の使用を検討できます。 . クライアント側の状態保存を使用すると、この例外に直面することはありません。別の方法としては、 OmniFaces<o:enableRestorableView>をリクエスト スコープ Bean とリクエスト パラメータを組み合わせて使用​​するか、ビュー スコープ Bean を使用して、独自の状態を復元する必要があるかどうかを (ポスト) コンストラクトでチェックします。この方法では、ビュー<f:view transient="true">は保存されなくなりますが、ビュー スコープ Bean は使用できなくなります。

MyFaces に相当するものはorg.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION、デフォルトで 20 です。


com.sun.faces.numberOfViewsInSession

これは基本的に同期 (非 ajax!) POST 要求ベースです。すべての同期 POST 要求は、新しい論理ビューを作成します。それらはすべて物理ビューに基づいて格納されていますMap<PhysicalView, Map<LogicalView, ViewState>>。したがって、最大 15 個の物理ビューと最大 15 個の論理ビューを使用すると、理論的にはセッションで 15*15 = 225 ビューを持つことができます。

実験するには、値を 3 に設定し、同期フォームでビューを開き、フォームを 4 回送信してから、ブラウザーの [戻る] ボタンを 4 回押してから、フォームを再度送信します。このViewExpiredExceptionビューは、論理ビューの LRU (最近使用されていない) マップからプッシュされているため、 が表示されます。これは、最大 3 回戻ってから再送信した場合には発生しません。

ajax 送信は同じ論理ビューを再利用することに注意してください ( javax.faces.ViewStateajax ポストバックでまったく同じ値が返されることで確認できます)。とにかく、ブラウザの戻るボタンのサポートはありません。ブラウザーの戻るボタンは、前の同期要求に戻るだけなので、これらすべての ajax ポストバックを論理ビューとしてセッションに保存しても意味がありません。

デフォルト値の 15 と、ajax のみのフォームと動的ページでのキャッシュの無効化が現在の傾向であるため、これは現実世界では非常にまれな問題です。適切に設計されたフォームは、ブラウザの戻るボタンを押してはいけません。代わりに、送信が成功した場合はターゲット ビューにリダイレクトし、失敗した場合は同じフォームを検証エラーとともに再表示する必要があります。ヒントについては、JSF をナビゲートする方法も参照してください。URL を現在のページ (前のページではなく) に反映させる方法。また、動的ページではキャッシュが無効になっていることが多いため、基本的に戻るボタンを使用すると、まったく新しいビューに戻ることができます. JSF Web アプリケーションの [戻る] ボタンを避けるも参照してください。これがアプリケーションにも該当する場合は、値を安全に 1 に設定できます。

MyFaces にはもともとこれに相当するものはなく、これもセッション内の物理ビューとしてカウントされていました。バージョン 2.0.6 ではorg.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION、同様の目的で導入されましたが、実装が異なり、デフォルトで無効になっています。


以下も参照してください。

于 2013-04-17T02:30:12.357 に答える
5

Webでこれを見つけました:http://oss.org.cn/ossdocs/java/ee/javaeetutorial5/doc/JSFConfigure11.html

これは役立つかもしれません:

論理ビューは、最上位ビューのサブビューです。たとえば、複数のフレームを含むページがある場合、各フレームは論理ビューです。単純なアプリケーションの場合、デフォルトの 15 ビューまたは 15 論理ビューでは大きすぎる可能性があります。この場合、メモリを節約するために、ビューと論理ビューの許容数を減らすことを検討する必要があります。逆に、より複雑なアプリケーションでは、15 個を超えるビューまたは論理ビューをセッションに保存する必要がある場合があります。

于 2010-11-11T12:10:44.140 に答える