com.sun.faces.numberOfViewsInSession против com.sun.faces.numberOfLogicalViews

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

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

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

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

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

2 ответа

Решение

Прежде всего, реализация 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 postbacks). В любом случае, в браузере нет кнопки "Назад". Кнопка возврата браузера только возвращает вас к предыдущему синхронному запросу, поэтому не имеет никакого смысла хранить все эти обратные передачи ajax в виде логических представлений в сеансе.

При значении по умолчанию 15 и текущей тенденции использования форм только для ajax и отключенного кэша на динамических страницах это очень редкая проблема в реальном мире. Правильно оформленные формы не должны вызывать нажатие кнопки "Назад" браузера. Вместо этого они должны при успешной отправке перенаправить в целевое представление, а при неудаче просто повторно отобразить ту же форму с ошибками проверки. См. Также советы по навигации в JSF. Как сделать так, чтобы URL отражал текущую страницу (а не предыдущую). Кроме того, кеш более чем часто отключается на динамических страницах, поэтому кнопка "Назад" в основном даст вам совершенно новый вид назад. См. Также кнопку "Избегать возврата" в веб-приложении JSF. Если это также относится к вашему приложению, вы можете смело установить значение 1.

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


Смотрите также:

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

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

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

Другие вопросы по тегам