Выход из потока JSF
Я начинаю использовать JSF Flows, и после прочтения некоторых примеров и спецификаций, я начал работать.
Я использую метод Packaging Flows in Directories, как описано в разделе 11.4.3.3 спецификации. Кажется, это проще и в большей степени соответствует соглашениям о присвоении имен, уже принятым со времени JSF 2.0.
Ниже приведена моя структура каталогов. Идентификатор потока - волшебник.
Я понимаю, что существует концепция выхода из потока путем вызова узла возврата.
Вы видите, на изображении выше, что у меня нет представления возвратного узла. Это просто мастер, с кучей страниц, по которым можно перемещаться вперед и назад, с тем преимуществом, что мое состояние ManagedBean сохраняется.
Проблема в том, что я могу перейти на любую страницу в моем приложении, и JSF по-прежнему поддерживает состояние этого потока. Если я вернусь на какую-либо из страниц мастера, вся информация все еще там, а это означает, что JSF никогда не отбрасывал область видимости потока.
Мои вопросы:
- Если у меня есть команда "конец" commandButton, как мне сообщить JSF, что когда пользователь нажимает эту кнопку, он должен отбросить текущую область действия потока?
- Что еще более важно, что если у меня нет узла возврата? Как мне сказать JSF отбросить состояние потока, если пользователь переходит к любому представлению * вне каталога потока? (по концепции "потока" я думал, что это уже стандартное поведение)
* Просто чтобы прояснить, я имею в виду другое представление JSF (еще одну страницу в моем приложении). Я знаю, что он ничего не может сделать, если пользователь инициирует запрос к странице за пределами моего приложения или за пределами области действия JSF.
1 ответ
Как мне сказать JSF отбросить состояние потока, если пользователь переходит к какому-либо представлению вне каталога потока?
У JSF нет возможности узнать, что вас просто перенаправили, чтобы сказать " http://google.de/". Бин будет находиться в памяти, пока реализация не решит, что его следует удалить из-за неиспользования. У меня похожая проблема, и все, о чем я могу думать сейчас, - это использовать какой-нибудь JS-обработчик, который вызовет некоторую логику в серверной части, чтобы завершить поток. В общем случае, нет способа решить эту проблему, если, скажем, ваш браузер падает, не имея возможности выполнить этот JS-код.
Если у меня есть команда "конец" commandButton, как мне сообщить JSF, что когда пользователь нажимает эту кнопку, он должен отбросить текущую область действия потока?
Вы должны определить так называемый возвратный узел (-ы). Я приведу пример моей конфигурации, которая успешно завершает поток:
<?xml version="1.0"?>
<faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
<application/>
<flow-definition id="myflow">
<view id="Page1">
<vdl-document>/myflow/Page1.xhtml</vdl-document>
</view>
<start-node>Page1</start-node>
<flow-return id="exit">
<from-outcome>/home.xhtml</from-outcome>
</flow-return>
</flow-definition>
</faces-config>
Вы должны убедиться, что ваша командная кнопка возвращает "выход" в атрибуте действия. Например:
<p:commandButton value="Finish Flow" action="exit"/>
Внутри потока всякий раз, когда вы перенаправляете на какую-то новую страницу с помощью атрибута "action", обязательно добавляйте "URL-адреса Face-Redirect = True", иначе, по крайней мере, в моем случае я получаю ошибку "Нет активного контекста". Например, вот так:
<p:commandButton value="Next Page" action="Page2.xhtml?faces-redirect=true"/>