如何退出流程?

tho*_*s.g 5 jsf exit jsf-2.2 faces-flow

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

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

如何在没有用户明确单击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();
}
Run Code Online (Sandbox Code Playgroud)

如果用户点击,流程将被终止

<h:commandButton id="index" value="home" action="goHome" />
Run Code Online (Sandbox Code Playgroud)

要么

<h:commandButton id="return" value="return" action="taskFlowReturn1" />
Run Code Online (Sandbox Code Playgroud)

但是,如果用户点击该怎么办?

<h:link outcome="someOutcomeUnrelatedToTheFlow"/>
Run Code Online (Sandbox Code Playgroud)

或者,如果用户更改浏览器中的URL,而不删除jfwid?似乎流程没有终止,但用户实际上是在流程之外浏览.

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

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

tas*_*sel 2

你是对的。在当前版本中,规范要求使用 UICommand 组件进行导航以确定流程是否退出。然而,这对于使用 GET 进行导航的任何正常使用场景来说还不够。

尽管存在规范概念上的差距,但仍然可以实现一种解决方案,并且我希望在即将推出的 JSF 库版本中看到一个解决方案(实际上,OmniFaces是一个不错的选择,因为BalusCArjan专注于修复规范中遗漏的内容;-) )。

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

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