我有一个Spring Webflow,它以一种线性的方式在一个表单中的各个步骤之间进行导航,无论是前后还是前进。由于用户从不同浏览器同时访问,因此有必要在每个步骤之间检查表单是否已在另一个浏览器实例中完成。如果是这样,应该直接跳到用户的最后一页。 Webflow看起来大致如下:
<view-state id="claimFlowStepOne" view="onlineclaims/my-claims-step1" model="submission">
<transition on="claimStep1Continue" to="checkSubmitted1">
</transition>
</view-state>
<decision-state id="checkSubmitted1">
<if test="onlineClaimsAction.checkClaimAlreadySubmitted(submission.claim)"
then="endClaimFlow" else="claimFlowStepTwo" />
</decision-state>
<view-state id="claimFlowStepTwo" view="onlineclaims/my-claims-step2"
model="submission">
<transition on="claimStep2Back" to="checkSubmitted2to1"
validate="false">
</transition>
<transition on="claimStep2Continue" to="checkSubmitted2to3">
<evaluate expression="onlineClaimsAction.savePaymentDetails(submission)" />
</transition>
</view-state>
<decision-state id="checkSubmitted2to1">
<if test="onlineClaimsAction.checkClaimAlreadySubmitted(submission.claim)"
then="endClaimFlow" else="claimFlowStepOne" />
</decision-state>
<decision-state id="checkSubmitted2to3">
<if test="onlineClaimsAction.checkClaimAlreadySubmitted(submission.claim)"
then="endClaimFlow" else="claimFlowStepThree" />
</decision-state>
依此类推,每一步都是如此。我们结束了许多非常相似的决策状态(2 *(N-1))。
我的经理要求我提出一个替代决策状态的常用方法。但是,我们都不知道如何(或者甚至可能)这样做,以便我们可以将一个可能的目的地作为参数传递。我查看了Spring文档,但无法找到关于是否可以将变量用作操作/目标的任何信息。这可能吗?
答案 0 :(得分:0)
考虑不同的选择......首先,您可以在flow.xml
中使用EL。所以你可以在你的州目的地使用它。例如,我们在一些流程中有这个:
<transition on="back" to="#{flowScope.previousViewStateId}"
validate="false" bind="false"/>
我们在flowScope
放置了名为“previousViewStateId”的变量,其中包含用户访问过的先前状态。
但是,使用自定义FlowExecutionListener,这可以为我指出更好的整体解决方案。 (这就是我们在flowScope
上获得“previousViewStateId”的方式,以便从EL中使用它。)
使用这种方法,您可以检查横切代码中的完成情况。而不是在flow.xml
中的每个州和每个州之间进行明确检查。您可以扩展FlowExecutionListenerAdapter并覆盖其中一个生命周期方法,以在所需条件下拦截和重新路由:
例如,一个自定义侦听器可以在流中应用安全检查 执行级别,阻止流程启动或状态 如果当前用户没有必要的权限则输入。 另一个监听器可以跟踪流执行导航历史 支持面包屑。另一个可能执行审计,或设置和撕裂 关闭与事务资源的连接。