1、Spring web flow 内置五种具体state 类型,这些state有常用控制器的行为,分别:
ViewState:允许用户参于流程flow
ActionState:执行业务应用代码
DecisionState:流程的路由选择
SubflowState:分发出子流程
EndState:中止流程
除EndState外,其它四个state类型均可流转到其它state类型中。类关系图如下:
2、ViewState
当进一个view state后,用户(或者其他外部客户端)就可以参与到这个flow中。这种参与的流程如下:
如果此view state配置了<render-actions>节点,先执行此元素里中action对应方法,然后此viewstate将 会生成一个作为逻辑应答的org.springframework.webflow.execution.ViewSelection发送给调用者。
flow execution在这里被“暂停”,控制被交还到调用系统那里。调用系统使用返回的ViewSelection来给用户 选择一个合适的操作界面(或者其他应答)。经过一段时间的“思考”之后,用户发送一个输入事件将flow 从"pasue“点恢复过来。
3、transition:
transition在flow中定义一条路径,它将flow从一个state带到另一个。后台对应的源码为TransitionDefinition。所有的TransitionAbleStates都有一个或者更多的transitions,每个都定义了到在同一个flow中另一个state的路径(或者递归的路径回到同一个state)。当进入一个transition state的时候,他会执行一系列的behavior。比如,一个叫做"Display Form"的TransitionableStates可以用来显示一个表单并暂停等待用户输入。这个state的执行结果叫做事件,用来驱动state的转移的执行。比如,用户可以点击表单的提交按钮,这个按钮会发送一个满足转移到“处理提交”状态条件的"submit event"xml配置中,在transition元素中可以配置action state
一个transition可以配置一个或者更多个在transition本身因为ecutionCriteria而执行前需要执行的action。如果一个或者多个Action没有成功完成,转移将不会进行
动态transitions (Dynamic transitions)
一个transition的目标state resolver可以被配置成计算动态目标状态 。 如:<transition on="back" to="${flowScope.lastStateId}">
全局transitions(Global transitions)
一个或者更多transition会被在state-level附带的加入到所有的TransitionableState 类型中去。同样,被所有state所共有的transition也可以在flow-level中加入。这种共有的转移就叫做全局转移。
当一个transitionable state收到一个事件后,他会首先尝试去匹配一个自己的transition,如果没有一个transition能够在 state level被满足,他将会去匹配global transition。如果仍然没有能够满足的transition,一个 NoMatchingTransition Exception将会被抛出。