Как выйти из потока?
После того, как я вошел в поток лиц, я хочу выйти из него, перейдя на любую страницу, которая не является частью потока.
Проблема в том, что поток не будет разрушен, если я выхожу на улицу, например, через h:link
, Действительно, если я снова нажму на h:commandButton
чье действие - идентификатор потока, я возвращаюсь к предыдущему потоку вместо создания нового потока.
Как выйти из потока без необходимости явно нажимать на h:commandButton
чье действие соответствует возвратному узлу потока? Это вообще возможно?
Редактировать:
Давайте возьмем этот поток для примера (из примеров JEE 7)
@Produces @FlowDefinition
public Flow defineFlow(@FlowBuilderParameter FlowBuilder flowBuilder) {
String flowId = "flow1";
flowBuilder.id("", flowId);
flowBuilder.viewNode(flowId, "/" + flowId + "/" + flowId + ".xhtml").markAsStartNode();
flowBuilder.returnNode("taskFlowReturn1").
fromOutcome("#{flow1Bean.returnValue}");
flowBuilder.returnNode("goHome").
fromOutcome("#{flow1Bean.homeValue}");
flowBuilder.inboundParameter("param1FromFlow2", "#{flowScope.param1Value}");
flowBuilder.inboundParameter("param2FromFlow2", "#{flowScope.param2Value}");
flowBuilder.flowCallNode("call2").flowReference("", "flow2").
outboundParameter("param1FromFlow1", "param1 flow1 value").
outboundParameter("param2FromFlow1", "param2 flow1 value");
return flowBuilder.getFlow();
}
Поток будет прерван, если пользователь нажмет на
<h:commandButton id="index" value="home" action="goHome" />
или же
<h:commandButton id="return" value="return" action="taskFlowReturn1" />
Но что, если пользователь нажимает на
<h:link outcome="someOutcomeUnrelatedToTheFlow"/>
Или, если пользователь изменяет URL в браузере, не удаляя jfwid
? Кажется, что поток не завершен, но пользователь фактически просматривает вне потока.
Это кажется мне немного странным: я не могу найти какой-либо способ выйти из потока (и освободить компоненты поддержки) без какого-либо конкретного действия пользователя по команде commandButton/commandLink.
Кстати: я тестирую это на WildFly 8 CR1.
1 ответ
Вы правы. В текущей версии спецификация требует навигации с использованием компонентов UICommand, чтобы определить, завершен ли поток или нет. Однако этого недостаточно для сценария достойного использования, когда навигация происходит с использованием GET.
Несмотря на концептуальный пробел в спецификациях, решение может быть реализовано, и я ожидаю увидеть его в следующих версиях библиотек JSF (на самом деле, OmniFaces - хорошая ставка, так как BalusC и Arjan Tijms сосредоточены на исправлении вещей, которые были оставлены в спецификации;-)).
Технически говоря, решение может выглядеть следующим образом: jfwid
параметр уже добавлен, когда h:link
или же h:button
используется. Таким образом, PhaseListener может использоваться для завершения текущего потока, если запрашивается представление вне определения потоков. Тем не менее, это просто основная идея, и могут быть камни преткновения, которые я еще не учел.
Итак, чтобы дать ответ на ваш вопрос: в настоящее время единственный правильный способ выхода из потока - это либо перейти к выходному узлу, либо использовать h:commandLink
или же h:commandButton
для навигации по страницам, поскольку это также завершит поток, когда запрашивается представление вне определения потоков.