2014-01-17 22 views
5

一旦我進入了Faces Flow,我想通過轉到任何不屬於流程的頁面來退出它。如何退出流程?

問題是,如果我走出室外,流量不會被破壞,例如通過h:link。 事實上,如果我再次點擊一個h:commandButton,其作用是flowId,我將回到上一個流程,而不是創建新流程。

如何退出流程而不讓用戶明確點擊h:commandButton其操作對應於流程的返回節點? 它甚至有可能嗎?

編輯:

讓我們本流程例如(來自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?看起來流程沒有終止,但用戶實際上是在流程之外瀏覽。對於我來說這似乎有點奇怪:我無法找到任何方式退出流(並釋放支持bean),而無需用戶在commandButton/commandLink上執行特定操作。

btw:我在WildFly 8 CR1上測試了這個。

+0

你能張貼你的流程聲明嗎? –

+0

是的,我剛剛編輯了這個問題。 –

回答

2

你說得對。在當前版本中,規範要求使用UICommand組件進行導航以確定流是否退出。但是,這對於使用GET進行導航的任何正常使用場景來說都是不夠的。

儘管規範的概念差距,解決方案可以實現,我希望看到一個在JSF庫(實際上,OmniFaces是一個不錯的選擇,即將推出的版本爲BalusCArjan重點放在固定的東西,是在冷落spec ;-))。

從技術上講,解決方案可能如下所示:使用h:linkh:button時,已添加jfwid參數。因此,如果請求流定義之外的視圖,則可以使用PhaseListener結束當前流。然而,這只是一個基本的想法,可能有絆腳石,我還沒有考慮。

因此,爲您的問題提供一個答案:目前退出流程的唯一正確方法是導航到出口節點,或者使用h:commandLinkh:commandButton進行頁面導航,因爲這也會在視圖結束時結束流程要求流程定義之外。

+0

這個答案已經過時了嗎? –

+1

JSF規範在此期間沒有改變,所以答案還沒有過時。 – tasel

+0

btw。我試圖創建PhaseListener,這可能會結束不需要的流程。我找到GET請求和活動流的情況(因爲jfwid存在於鏈接中),然而無論是在FlowHandler中,還是Flow(來自getCurrentFlow())都有一個可以停用它的方法(如果它已經設置,我可以調用終結器方法,但是我認爲,流量本身仍然活躍)。只是我,還是FacesFlow真的處於alpha狀態? –