Вопрос

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

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

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

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

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

Это было полезно?

Решение

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


com.sun.faces.numberOfLogicalViews

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

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

С помощью значения по умолчанию 15, это редкая реальная мировая проблема. Если ваш WebApp действительно разработан для использования таким способом (например, сайт социального / сообщества, который приглашает, чтобы открыть на нескольких вкладках, таких как дискуссионный форум или Q & A), вы можете рассмотреть возможность с использованием экономии данных клиента, а не увеличить значение по умолчанию. Отказ С сбором государства клиента вы никогда не столкнетесь с этим исключением. Альтернатива будет использовать Омнозащитные <o:enableRestorableView> В комбинации запроса на выплате компоневных компонентов и запрос параметров запроса, или представление Scoped Bean, которая проверяет (пост) построить, если его собственное состояние необходимо восстановить. Снова другая альтернатива - идти без гражданства <f:view transient="true">, Этот способ больше не сохраняются, но вы больше не можете использовать View Scoped Beans.

Эквивалент MyFaces org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION которые по умолчанию до 20.


com.sun.faces.numberOfViewsInSession

Это в основном синхронно (неаджакс!) Каждый запрос Synchronous Post создает новый логический вид. Все они хранятся на основе физического вида, как так Map<PhysicalView, Map<LogicalView, ViewState>>. Отказ Итак, с максимальными физическими видами и MAX 15 Logical Views, вы можете теоретически иметь 15 * 15 = 225 просмотров в сеансе.

Чтобы поэкспериментировать с ним, установите его на значение 3, откройте вид со синхронной формой, отправьте его 4 раза, а затем нажмите кнопку «Назад Browser 4 раза», а затем снова отправьте форму. Вы получите ViewExpiredException, потому что этот взгляд был выдвинут из LRU (наименее недавно использован) карта для логических представлений. Это не произойдет, если вы вернетесь к максимум 3 раза, а затем повторно повторно его повторно.

Обратите внимание, что Ajax отправляет повторно использовать тот же логический вид (вы можете подтвердить его, увидев точно так же javax.faces.ViewState Значение возвращается на поступления AJAX). В любом случае нет никакой поддержки Browser Back Button. Кнопка Back Browser возвращает вас только к предыдущему синхронному запросу, поэтому он не имеет никакого смысла хранить все эти опросы AJAX в качестве логических представлений в сеансе.

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

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


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

Другие советы

Только что нашел это в Интернете: http://oss.org.cn/ossdocs/java/ee/javaeTutorial5/doc/jsfconfigure11.html.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top