Должно ли PARTIAL_STATE_SAVING быть установлено в false?
Похоже, что сегодня (апрель 2012 г.) реализации MyFaces и Mojarra JSF 2.1 имеют дефекты, связанные с частичным сохранением состояния, и для PARTIAL_STATE_SAVING должно быть установлено значение false.
Это правда?
1 ответ
Должно ли PARTIAL_STATE_SAVING быть установлено в false?
Только когда вы сталкиваетесь с общим дефектом, связанным с частичным сохранением состояния в вашем веб-приложении, который не может быть решен / обойден другим способом. Частичное сохранение состояния имеет именно основные преимущества в отношении общей производительности и использования памяти. См. Также Почему JSF сохраняет состояние компонентов пользовательского интерфейса на сервере?
Я не могу на 100% достоверно говорить о MyFaces, но в Mojarra коренная причина проблем, связанных с частичным сохранением состояний, проявится, когда вы привязываете любой атрибут обработчика тега (обработчики тегов распознаются по отсутствию rendered
атрибута тега (например, теги JSTL) для bean-объекта области видимости или когда вы связываете id
или же binding
атрибут компонента JSF для bean-объекта области видимости (эти атрибуты, в частности, разрешаются во время построения / восстановления представления).
Эта проблема вызвана проблемой куриного яйца, как описано в выпуске 1492 JSF и проблеме 787 спецификации JSF: при включенном частичном сохранении состояния bean-объекты области видимости были сохранены в состоянии частичного просмотра. Таким образом, для извлечения bean-компонентов вида необходимо восстановить состояние частичного представления. Во время восстановления (построения) представления будет проверяться EL во всех вышеупомянутых атрибутах. Однако, поскольку в данный момент нет доступного экземпляра bean-объекта в области видимости, будет создан новый экземпляр. Это будет иметь все свойства по умолчанию! После восстановления представления и получения исходных объектов видимости bean-компоненты возвращаются в область видимости, переопределяя (временные) экземпляры, созданные во время восстановления представления. Но выражения EL этих атрибутов уже были оценены на основе совершенно другого экземпляра и не могут быть восстановлены.
Эта проблема с куриным яйцом решена начиная с Mojarra 2.1.18 и 2.2.0 путем хранения в сессии бобов видимости. Если по какой-то причине вы не можете выполнить обновление, это действительно можно решить, отключив частичное сохранение состояния, установив javax.faces.PARTIAL_STATE_SAVING
в false
, Альтернатива заключается в том, чтобы просто не связывать вышеупомянутые атрибуты с bean-объектом области видимости, а искать альтернативное решение.
Вы также можете установить javax.faces.FULL_STATE_SAVING_VIEW_IDS
вместо. Это позволяет вам указать список всех идентификаторов представлений, разделенных запятыми, для которых необходимо отключить частичное сохранение состояния:
<context-param>
<param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
<param-value>/some.xhtml,/other.xhtml</param-value>
</context-param>
Это позволяет максимально использовать частичное сохранение состояния и отключать его только для подмножества представлений, в которых проблемы, связанные с частичным сохранением состояния, действительно не могут быть устранены.
Смотрите также:
- Общение в JSF 2.0 -
@ViewScoped
не работает в обработчиках тегов