1.在Spring Web Flow中,流程由三个主要元素定义的:状态、转移和流程数据。
状态是流程中事件发生的地点,类似公路旅行中停下来的地点,转移就类似与连接这些地点的公路
2.状态
Spring Web Flow 定义了5种不同类型的状态:
状态类型 | 作用 |
行为(Action) | 是流程逻辑发生的地方 |
决策(Decision) | 将流程分成两个方向,它会基于流程数据的评估结果确定流程的方向 |
结束(End) | 是流程的最后一站,一旦进入End状态,流程就会结束 |
子流程(Subflow) | 会在当前的正在进行的流程上下文中启动一个新的流程 |
视图(View) | 会暂停流程并邀请 用户参与流程 |
(1)视图状态
视图状态用来为用户展示信息并使用户在流程中发挥作用,实际的视图实现可以是Spring支持的任意类型的视图,但通常是用JSP来实现的。在流程定义的XML文件中,<view-state>用户定义视图状态
<view-state id="welcome" />
其中id有两个含义,一是在流程内标示这个状态,二是指定了流程到这个状态时要展示的逻辑视图的名称,如果要显示的指定另外一个视图,可以如下:
<view-state id="welcome" view="greeting"/>
如果流程为用户展示了一个表单,可能需要指明表单所绑定的对象,可以如下:
<view-state id="takePayment" model="flowScope.paymentDetails"/>
(2)行为状态
是应用程序自身在执行任务,在在流程定义的XML文件中,行为状态使用<action-state>元素来声明,示例如下:
<action-state id="saveOrder"> <evaluate expression="pizzaFlowActions.saveOder(order)"/> <transition to="thankYou"/> </action-state>
<evaluate>元素给出行为状态要做的事情,expression属性指定了进入这个状态是要评估的表达式
(3)决策状态
决策状态能够使在流程执行时产生两个分支,决策将评估一个Boolean类型的表达式,然后在两个状态中选择一个。示例如下:
<decision-state id="checkDeliveryArea"> <if test="pizzaFlowActions.checkDeliveryArea(customer.zipCode)" then "addCustomer" else "deliveryWarning"/> </decision-state>
(4)子流程状态
在一个正在执行的流程中调用另一个流程,示例如下:
<subflow-state id="order" subflow"pizza/order"> <input name="order" value="order"/> <transition on="orderCreated" to="payment"/> </subflow-state>
(5)结束状态
指定了流程的结束,示例如下:
<end-state id="customerReady"/>
3.转移,全局转移
转移连接了流程中的状态,流程中除了结束状态外,至少需要有一个转移,这样就能够一旦这个流程执行完成时要去向哪里。
转移需使用<transition> 元素来进行定义,它会作为各个状态的子元素,示例如下:
<transition to="customerReady"/>
属性to用来指定流程的下一个状态,只使用to属性,那么这个转移就会是当前状态的默认转移选项。还可以使用on属性来指定触发转移的事件。
<transition on ="phoneEntered" to="lookupCustomer"/>
多个状态中重复通用的转移,可以把它定义为全局转移,这样流程中所有的状态都会默认拥有这个全局转移,示例如下:
<global-transitions> <transition on="cancel" to="endState"/> </global-transitions>
4.流程数据
(1)定义变量
(2)定义流程数据的作用域