Выход из потока JSF

Я начинаю использовать JSF Flows, и после прочтения некоторых примеров и спецификаций, я начал работать.

Я использую метод Packaging Flows in Directories, как описано в разделе 11.4.3.3 спецификации. Кажется, это проще и в большей степени соответствует соглашениям о присвоении имен, уже принятым со времени JSF 2.0.

Ниже приведена моя структура каталогов. Идентификатор потока - волшебник.

Структура каталогов

Я понимаю, что существует концепция выхода из потока путем вызова узла возврата.

Вы видите, на изображении выше, что у меня нет представления возвратного узла. Это просто мастер, с кучей страниц, по которым можно перемещаться вперед и назад, с тем преимуществом, что мое состояние ManagedBean сохраняется.

Проблема в том, что я могу перейти на любую страницу в моем приложении, и JSF по-прежнему поддерживает состояние этого потока. Если я вернусь на какую-либо из страниц мастера, вся информация все еще там, а это означает, что JSF никогда не отбрасывал область видимости потока.

Мои вопросы:

  1. Если у меня есть команда "конец" commandButton, как мне сообщить JSF, что когда пользователь нажимает эту кнопку, он должен отбросить текущую область действия потока?
  2. Что еще более важно, что если у меня нет узла возврата? Как мне сказать 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"/>
Другие вопросы по тегам