8.2.2 转移

正如我在前面所提到的,转移连接了流程中的状态。流程中除结束状态之外的每个状态,至少都需要一个转移,这样就能够知道一旦这个状态完成时流程要去向哪里。状态可以有多个转移,分别对应于当前状态结束时可以执行的不同的路径。

转移使用 <transition> 元素来进行定义,它会作为各种状态元素(<action-state><view-state><subflow-state>)的子元素。最简单的形式就是元素在流程中指定下一个状态:

<transition to="customerReady" />

属性 to 用于指定流程的下一个状态。如果只使用了 to 属性,那这个转移就会是当前状态的默认转移选项,如果没有其他可用转移的话,就会使用它。

更常见的转移定义是基于事件的触发来进行的。在视图状态,事件通常会是用户采取的动作。在行为状态,事件是评估表达式得到的结果。而在子流程状态,事件取决于子流程结束状态的 ID。在任意的事 件中(这里没有任何歧义),你可以使用 on 属性来指定触发转移的事件:

<transition on="phoneEntered" to="lookupCustomer" />

在本例中,如果触发了 phoneEntered 事件,流程将会进入 lookupCustomer 状态。

在抛出异常时,流程也可以进入另一个状态。例如,如果顾客的记录没有找到,你可能希望流程转移到一个展现注册表单的视图状态。以下的代码片段显示了这种类型的转移:

<transition on-exception="com.springinaction.pizza.service.CustomerNotFoundException"
            to="registraction" />

属性 on-exception 类似于 on 属性,只不过它指定了要发生转移的异常而不是一个事件。在本示例中,CustomerNotFoundException 异常将导致流程转移到 registrationForm 状态。

全局转移

在创建完流程之后,你可能会发现有一些状态使用了一些通用的转移。例如,如果在整个流程中到处都有如下的 <transition> 话, 我一点也不感觉意外:

<transition on="cancel" to="endState" />

与其在多个状态中都重复通用的转移,我们可以将 <transition> 元素作为的子元素,把它们定义为全局转移。例如:

<global-transitions>
  <transition on="cancel" to="endState" />
</global-transitions>

定义完这个全局转移后,流程中的所有状态都会默认拥有这个 cancel 转移。

我们已经讨论过了状态和转移。在我们开始编写流程之前,让我们看一下流程数据,这是 Web 流程三元素中的另一个成员。

Last updated