2014-01-17 4 views
5

Как только я ввел поток Faces, я хочу выйти из него, перейдя на любую страницу, которая не является частью потока.Как выйти из потока?

Проблема в том, что поток не разрушается, если я выхожу наружу, например, через h:link. Действительно, если я снова нажму на h:commandButton, действие которого - flowId, я вернусь к предыдущему потоку, а не создаю новый поток.

Как выйти из потока, не указав пользователю явно на h:commandButton, чье действие соответствует возврату узла потока? Возможно ли это?

Edit:

Давайте возьмем этот поток, например (от JEE 7 samples)

@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? Кажется, поток не завершен, но пользователь фактически просматривает вне потока.

Это немного странно для меня: я не могу найти способ выйти из потока (и освободить бэкэнды) без специального действия от пользователя в команде Command/ButtonLink.

Btw: Я тестирую это на WildFly 8 CR1.

+0

Можете ли вы разместить объявление о потоке? –

+0

Да, я только что редактировал вопрос. –

ответ

2

Вы правы. В текущей версии спецификация требует перехода с использованием компонентов UICommand, чтобы определить, вышел ли поток или нет. Однако этого недостаточно для любого достойного сценария использования, когда навигация происходит с использованием GET.

Несмотря спецификации концептуального разрыва, решение может быть реализовано, и я ожидаю увидеть один в следующих версиях библиотек JSF (на самом деле, OmniFaces является хорошим выбором, так как BalusC и Arjan внимания на фиксацию материала, который был оставлен вне в spec ;-)).

Технически говоря, решение может выглядеть так: Параметр jfwid уже добавлен, когда используется h:link или h:button. Таким образом, PhaseListener может использоваться для завершения текущего потока, если запрашивается представление за пределами определения потоков. Однако это всего лишь базовая идея, и могут быть камни преткновения, которые я еще не рассматривал.

Итак, чтобы ответить на ваш вопрос: в настоящее время единственным правильным способом выхода из потока является либо переход к выходному узлу, либо использование h:commandLink или h:commandButton для навигации по страницам, так как это также приведет к потоку при просмотре за пределами определения потоков.

+0

любой шанс, что этот ответ устарел? –

+1

Спецификация JSF не была изменена тем временем, поэтому ответ еще не устарел. – tasel

+0

кстати. Я попытался создать PhaseListener, который мог бы прекратить ненужный поток. Я обнаруживаю ситуацию с запросом GET и активным потоком (из-за jfwid присутствует в ссылке), однако либо в FlowHandler, либо в Flow (from getCurrentFlow()) есть метод, который дезактивирует его (я могу вызвать метод finalizer, если он был установлен, однако я думаю, что сам поток все еще активен). Это только я, или FacesFlow действительно в альфа-состоянии? –

Смежные вопросы