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,在前台页面中如何显示后端返回的错误信息

Ajax + Spring Webflow

在 Spring MVC 之上使用 Spring WebFlow 啥时候有意义?

spring-roo 2.0 Spring Webflow 持久性最佳实践

Spring webflow + Jpa + Hibernate运行时无响应问题处理