如何退出流



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

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

如何在不让用户显式单击其操作对应于流的返回节点的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上测试这个。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新