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

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

Я использую метод Потоки упаковки в каталогах, как описано в разделе 11.4.3.3 руководства спецификация. Это кажется проще и больше соответствует соглашениям об именах, уже принятым со времен JSF 2.0.

Ниже моя текущая структура каталогов. Идентификатор потока: wizard.

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

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

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

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

Мои вопросы:

  1. Если у меня есть кнопка «завершить» commandButton, как мне сообщить JSF, что когда пользователь нажимает эту кнопку, он должен удалить текущую область потока?
  2. Что еще более важно, что, если у меня нет узла возврата? Как мне сообщить JSF, чтобы он отбрасывал состояние потока, если пользователь переходит к любому представлению* за пределами каталога потока? (по понятию "поток", я думал это уже стандартное поведение)

*Для ясности, я имею в виду другое представление JSF (другая страница в моем приложении). Я знаю, что он ничего не может сделать, если пользователь инициирует запрос на страницу за пределами моего приложения или за пределами области действия JSF.


person RinaldoDev    schedule 08.07.2015    source источник


Ответы (1)


Как мне сообщить JSF, что нужно отказаться от состояния потока, если пользователь переходит к любому представлению за пределами каталога потока?

JSF не может узнать, что вы просто перенаправили на "http://google.de. Компонент будет находиться в памяти до тех пор, пока реализация не решит, что его следует удалить из-за неиспользования. У меня похожая проблема, и все, о чем я сейчас могу думать, это использовать какой-нибудь JS-Handler, который вызовет некоторую логику в бэкэнде, чтобы завершить поток. В общем случае никак не решить эту проблему, если, скажем, ваш браузер вылетает, не имея возможности выполнить этот 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
<p:commandButton value="Finish Flow" action="exit"/>
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"/>

В потоке всякий раз, когда вы перенаправляете на какую-либо новую страницу с помощью атрибута «действие», обязательно добавляйте «faces-redirect = true» к URL-адресу, иначе, по крайней мере, в моем случае я получаю сообщение об ошибке «Нет активного контекста». Например. нравится:

<p:commandButton value="Next Page" action="Page2.xhtml?faces-redirect=true"/>
person Community    schedule 25.11.2015
comment
В первом вопросе, на который вы ответили, я имел в виду, что хочу, чтобы JSF сбрасывал состояние потока, когда пользователь переходит к другому представлению, и под этим я подразумеваю представление, которое находится в пределах области действия JSF, которое собирается обслуживаться сервлетом Faces, а не каким-либо URL-адресом вне моего приложения (например, вашим). JSF знает, какое представление запрашивает пользователь и откуда он/она исходит, поэтому я думаю, что все еще есть способ сделать это (может быть, программно? С помощью Phase Listener? idk, это мой вопрос). Обновил мой вопрос с этим. - person RinaldoDev; 26.11.2015
comment
Что касается второго вопроса, на который вы ответили, это был он, спасибо. - person RinaldoDev; 26.11.2015