com.sun.faces.numberOfViewsInSession против com.sun.faces.numberOfLogicalViews - PullRequest
36 голосов
/ 05 ноября 2010

Mojarra Реализация JSF 2 имеет следующие контекстные параметры:

  • com.sun.faces.numberOfViewsInSession (по умолчанию 15)
  • com.sun.faces.numberOfLogicalViews (по умолчанию 15)

В чем разница между ними? Документация мало говорит об этом. У моего приложения были проблемы с ViewExpiredException для некоторых страниц, но после того, как мы увеличили эти настройки до (намного) более высокого значения, у нас перестали возникать проблемы.

Мое приложение представляет собой финансовое приложение с поддержкой форм и поддержкой ajax (некоторые экраны имеют более 50 входов с возможностью добавления большего количества данных / входов через AJAX).

в чем может быть причина такого поведения? Я понимаю, что первый параметр определяет количество «страниц», которые хранятся в сеансе, что может быть полезно для кнопки «Назад», но в моих случаях использования, которые вызывают ViewExpiredException, кнопка «Назад» не используется. К чему относится второй параметр? Если я остаюсь на том же экране, но продолжаю добавлять много данных через AJAX, вызывает ли это необходимость в большем количестве логических представлений для страницы?

Ответы [ 2 ]

64 голосов
/ 17 апреля 2013

Прежде всего, реализация Mojarra непреднамеренно поменяла значение этих параметров контекста.Так что если у вас сложилось впечатление, что описание является совершенно другим, чем то, что подразумевает буквальное имя параметра контекста, то это действительно так.


com.sun.faces.numberOfLogicalViews

Этов основном на основе запроса GET.Каждый запрос GET создает новое представление в сеансе.

Чтобы поэкспериментировать с ним, установите для него значение 3, запустите новый сеанс браузера и откройте 4 разные вкладки браузера (независимо от URL; могут быть одинаковыми, могут отличаться) по очереди, а затем вернитесь назад.на 1-й вкладке и отправьте форму там.Вы получите ViewExpiredException, потому что это представление было вытолкнуто из карты LRU (наименьшее недавно использованное) для представлений в сеансе.Этого не произойдет, если вы открыли максимум 3 вкладки.

При значении по умолчанию 15 это редкая проблема в реальном мире.Если ваше веб-приложение действительно предназначено для использования таким образом (например, сайт социальной сети / сообщества, который приглашает к открытию на нескольких вкладках, таких как дискуссионный форум или вопросы и ответы), то вы можете рассмотреть возможность сохранения состояния клиента на стороне вместо увеличения значения по умолчанию.,С сохранением состояния на стороне клиента вы никогда не столкнетесь с этим исключением.В качестве альтернативы можно использовать OmniFaces <o:enableRestorableView> в сочетании с компонентом в области запроса и параметрами запроса или компонентом в области просмотра, который проверяет (пост) конструкцию, нужно ли восстанавливать его собственное состояние.Опять же, другой альтернативой является переход к без сохранения состояния с <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 .Если это также относится к вашему приложению, то вы можете безопасно установить значение 1.

Изначально MyFaces не имело аналога для этого, и это также считается физическим представлением в сеансе.В версии 2.0.6 было введено org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION с аналогичной целью, но с другой реализацией и по умолчанию отключено.


См. Также:

5 голосов
/ 11 ноября 2010

Только что нашел это в сети: http://oss.org.cn/ossdocs/java/ee/javaeetutorial5/doc/JSFConfigure11.html

Это может быть полезно:

Логические представления являются подпредставлениями представления верхнего уровня. Например, если у вас есть страница с несколькими кадрами, то каждый кадр представляет собой логическое представление. Если у вас простое приложение, то по умолчанию 15 представлений или 15 логических представлений могут быть слишком большими. В этом случае вам следует рассмотреть возможность уменьшения допустимого количества представлений и логических представлений для экономии памяти. И наоборот, более сложное приложение может потребовать сохранения более 15 представлений или логических представлений в сеансе.

...