我有一个基本的流程示例工作:
src/main/webapp
|
|- index.xhtml
|- flow1
|- flow1-flow.xml
|- flow1.xhtml
Run Code Online (Sandbox Code Playgroud)
index.xhtml有一个简单的表单,用参数输入流:
<h:form>
Click to enter flow1
<h:commandButton action="flow1" value="Flow 1">
<f:param name="testInput" value="hi there"/>
</h:commandButton>
</h:form>
Run Code Online (Sandbox Code Playgroud)
flow1.xhtml显示参数,并允许您在流范围中输入值:
<h:form>
Hi this is page 1.
<h:inputText label="Enter something:" value="#{flowScope.testOutput}"/><br/>
Request parameter: #{param['testInput']}<br/>
<h:commandButton action="returnFromFlow1"/>
</h:form>
Run Code Online (Sandbox Code Playgroud)
flow1-flow.xml只将返回节点定义为"returnFromFlow1"并将其设置为/index.xhtml.
这似乎有效.我想在输入流时实现post-redirect-get,以便浏览器地址栏与视图保持同步.所以我自然尝试了action ="flow1?faces-redirect = true".此更改阻止流程执行..它只是在单击按钮时重新加载index.xhtml.
然后我尝试了action ="flow1/flow1.xhtml?faces-redirect = true".这会加载页面并按预期重定向,但流程未初始化.当我在流程中提交表单时,我收到有关flowScope解析为null的错误.
做了一点研究,我找到了一个提示,设置"to-flow-document-id"来强制它初始化流程.所以我添加到我的命令按钮.没变.
有关如何实现这一目标的任何想法?
一旦我进入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();
}
Run Code Online (Sandbox Code Playgroud)
如果用户点击,流程将被终止
<h:commandButton id="index" value="home" action="goHome" />
Run Code Online (Sandbox Code Playgroud)
要么
<h:commandButton id="return" value="return" action="taskFlowReturn1" />
Run Code Online (Sandbox Code Playgroud)
但是,如果用户点击该怎么办?
<h:link outcome="someOutcomeUnrelatedToTheFlow"/>
Run Code Online (Sandbox Code Playgroud)
或者,如果用户更改浏览器中的URL,而不删除jfwid
?似乎流程没有终止,但用户实际上是在流程之外浏览.
这对我来说似乎有点奇怪:我没有找到任何方法退出流程(并释放支持bean),而没有来自用户在commandButton/commandLink上的特定操作.
顺便说一下:我在WildFly …
我今天的问题是:是否可以在不使用h:commandButton
组件的情况下启动面流?在我的特定情况下,我想使用该h:selectOneMenu
组件根据用户选择的值启动特定流程.
我正在探索JSF 2.2 Faces Flow功能,但我仍然不确定使用Faces Flow定义流程而不是使用普通导航系统(在链接或按钮中调用facelets)有什么好处?