如何退出流程?

时间:2014-01-17 10:57:25

标签: jsf exit jsf-2.2 faces-flow

一旦我进入Faces Flow,我想通过转到任何不属于流程的页面退出。

问题是如果我走出去,例如通过h:link,流量不会被破坏。 实际上,如果我再次点击其动作为flowId的h:commandButton,我将返回上一个流程而不是创建新流程。

如何退出流而不让用户明确地点击其动作对应于流的返回节点的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"/>

或者,如果用户更改了浏览器中的网址,却未删除jfwid?似乎流程没有终止,但用户实际上是在流程之外浏览。

对我来说这似乎有点奇怪:如果没有来自用户在commandButton / commandLink上的特定操作,我找不到任何退出流程(并释放支持bean)的方法。

顺便说一下:我在WildFly 8 CR1上测试了这个。

1 个答案:

答案 0 :(得分:2)

你是对的。在当前版本中,规范要求使用UICommand组件进行导航以确定是否退出流。但是,对于使用GET进行导航的任何体面使用场景,这都不够。

尽管规范存在概念上的差距,但可以实现一个解决方案,我希望在即将推出的JSF库版本中看到一个(实际上,OmniFaces是一个不错的选择,BalusC和{{3}专注于修复规范中遗漏的东西;-))。

从技术上讲,解决方案可能如下所示:使用jfwidh:link时已添加h:button参数。因此,如果请求流定义之外的视图,则可以使用PhaseListener来结束当前流。然而,这只是一个基本的想法,可能存在我尚未考虑的绊脚石。

因此,要提供问题的答案:目前退出流的唯一正确方法是导航到退出节点或使用h:commandLinkh:commandButton进行页面导航,因为这样做当请求流定义之外的视图时,也会结束流程。