Spring Web Flow 笔记

在Spring 中配置 Web Flow

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:flow="http://www.springframework.org/schema/webflow-config"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/webflow-config http://www.springframework.org/schema/webflow-config/spring-webflow-config.xsd">
?
    <!-- 装配流程执行器,负责创建和执行流程 -->
    <flow:flow-executor id="flowExector" />
?
    <!-- 配置流程注册表,负责加载流程定义,供流程执行器使用 -->
    <flow:flow-registry id="flowRegistry" base-path="/WEB-INF/flows">
        <!-- 在 base-path 下查找所有匹配的文件作为流程定义 -->
        <flow:flow-location-pattern value="*-flow.xml"/>
    </flow:flow-registry>

    <!-- 帮助 Dispatcher 将流程请求发送给 Spring Web Flow -->
    <bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
        <property name="flowRegistry" ref="flowRegistry" />
    </bean>
?
    <!-- 负责响应流程的请求并进行处理 -->
    <bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
        <property name="flowExecutor" ref="flowExecutor" />
    </bean>
?
</beans>

流程的组件

1、状态

Spring Web Flow 定义了五种不同类型的状态

  • 行为(Action): 行为状态时流程逻辑发生的地方
  • 决策(Decision): 决策流程将流程分成两个方向,基于流程数据确定流程方向
  • 结束(End): 结束状态是流程的最后一站,进入此状态后流程终止
  • 子流程(Subflow): 子流程状态会在当前正在运行的流程上下文中启动一个新的流程
  • 视图(View): 视图状态会暂停流程并邀请用户参与流程

视图状态

视图状态用于为用户展现信息并使用户在流程中发挥作用。实际的视图通常是 JSP 来实现的

在 xml 中定义 <view-state id="welcomt" view="greeting" model="flowScope.paymentDetails" />

如果没有显示指定 view 属性,那么它的值与 id 相同

行为状态

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

在 xml 中定义

<action-state id="saveOrder">
    <evalute expression="pizzaFlowActions.saveOrder(order)" />
    <transition to="thankYou" />
</action-state>

决策状态

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

在 xml 中定义

<decision-state id="checkDeliveryArea">
    <if test="pizzFlowActions.checkDeliverArea(customer.zipCode)"
        then="addCustomer"
        else="deliveryWarning" />
</decision-state>

子流程状态

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

在 xml 中定义

<subflow-state id="order" subflow="pizza/order">
    <input name="order" value="order" />
    <transition on="orderCreated" to="payment" />
</subflow-state>

结束状态

结束状态指定了流程的结束

在 xml 中声明: <end-state id="customerReady" />

2、转移

转移连接了流程中的状态。流程中除结束状态之外的每个状态,至少都需要一个转移状态,分别对应于当前状态结束时可以执行的不同的路径

一般使用<transition>元素来进行定义,作为各种状态元素的的子元素(如上面之前定义内容)

<transition on="phoneEntered" to="lookupCustomer" />

on 属性指定触发转移的事件,to 属性指定流程的下一个状态,异常状态跳转是将on属性改为on-exception="CustomException"

如果转移在多个状态中被使用,可以定义一个全局转移,这样流程中的所有状态都默认拥有此转移

<global-transitions>
    <transition on="cancel" to="endState" />
</global-transitions>

3、流程数据

流程数据保存在变量中,而变量可以在流程的各个地方进行引用,它能够以多种方式创建

<var name="customer" class="com.pizza.domain.Customer" />,并且其中的 class 必须实现 Serializable 接口

创建一个新的 Customer 实例并将其放在 customer 变量中

<evaluate resul="viewScope.toppingsList" expression="T(com.pizza.domain.Topping).asList()" />

计算了一个 (SpEL) 表达式并将结果放到了名为 toppingsList 变量中

<set name="flowScope.pizza" value="com.pizza.domain.Pizza()" />

定义流程数据的作用域

Spring Web Flow 定义了五种不同作用域

  • Conversation: 最高层级的流程开始时创建,结束时销毁。被其及其所有子流程共享
  • Flow: 流程开始时创建,结束时销毁。只有在创建它的流程中可见
  • Request: 当一个请求进入流程时创建,流程返回时销毁
  • Flash: 流程开始时创建,结束时销毁。在视图状态渲染结束时被清除
  • View: 进入状态视图时创建,退出这个状态时销毁。只有在视图状态内可见

使用<var>元素声明变量时,变量始终是流程作用域的,也就是在定义变量的流程内有效

使用<set><evaluate>时,作用域通过 name 或 result 属性的前缀指定,如

<set name="flowScope.theAnswer" value="42" />

使用之前介绍的这些流程组件,即可将其组装起来形成一个成熟且完善功能的 web 流程

下面展示一个简单的流程文件(订购披萨流程)

<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/webflow
        http://www.springframework.org/schema/webflow/spring-webflow-2.3.xsd"
        start-state="identifyCustomer">
?
    <var name="order" class="pizza.domain.Order" />

    <!-- 调用顾客子流程 -->
    <subflow-state id="identifyCustomer" subflow="pizza/customer">
        <output name="customer" value="order.customer" />
        <transition on="customerReady" to="buildOrder" />
    </subflow-state>

    <!-- 调用订单子流程 -->
    <subflow-state id="buildOrder" subflow="pizza/order">
        <input name="order" value="order" />
        <transition on="orderCreated" to="takePayment" />
    </subflow-state>

    <!-- 调用支付子流程 -->
    <subflow-state id="takePayment" subflow="pizza/payment">
        <input name="order" value="order" />
        <transition on="paymentTaken" to="saveOrder" />
    </subflow-state>

    <!-- 保存订单 -->
    <action-state id="saveOrder">
        <evaluate expression="pizzaFlowActions.saveOrder(order)" />
        <transition to="thankCustomer" />
    </action-state>
?
    <!-- 感谢顾客 -->
    <view-state id="thankCustomer">
        <transition to="endState" />
    </view-state>

    <end-state id="endState" />

    <global-transitions>
        <transition on="cancel" to="endState" />
    </global-transitions>
?
</flow>
时间: 2024-10-03 03:03:31

Spring Web Flow 笔记的相关文章

Spring Web Flow 学习笔记(2)-流程的组件

1.在Spring Web Flow中,流程由三个主要元素定义的:状态.转移和流程数据. 状态是流程中事件发生的地点,类似公路旅行中停下来的地点,转移就类似与连接这些地点的公路 2.状态 Spring Web Flow 定义了5种不同类型的状态: 状态类型 作用 行为(Action) 是流程逻辑发生的地方 决策(Decision) 将流程分成两个方向,它会基于流程数据的评估结果确定流程的方向 结束(End) 是流程的最后一站,一旦进入End状态,流程就会结束 子流程(Subflow) 会在当前的

《Spring实战》学习笔记-第八章:使用Spring Web Flow

第四版的第八章内容与第三版基本一致. 本章内容: 创建会话式web应用程序 定义流程状态和行为 保护web流程 互联网的一个奇特之处就在于它很容易让人迷失.有如此多的内容可以查看和阅读,而超链接是其强大魔力的核心所在. 有时候,web应用程序需要控制web冲浪者的导向,引导他们一步步地访问应用.比如电子商务网站的付款流程,从购物车开始,应用程序会引导你依次经过配送详情.账单信息以及最终的订单确认. Spring Web Flow是一个web框架,它适用于元素规定流程运行的程序.本章中,我们将会探

Spring Web Flow 学习笔记(1)

1.Spring Web Flow 是Spring MVC的扩展,它支持开发基于流程的应用程序,它将流程的定义与实现流程的行为的类和视图分离开来. 2.尽管Spring web Flow是Spring框架的子项目,但它并不是Spring框架的一部分. 3.在Spring中使用Web Flow (1)织入流程执行器 流程执行器驱动流程的执行,当用户进入一个流程时,流程执行器会为用户创建并启动一个流程执行实例,当流程暂停的时候,(如为用户展示视图的时候),流程执行器会在用户执行操作后恢复流程.创建流

Spring web flow 配置文件

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/s

Spring Web Flow 入门demo(一)附源码

Spring Web Flow (SWF)是Spring Framework的一个脱离模块.这个模块是Spring Web应用开发模块栈的一部分,Spring Web包含Spring MVC. Spring Web Flow的目标是成为管理Web应用页面流程的最佳方案.当你的应用需要复杂的导航控制,例如向导,在一个比较大的事务过程中去指导用户经过一连串的步骤的时候,SWF将会是一个功能强大的控制器. 下面我们还是从一个简单的demo开始了解它: 这个例子是结合Springmvc来实现,项目结构:

Spring web flow——披萨订购流程示例(1)

一.Spring web Flow定义 Spring Web Flow(后面简称swf)是一个Web框架,它适用于元素按规定流程运行的程序.Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程序.它将流程的定义于实现流程行为的类和视图分离开来. 下面我们通过生成披萨订单的新Web应用程序.我们会使用Spring Web Flow来定义订单流程. 1.1 swf环境准备 尽管swf是Spring框架的子项目,但它并不是Spring框架的一部分.因此,在构建基于流程

Spring Web Flow 入门demo(三)嵌套流程与业务结合 附源码

上篇博客我们说Spring web Flow与业务结合的方式主要有三种,下面我们主要介绍一下第三种的应用方式 3,执行到<action-state> 元素 SpringWeb Flow 中的这个 <action-state> 是专为执行业务逻辑而设的 state .如果某个应用的业务逻辑代码既不适合放在transition 中由客户端来触发,也不适合放在 Spring Web Flow 自定义的切入点,那么就可以考虑添加<action-state> 元素专用于该业务逻辑

spring web flow 2.0入门(转:http://luanxiyuan.iteye.com/blog/2282126)

Spring Web Flow 2.0 入门详解 博客分类: spring 目录: 参考文献 购物车用例 什么情况下可以使用 Spring Web Flow? 配置 Spring Web MVC 配置 Spring Web Flow 2.0 的基础 在购物车示例应用中配置 Spring Web Flow 用 Unified EL 实现业务逻辑 用 subflow 实现添加商品到购物车功能 global transition 简介 1.参考文献 参考1:http://www.ibm.com/dev

Spring Web Flow 入门demo(二)与业务结合 附源码

第一部分demo仅仅介绍了简单的页面跳转,接下来我们要实现与业务逻辑相关的功能. 业务的逻辑涉及到数据的获取.传递.保存,相关的业务功能函数的调用等内容,这些功能的实现都可用Java 代码来完成,但定义 Spring Web Flow 的语法与 Java 是无关的,这就要求 Spring Web Flow 提供与 Java代码的整合机制.要了解这种机制,关键在于搞清楚两个问题: 业务逻辑代码在什么时候被调用? 业务逻辑代码在调用后得到的数据如何保存.传递? 业务逻辑代码在什么时候被调用? 在 S