> For the complete documentation index, see [llms.txt](https://potoyang.gitbook.io/spring-in-action-v4/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://potoyang.gitbook.io/spring-in-action-v4/untitled-2/untitled-3/untitled-1.md).

# 8.2.2　转移

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

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

```markup
<transition to="customerReady" />
```

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

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

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

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

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

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

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

**全局转移**

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

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

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

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

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

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