Spring Webflow:如何在转换期间将属性从一个流传递到另一个流?
Posted
技术标签:
【中文标题】Spring Webflow:如何在转换期间将属性从一个流传递到另一个流?【英文标题】:Spring Webflow : how do I pass an attribute from one flow to another during a transition? 【发布时间】:2011-06-03 23:40:41 【问题描述】:我有一个动作状态,它评估一个表达式,然后根据结果转换到各种其他状态。例如,其中一个结果状态是将控制权交给另一个流的子流状态;
<action-state id="doWork">
<evaluate expression="someAction.doWork(someInput)" />
<transition on="WORKSUCCESS" to="workSuccess" />
<transition on="WORKFAIL" to="fixFail" />
</action-state>
<subflow-state id="fixFail" subflow="someOtherPlace/someOtherWorkToFixFail">
<input name="someNumber" value="1" type="java.lang.Integer" />
<transition on="finish" to="workSuccess" />
</subflow-state>
如您所见,我可以通过 input 标签将输入传递到子流中,但我的问题是,当且仅当从转换 WORKFAIL 调用子流状态时,如何指定和传递我想要呈现的其他输入?假设可以从其他动作状态调用子流状态“fixFail”。
我已经尝试过类似以下的事情,但没有效果;
<action-state id="doWork">
<evaluate expression="someAction.doWork(someInput)" />
<transition on="WORKSUCCESS" to="workSuccess" />
<transition on="WORKFAIL" to="fixFail">
<attribute name="newInput" value="3000" type="java.lang.Integer" />
</transition>
</action-state>
<subflow-state id="fixFail" subflow="someOtherPlace/someOtherWorkToFixFail">
<input name="someNumber" value="1" type="java.lang.Integer" />
<input name="someNumber2" value="flowScope.newInput" type="java.lang.Integer" />
<transition on="finish" to="workSuccess" />
</subflow-state>
【问题讨论】:
【参考方案1】:您可以通过三种方式做到这一点。您可以通过对话、会话或作为传入的属性来完成。
ConversationScope:如果某个字段位于 conversationScope
中,则该字段在该特定流以及该流的子流(及其转换)中的任何位置都可见
SessionScope:(可能不是你的 want) 对所有流可见并且 他们的子流程
最后你可以将字段作为属性传递到子流状态,例如
<subflow-state id="fixFail" subflow="someOtherPlace/someOtherWorkToFixFail">
<input name="someNumber" value="1" type="java.lang.Integer" />
<input name="someNumber2" value="flowScope.newInput" type="java.lang.Integer" />
<transition on="finish" to="workSuccess" />
</subflow-state>
在您的子流的 xml 中
<?xml version="1.0" encoding="UTF-8"?>
<flow>
<input name="someNumber"/>
<input name="someNumber2"/>
...
</flow>
在此示例中,someNumber 和 someNumber 两个作为属性传递给您的子流。您可以在其中将它们评估为$someNumber
编辑:
这是为了解决您的评论问题。如果您想在特定转换的对话范围内设置变量,您可以这样做:
<transition on="WORKFAIL" to="fixFail" >
<set name="conversationScope.someVariable" value="Hello World"/>
</transition>
然后在你的jsp中
$someVariable <!-- This will print out 'Hello World' -->
【讨论】:
嗯,conversationScope 听起来像我想在这种情况下想要的。我同意会话是我想要的,因为用户在第一次完成后重复这些流程并且任何会话属性都会保留,不是吗?当主流程完成时,对话范围的属性会消失,如果用户第二次进入主流程,则不会出现,对吗?有没有办法在“工作失败”的转换中添加到对话范围?我想将它保留在 xml/jsps 中,而不是添加到操作的 Java 代码中。 干杯是一种享受,当你看到它时很明显,我在 jsp 中尝试了各种类似 $converationScope.someVariable 的东西!以上是关于Spring Webflow:如何在转换期间将属性从一个流传递到另一个流?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Webflow 2 中使用 Flow Managed Persistence Context 以编程方式触发提交
使用spring webflow,在前台页面中如何显示后端返回的错误信息
在 Spring MVC 之上使用 Spring WebFlow 啥时候有意义?