一旦我进入Faces Flow,我想通过转到任何不属于流程的页面退出。
问题是如果我走出去,例如通过h:link
,流量不会被破坏。
实际上,如果我再次点击其动作为flowId的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"/>
或者,如果用户更改了浏览器中的网址,却未删除jfwid
?似乎流程没有终止,但用户实际上是在流程之外浏览。
对我来说这似乎有点奇怪:如果没有来自用户在commandButton / commandLink上的特定操作,我找不到任何退出流程(并释放支持bean)的方法。
顺便说一下:我在WildFly 8 CR1上测试了这个。
答案 0 :(得分:2)
你是对的。在当前版本中,规范要求使用UICommand组件进行导航以确定是否退出流。但是,对于使用GET进行导航的任何体面使用场景,这都不够。
尽管规范存在概念上的差距,但可以实现一个解决方案,我希望在即将推出的JSF库版本中看到一个(实际上,OmniFaces是一个不错的选择,BalusC和{{3}专注于修复规范中遗漏的东西;-))。
从技术上讲,解决方案可能如下所示:使用jfwid
或h:link
时已添加h:button
参数。因此,如果请求流定义之外的视图,则可以使用PhaseListener来结束当前流。然而,这只是一个基本的想法,可能存在我尚未考虑的绊脚石。
因此,要提供问题的答案:目前退出流的唯一正确方法是导航到退出节点或使用h:commandLink
或h:commandButton
进行页面导航,因为这样做当请求流定义之外的视图时,也会结束流程。