Spring学习笔记4—流程(Spring Web Flow)

需要指出的是,不管设成 /shopping.do 还是设成 /shopping ,或者 /shopping.htm ,效果都是一样的, flowController 都会去找 id 为 shopping的flow来执行。

1.5 FlowBuilder Services

flow-builder-services 属性的配置指明了在这个 flow-registry “仓库”里的 flow 的一些基本特性,例如,是用 Unified EL 还是 OGNL 、 model (模型)对象中的数据在显示之前是否需要先作转换,等等。在本示例中,我们需要在 flow-builder-services 属性中指明 Spring Web Flow 中所用到的 view ,由 Spring Web MVC 的“ View Resolver ”来查找,由 Spring Web MVC 的“ View Class”来解析,最后呈现给用户。

所有这些配置的目的无非是两个:一是要让客户端的请求转变成 flow 的执行,二是要让 flow 执行过程中、或执行结束后得到的视图能返还给客户端。

2 Spring Web Flow的组件

Spring Web Flow中,流程是由3个主要元素定义的:状态、转移和流程数据。

2.1 状态

Spring Web Flow定义了5种不同类型的状态(state)——行为、决策、结束、子流程和视图状态。

除了结束状态外,其他状态都可以转换到别的状态,一般通过在状态中定义转移(transition) 来实现到其他状态的转换,转换的发生一般由事件(event)来触发。

2.1.1 视图状态

视图状态用来为用户展现信息并是用户参与流程。实际的视图可以是任意类型,但通常是用JSP来实现。

在流程XML文件中,使用定义视图状态。

View Code

2.1.2 行为状态

行为状态是程序自身在执行任务,一般情况下会触发Spring管理的Bean的一些方法并根据方法的返回结果转移到另一个状态。

在流程XML文件中,使用定义行为状态。

View Code

中一般都会有一个元素,元素指定了行为状态要做的事情。

2.1.3 决策状态

决策状态能够在流程执行时产生两个分支。判断一个Boolean类型的表达式,然后在两个状态中选择一个。

在流程XML文件中,使用定义决策状态。

View Code

2.1.4 子流程状态

子流程状态用于在一个正在运行的流程中调用另一个流程。

在流程XML文件中,使用定义子流程状态。

View Code

2.1.5 结束状态

结束状态用于结束一个流程。

在流程XML文件中,使用定义结束状态。

View Code

如果结束的是一个子流程,那么流程将会从父流程的处继续执行,子流程的ID将触发父流程的transition。

如果设置了view属性,则指定的视图将会被渲染,加“externalRedirect:”前缀将重定向到流程外部的页面,而加“flowRedirect:”将重定向到另一个流程中。

如果结束的流程既不是子流程也没有指定view属性,那这个流程只是会结束,浏览器将会加载流程的基本URL地址,开始一个新的流程实例。

2.2 转移

流程中除了结束状态,其余的每个状态至少需要有一个转移,这样才能够知道一旦这个状态完成时流程要去向哪里。状态也可以有多个转移。

转移使用元素来定义,它会用作各种状态元素(等)的子元素。

属性to用于指定流程的下一个状态。

属性on用于指定触发转移的事件。(还有一个on-exception属性本例中没有给出,它用于指定触发转移的异常)

当多个状态使用了同一个转移时,可以设置一个全局转移来简化代码。

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

2.3 流程数据

流程状态在转移的过程中可能会需要“捎带”一些数据,这些数据就是流程数据,流程数据存放在变量中,变量能以多种形式创建,并且可以设置作用域。

2.3.1 声明变量

在流程中创建变量的最简单形式是使用元素:

上面代码创建了一个Cart实例并放到了名为mycart的变量中。

使用或者元素也可以创建变量:

元素与元素很类似,都是将变量设置为表达式计算的结果。这里变量cart的作用域设置的是conversationScope,接下来介绍一下流程数据的作用域。

2.3.2 定义流程数据的作用域

Spring Web Flow定义了5种作用域,如下表:

范围

作用域和可见性

Conversation

在最高层的流程开始时创建,在最高层的流程结束时销毁。被最高层的流程和其所有的子流程共享

Flow

当流程开始时创建,在流程结束时销毁。只有在创建它的流程中是可见的

Request

当一个请求进入流程时创建,在流程返回时销毁

Flash

当流程开始时创建,在流程结束时销毁。在视图状态渲染后,它也会被清除

View

当进入视图状态时创建,当这个状态退出时销毁。只在视图状态内是可见的

当使用元素声明变量时,变量始终是Flow作用域的,也就是在Flow作用域内定义变量。当使用时,作用域通过name或result属性的前缀指定。

参考:

http://www.cnblogs.com/xwdreamer/archive/2011/11/10/2296939.html

http://blog.csdn.net/hejingyuan6/article/details/46508821

转载请注明出处