Безопасна ли кнопка возврата в JSF 2.0 View Scope?
Безопасна ли JSF 2.0 View Scope "кнопка назад"? например, если я сохраню модель в View Scope и перейду со страницы 1, страницы 2, страницы 3, на страницу 4, изменяя объект модели по пути (через поля ввода), а затем дважды нажимаю кнопку "Назад", чтобы вернуться на страницу 2 и внесите изменения (перенеся меня снова на страницу 3), будут ли модели в области видимости иметь только те изменения, которые были сделаны при первоначальной визуализации страницы 2, или будут изменения на более поздних страницах?
В Oracle ADF было / есть что-то под названием "область действия процесса", которая обрабатывает это, разбивая то, что помещается в сеанс, поэтому каждая страница имеет свою собственную копию модели.
1 ответ
Для начала область просмотра привязана к определенной странице / представлению. Несколько представлений не будут использовать один и тот же компонент видимости. Область просмотра начинается с начального запроса GET и останавливается, когда действие POST перемещается сnull
возвращаемое значение
В общем случае существуют следующие сценарии, в зависимости от того, указана ли в браузере инструкция для кэширования страницы или нет, и конфигурации сохранения состояния JSF. Я предполагаю, что навигация между этими страницами осуществлялась с помощью запроса POST (как это выглядит в сценарии "Wizard").
Когда нажата кнопка "Назад":
- Если браузеру дано указание сохранить страницу в кэше, браузер загрузит страницу из кэша. Все ранее введенные входные значения будут появляться из кэша браузера (таким образом, не из bean-объекта области видимости на стороне сервера!). Поведение при выполнении запроса POST на этой странице зависит далее от
javax.faces.STATE_SAVING_METHOD
настройка конфигурации:- Если установлено
server
(по умолчанию), затемViewExpiredException
произойдет, потому что состояние просмотра удаляется на стороне сервера сразу после POST-навигации с одной страницы на другую. - Если установлено
client
, тогда это будет просто работать, потому что все состояние представления содержится в скрытом поле ввода формы.
- Если установлено
- Или, если браузеру дано указание не сохранять страницу в кеше, браузер отобразит страницу ошибки по умолчанию браузера "Страница истекла". Только когда для навигации был применен шаблон POST-redirect-GET, браузер отправит новый запрос GET по тому же URL-адресу, что и URL-адрес перенаправления. Все ранее введенные входные значения будут по умолчанию очищены (потому что bean-объект области видимости воссоздан), но если в браузере включена функция "автозаполнение" (настраивается на уровне браузера), то, возможно, он автоматически заполнит входные данные. Это можно отключить, добавив
autocomplete="off"
атрибут для входных компонентов. Когда вы выполняете запрос POST на этой странице, он будет работать независимо от способа сохранения состояния JSF.
Проще выполнить сценарий "Мастер" в одном представлении, которое содержит условно отображаемые шаги и предлагает кнопку "Назад" в самом разделе мастера.