Spring 实战-第八章-使用Spring Web Flow
Spring Web Flow 是 Spring 的一个子项目,其最主要的目的是解决跨越多个请求的、用户与服务器之间的、有状态交互问题,比较适合任何比较复杂的、有状态的、需要在多个页面之间跳转的业务过程。
配置SWF需要
- 装配流程执行器(flow executor)
执行器驱动流程的执行,当用户进入流程时,流程执行器会为用户创建并启动一个流程执行实例,当流程暂停的时候(如为用户展示视图时),流程执行器会在用户执行操作后恢复流程。
<!--Execute flows:the entry point into the Spring Web Flow system--> <flow:flow-executor id="flowExecutor"/> <!--Dispatches requests mapped to flows to FlowHandler implementations--> <bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter"> <property name="flowExecutor" ref="flowExecutor"/> </bean>
- 配置流程注册表
流程注册表的工作室加载流程定义并让流程执行器能够使用它们。
<!--The reigistry of executable flow definitions--> <flow:flow-registry id="flowRegistry" base-path="/WEB-INF/flows"> <flow:flow-location-pattern value="/**/*-flow.xml"/> </flow:flow-registry>
- 处理流程请求
DispatcherServlet会将请求分发给控制器,SWF中需要一个FlowHandlerMapping来帮助DispatcherServlet将流程请求发送给SWF。
<!--Maps request paths to flows in the flowRegistry--> <bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping"> <property name="flowRegistry" ref="flowRegistry"/> </bean>
FlowHandlerMapping装配了流程注册表的引用,这样就知道如何将请求的URL匹配到流程上。比如请求"/pizza",就会找WEB-INF/pizza目录下的流程。
在Spring Web Flow 中,流程是由三个主要元素定义的:状态、转义和流程数据。
- 状态(State)是流程中时间发生的地点。
状态类型 | 功能 | 标签 |
---|---|---|
行为(Action) | 行为状态是流程逻辑发生的地方 | <action-state> |
决策(Decision) | 决策状态将流程分成两个方向,它会基于流程数据的评估结果确定流程方向 | <decision-state> |
结束(End) | 结束状态是流程的最后一站,一旦进入End状态,流程就会终止 | <end-state> |
子流程(Subflow) | 子流程状态会在当前正在运行的流程上线文中启动一个新的流程 | <subflow-state> |
视图(View) | 视图状态会暂停流程并邀请用户参与流程 | <view-state> |
Spring Web Flow 定义了 5 个切入点,通过 flow 定义文件的配置,可在这 5 个切入点插入相关业务逻辑代码。
<view-state id="viewCart" view="viewCart" > <on-render> <evaluate expression="productService.getProducts()" result="viewScope.products"/> </on-render> </view-state>
- 转移(transition)是流程的连接不同状态的动作。
<transition on="cancel" to="cancel"/>
属性to用于指定流程的下一个状态,属性on指定触发转移的事件。
转移连接了流程中的状态,除了结束状态之外的每个状态,至少都需要一个转移。状态可以有多个转移,分别对应于当前状态结束时可以执行的不同路径。
此外,还可以定义全局转移,使的流程中的所有状态都会默认用于某个转移。
<global-transitions> <transition on="cancel" to="endState"/> </global-transitions>
- 流程数据
流程数据保存在变量中,而变量可以在流程的各个地方进行引用。可以使用
- <var>:最简单的形式,作用域为整个流程
- <evaluate>:计算了一个表达式并将结果放到了变量中
<evaluate expression="pizzaFlowActions.lookupCustomer(requestParameters.phoneNumber)" result="order.customer"/>
- <set>:与<evaluate>类似,都是将变量设置为表达式。
Spring Web Flow 定义了五种不同的作用域:
范围 | 生命作用域和可见性 |
---|---|
Conversion |
最高层级的流程开始时创建,在最高层级的力促恒结束时销毁。被最高层级的流程和其所有的子流程所共享。 |
Flow | 当流程开始时创建,在流程结束时销毁。只有在创建它的流程中是可见的。 |
Request | 当一个请求进入流程时创建,在流程返回时销毁 |
Flash | 当流程开始时创建,在流程结束时销毁。在视图状态渲染后,它也会被清除。 |
View | 当进入视图状态时创建,当这个状态退出时销毁。只在视图状态内是可见的。 |
1
sourceCode:https://github.com/ljw8947/SpringInAction/tree/master/Capter8/Spizza
posted on 2017-12-01 18:23 Lv Jianwei 阅读(6068) 评论(0) 编辑 收藏 举报