5

进入 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();
}

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

<h:commandButton id="index" value="home" action="goHome" />

或者

<h:commandButton id="return" value="return" action="taskFlowReturn1" />

但是如果用户点击

<h:link outcome="someOutcomeUnrelatedToTheFlow"/>

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

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

顺便说一句:我正在 WildFly 8 CR1 上对此进行测试。

4

1 回答 1

2

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

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

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

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

于 2014-02-25T09:40:01.377 回答