spring web flow

Spring Web Flow 是一个web框架,适用于元素按规定流程运行的程序。是spring mvc的扩展,支持开发基于流程的应用程序。

一: Spring中使用web flow

1: 流程执行器 : 驱动流程的执行,当用户进入一个流程时,流程执行器会为用户创建并启动一个流程执行实例。当流程暂停的时候,流程执行器会在用户执行操作后恢复流程。

<flow : flow-executor id = "flowExecutor" flow-registry="flowRegistry" /> 元素会创建一个流程执行器

2: 配置流程注册表: 加载流程定义并让流程执行器能够使用他们

<flow : flow-registry id="flowRegistry" base-path = "/WEB-INF/flows">

<flow : flow-location-pattern value = "*-flow.xml"/>

</fow: flow-registry>

3: 处理流程请求 :

(1) FlowHandlerMapping来帮助DispatcherSerlet将流程请求发送给Spring Web Flow

<bean class = "org.springframework.webflow.mvc.servlet.FlowHandlerMapping">

<property name = "flowRegistry" ref = "flowRegistry">

</bean>

FlowHandlerMapping装配了流程注册表,通过流程id,它就能知道请求的URL匹配到流程上。

(2) FlowHandlerAdapter : 等同于Spring mvc的控制器。它会响应发送的流程请求并对其进行处理

<bean class = org.springframework.webflow.mvc.servlet.FlowHandlerAdapter>

<property name = "flowExecutor"  ref = "flowExecutor" />

</bean> 

二、流程的组件 :

状态 , 通过选择spring web flow 的状态几乎可以把任意的安排功能构造成会话式的web应用程序。

1: 视图状态 , 用来为用户展现信息并使用用户在流程中发挥作用。

<view-state id="welcome" view = "greeting">  用于定义视图状态。greeting是视图的名称

如果流程为用户展现了表单,你可能希望指名表单所绑定的对象。 

<view-state id = "takePayment"  model = " flowScope.paymentDetail">  流程范围内对象。

2:行为状态,一般会触发Spring所管理Bean的一些方法并根据方法调用的执行结果转移到另一个状态

<action-state id = saveOrder>

<eval expression = "pizzaFlowActions.saveOrder(order)" />

<transition to = "thankYou" />

</action-state>

3: 决策状态 : 能够使得在流程执行是产生两个分支。

<decision-state id = "checkDeliveryArea">

<if test = "pizzaFlowActions.checkDeliveryArea(customer.zipCode)"

then = "addCustomer" else ="deliveryWarning ">

</decision-state> 

4 : 子流程状态 : 允许在一个正在执行的流程中调用另一个流程

<subflow id = "order"  subflow = "pizza/order">

<input name = "order"  value = "order"/>

<transition on = "orderCreated" to = "payment"> 

</subflow-state>

<input> 元素作为子流程的输入被用于传递订单对象。 如果子流程结束的<end-state> 状态id为ordercreated,那么本流程将会转移到名为payment的状态

5: 结束状态 : 流程达到<end-state> 时 可能会有下面几种可能

1 :如果结束的流程时一个子流程,那么调用它的流程将会从<subflow-state> 处继续执行。

2 : 如果<end-state> 设置了view属性,指定的视图将会被渲染。

3:     不是上面两种,这个流程只是结束。

二、转移

使用<transition>元素来进行定义,它会作为各种状态元素的子元素

<transtion to="customerReady"> to 表示用于指定流程的下一个状态。

<transtion on="phoneEntered" to = "lookupCustomer"> on 表示触发的事件

全局转移 : 在创建完流程之后,你可能会发现有一些状态使用了一些通用的转移。使用<global-transitions>

三、流程数据 : 当流程从一个状态进行到另一个状态时,它会带走一些数据。

 声明变量  流程数据保存在变量中, 而变量可以在流程的任意地方进行引用。

1、<var name = "customer" class = "com.springinaction.pizza.domain.Customer" / > 这个变量可以在流程的任务状态进行访问。

2、<evaluate result =“viewScope.toppingsList” expression = "T(com.springinaction.pizza.domain.Topping).asList()"> 创建变量,作为行为状态的一部分或者视图状态的入口 表示是视图作用域

3、<set name = "flowScope.pizza" value = "new com.springinaction.pizza.domain.Pizza()">

猜你喜欢

转载自kayak2015.iteye.com/blog/2296740