Spring WebFlow(二)

来源:互联网 发布:c语言switch语句例子 编辑:程序博客网 时间:2024/06/14 17:35
导读

流程组件中主要为三种:状态、转移、流程数据。三者是流程不可或缺的要素。


状态 

流程中事件发生的地点,业务逻辑执行,做出决策或者将页面展示给用户。

1、视图

为用户展现信息并使用户在流程中发挥作用。实际的视图实现可以是Spring支持的任意视图类型,但通常是用JSP来实现的。

让一个节点显示的视图,使用view属性

<view-state id="step1" view="views/step1.jsp" >

让流程中节点为用户展示表单,需要使用model属性

<varname="person" class="net.tjeerd.springwebflowwizard.model.Person"/>

<view-state id="step1" view="views/step1.jsp" model="person">

2、行为

行为状态一般会触发Spring所管理Bean的一些方法,并跟你讲方法调用的执行结果转移到另一个状态。

<action-state>元素一般都有一个<evaluate>子元素,该元素给出了行为状态要做的事情,expression属性指定了进入这个状态时要评估的表达式。本例中,给出的是SpEL表达式,这表明它将会找到IDpizzaFlowActionsBean,并调用其saveOrder()方法

<action-state id="saveOrder">

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

    <transition to="thankYou" />

</action-state>

 

还有一种定义行为的方式,参考如下

<action-state id="reversePlace">

        <set name="person" value="wizardFlowActions.reversePlace(person)"/>

        <transition to="step5"/>

    </action-state>

3、决策

在流程执行时产生两个分支,它会评估一个Boolean表达式,根据结果是true还是false在两个状态转移中选择一个进入。

在流程定义文件中,使用<decision-state>元素来定义决策状态

<decision-state id="checkDeliveryArea">

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

        then="addCustomer"

        else="deliveryWarning" />

</decision-state>

4、子流程

流程逻辑可能要分散到多个类、方法等其他结构中。同样的,将流程分成独立的部分也是个不错的主意。<subflow-state>元素允许在一个正在执行的流程中调用另一个流程。

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

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

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

</subflow-state>

<input>元素作为子流程的输入被用于传递订单对象。

5、结束

流程执行的终点,当流程到达<end-state>时,流程就会结束。接下来发生什么要取决于以下几个因素:

1、  如果结束的流程是个子流程

那么调用它的流程将会从<subflow-state>处继续执行。<end-state>的ID将会用作事件触发从<subflow-state>开始的转移。

2、  如果<end-state>设置了view属性,那么就会渲染指定的视图。

视图可以是相对于流程的路径,也可以是流程模板:

使用externalRedirect:前缀的会重定向到流程外部的页面

使用flowRedirect:前缀的则会重定向到另外一个流程

3、  如果结束的流程不是子流程也没有配置view属性,那么这个流程就会结束。


转移

在状态完成时指定流程的走向。

通过<transition>元素来定义,作为其他状态元素(<action-state>、<view-state>和<subflow-state>)的子元素。最简单的形式就是<transition>元素在流程中指定下一个状态:

<action-state id="reversePlace">

        <set name="person" value="wizardFlowActions.reversePlace(person)"/>

        <transition to="step5"/>

    </action-state>

1、基于事件的触发来进行的

1、在视图状态,事件通常会是用户采取的动作。

2、在行为状态,事件是评估表达式得到的结果。

3、在子流程状态,事件取决于子流程结束状态的ID

在节点执行中,可以使用on属性来指定触发转移的事件:

<view-state id="step4" view="views/step4.jsp" model="person">

        <attribute name="description" value="Fourth step"/>

        <transition on="submitNext" to="reversePlace" bind="true"/>

        <transition on="submitPrevious" to="step3" bind="false"/>

    </view-state>

2、有异常抛出,处理转移

<transition on-exception="com.springinaction.pizza.service.CustomerNotFoundException"

    to="registrationForm" />

3、全局转移

如果整个流程都需要一个转移,我们就可以定义一个全局的转移

<global-transitions>

        <transition on="submitCancel" to="cancel" bind="false" />

        <transition on-exception="java.lang.Exception" to="exception"/>

    </global-transitions>

配置了异常全局转移,无论哪个节点发生异常,都将转移到exception


流程数据

1、声明变量

流程数据是保存在变量中的,而变量可以在流程的任意位置进行引用,并且可以以多种方式进行创建.

<var>创建变量

<!-- 这个变量可以在流程的任意状态下进行访问使用 -->

    <var name="person" class="net.tjeerd.springwebflowwizard.model.Person"/>

    <var name="exception" class="java.lang.Exception"/>

这个变量可以在流程的任意状态下进行访问使用。

<evaluate>创建变量

<evaluate result="viewScope.toppingsList"

    expression="T(com.springinaction.pizza.domain.Topping).asList()" />

将结果放到toppingsList变量中,这个变量是视图作用域的。

<set>创建变量

<!-- 流程逻辑处理节点 -->

    <action-state id="reversePlace">

        <set name="person" value="wizardFlowActions.reversePlace(person)"/>

        <transition to="step5"/>

    </action-state>

2数据作用域

流程中所携带的数据都有其各自的生命周期,这取决于保存数据的变量本身的作用域。

使用<var>元素声明变量时,变量始终是流程作用域的,也就是在流程作用域内定义变量。使用<set><evaluate>时,作用域通过nameresult属性的前缀指定。


总结:

它解决了困扰Web应用程序开发人员的3个主要问题.即用户界面导航的控制、状态管理和模块化,极大地提高了生效率,尤其适合需要复杂用户交互界面的Web应用程序


多多指教!
0 0
原创粉丝点击