一旦我进入了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:link
或h:button
时,已经添加了jfwid
参数。因此,如果请求流定义之外的视图,则可以使用PhaseListener来结束当前流。然而,这只是一个基本的想法,可能会有一些障碍,我还没有考虑。
因此,为了回答您的问题:目前退出流的唯一正确方法是导航到退出节点,或者使用h:commandLink
或h:commandButton
进行页面导航,因为当请求流定义之外的视图时,这也会结束流。