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

原文地址:https://www.cnblogs.com/lvjianwei/p/7943604.html