【问题标题】:How to exit a flow?如何退出流程?
【发布时间】:2014-01-17 10:57:24
【问题描述】:

进入 Faces Flow 后,我想通过转到不属于该流的任何页面来退出它。

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

如何在不让用户显式单击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"/>

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

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

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

【问题讨论】:

  • 您可以发布您的流程声明吗?
  • 是的,我刚刚编辑了问题。

标签: jsf exit jsf-2.2 faces-flow


【解决方案1】:

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

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

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

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

【讨论】:

  • 这个答案有没有可能已经过时了?
  • JSF规范在此期间没有改变,所以答案还没有过时。
  • 顺便说一句。我试图创建 PhaseListener,这可能会结束不需要的流程。我找到了 GET 请求和活动流的情况(因为链接中存在 jfwid)但是在 FlowHandler 中,并且 Flow(来自 getCurrentFlow())有一个方法可以停用它(如果它已设置,我可以调用终结器方法,但是我认为,该流程本身仍然处于活动状态)。是只有我,还是 FacesFlow 真的处于 alpha 状态?
  • 虽然答案没有过时,但我认为它可能被误解了。最初的问题是“如果没有用户对 commandButton/commandLink 的特定操作,我找不到任何退出流程(并释放支持 bean)的方法。”但是,正如 BalusC 所指出的,您实际上可以使用任何导航到退出节点的东西,包括 h:link。因此,如果您有一个带有 output="return-from-flow" 的 h:link 并且标记为 flow-return 节点,那么它将结束流程。
  • 至于答案的最后一部分:“...或使用 h:commandLinkor h:commandButton 进行页面导航,因为当请求流定义之外的视图时,这也会结束流."。那正确吗?在我的情况下,它不会仅仅因为用户导航到流之外的视图而放弃流状态。见:stackoverflow.com/questions/31295612/exiting-a-jsf-flow
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 2011-09-09
  • 2014-08-26
相关资源
最近更新 更多