まず第一に、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.ViewState
ajax ポストバックでまったく同じ値が返されることで確認できます)。とにかく、ブラウザの戻るボタンのサポートはありません。ブラウザーの戻るボタンは、前の同期要求に戻るだけなので、これらすべての ajax ポストバックを論理ビューとしてセッションに保存しても意味がありません。
デフォルト値の 15 と、ajax のみのフォームと動的ページでのキャッシュの無効化が現在の傾向であるため、これは現実世界では非常にまれな問題です。適切に設計されたフォームは、ブラウザの戻るボタンを押してはいけません。代わりに、送信が成功した場合はターゲット ビューにリダイレクトし、失敗した場合は同じフォームを検証エラーとともに再表示する必要があります。ヒントについては、JSF をナビゲートする方法も参照してください。URL を現在のページ (前のページではなく) に反映させる方法。また、動的ページではキャッシュが無効になっていることが多いため、基本的に戻るボタンを使用すると、まったく新しいビューに戻ることができます. JSF Web アプリケーションの [戻る] ボタンを避けるも参照してください。これがアプリケーションにも該当する場合は、値を安全に 1 に設定できます。
MyFaces にはもともとこれに相当するものはなく、これもセッション内の物理ビューとしてカウントされていました。バージョン 2.0.6 ではorg.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION
、同様の目的で導入されましたが、実装が異なり、デフォルトで無効になっています。
以下も参照してください。