Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序。Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程序。它将流程的定义与实现流程行为的类和视图分离开来。

Spring Web Flow是构建于Spring MVC基础之上的,这意味着所有的流程请求都需要先经过Spring MVC的DispatcherServlet。

目前还不支持在Java中配置Spring Web Flow,所以只能在xml中进行配置。

在上下文定义XML文件中添加命名空间声明

<?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/webflow-config
http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.3.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd ">
</beans>

流程控制器(flow executor)驱动流程的执行。当用户进入一个流程时,流程执行器会为用户创建并启动一个流程执行实例。当流程暂停的时候,流程执行器会在用户执行操作后恢复流程。流程执行器负责创建和执行流程,流程注册表负责加载流程定义。

创建流程执行器

<flow:flow-executor id="flowExecutor">

流程注册表(flow registry)的工作是加载流程定义并让流程执行器能够使用它们。可以在<flow:folw-registry>配置流程注册表

<!-- 流程注册表会在/WEB-INF/flows目录下查找流程定义  -->

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

  <!-- flow-location-pattern元素: 所有的流程都是通过其ID来进行引用的,流程的ID是相对于base-path的路径或双星号所代表的路径 -->

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

  <!-- flow-location直接指明了流程定义文件 -->

  <flow:flow-location id="pizza" path="/WEB-INF/flows/springpizza.xml" />

</flow:flow-registry>

处理流程请求

  需要一个FlowHandlerMapping来帮助DispatcherServlet将请求发送给Spring Web Flow。

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

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

</bean>

FlowHandlerMapping装配了流程注册表的引用,这样他就能知道如何将请求的URL匹配到流程上。然而,FlowHanlderMapping的工作仅仅是将流程请求定向到Spring Web Flow上,相应请求的是FlowHandlerAdapter。FlowHanlderAdapter等同于Spring MVC控制器,他会响应发送的流程请求并对其进行处理。FlowHanlderAdapter可以转配成一个Spring bean

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

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

</bean>

处理适配器是DispatcherServlet和Spring Web Flow之间的桥梁。它会处理流程请求并管理基于这些请求的流程。

在Spring Web Flow中,流程是由三个主要元素定义的:状态、转移和流程数据。状态(State)是流程中时间发生的地点。流程中的状态是业务逻辑执行、做出决策或将页面展现给用户的地方。在流程中,通过转移的方式从一个状态到另一个状态。流程数据就是流程当前的状况。

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

行为(Action)    行为状态是流程逻辑发生的地方

决策(Decision)     决策状态将流程分成两个方向,它会基于流程数据的评估结果确定流程方向

结束(End)      结束状态是流程的最后一站。一旦进入End状态,流程就会终止

子流程(Subflow)  子流程状态会在当前正在运行的流程上下文中启动一个新的流程

视图(View)      视图状态会暂停流程并邀请用户参与流程

视图状态

  用于为用户展现信息并使用户在流程中发挥作用。实际的视图实现可以是Spring支持的任意视图类型。使用<view-state>标签来定义视图状态。

  <view-state id="welcome" /> --- id有两个含义,一是指定这个视图的状态,而是说明要展现的逻辑视图名为welcome

  <view-state id="takePayment" view="takePayment" model="flowScope.paymentDetais" /> --- 将视图中的表单绑定流程作用于内的paymentDetails对象

行为状态

  视图状态会涉及到流程应用程序的用户,而行为状体则是应用程序自身在执行任务。行为状态一般会出发Spring所管理bean的一些方法并根据方法调用的执行结果转移到另一个状态。使用<action-state>元素来声明行为状态。

<action-state id="saveOrder">

  <!--- evaluation给出了行为状态要做的事情,expression属性指定了进入这个状态时要评估的表达式,express是SpEL表达式,它会根据ID为pizzaFlowActions的bean并调用saveOrder()方法->

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

  <transition to="thankYou" />

</action-state>

决策状态

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

<decision-state id="checkDiliveryArea">

  <if test="pizzaFlowActions.checkDeliveryArea(custiomer.zipCode)"  then="addCustomer" else="deliveryWarning" />
</decision-state>

子流程图

  子流程图允许在一个正在执行的流程中调用另一个流程。<subflow-state>元素表示子流程图。

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

  <!-- input元素用于传递订单对象作为子流程的输入,如果子流程结束的<end-state>状态ID为orderCreated,流程将会转移到名为payment的状态 -->

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

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

</subflow-state>

结束状态

  <end-state>元素指定了流程的结束。

  <end-state id="customerReady" />

  当到达<end-state>状态时,可能会发生如下事情:  

    如果结束的流程是一个子流程,那调用他的流程将会从<subflow-state>处继续执行。<end-state>的ID将会用作时间出发从<subflow-state>开始的转移

    如果<end-state>设置了view属性,指定的视图将会被渲染,视图可以是相对于流程路径的视图模板,如果添加了"externalRedirect:"前缀的话,将会重定向到流程外部的页面,若添加"flowRedirect:"将重定向到另一个流程中

    如果结束的流程不是子流程,也没有指定view属性,那这个流程只是会结束而已。浏览器最后将会加载流程的基本URL地址,当前已没有的活动流程,所以会开始一个新的流程

转移

  转移连接了流程中的状态。转移使用<transition>元素来进行定义,它会作为各种状态元素的子元素。

  <!-- to指定了流程的下一个状态  -->

  <transition to="customerReady" />

  <!--  on属性来指定出发转移的事件  -->

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

  <!-- on-exception属性指定当发生异常时转移事件 -->

  <transition on-exception="com.springinaction.piazz.service.CustomerNotFoundException" to="registerForm" />

全局转移

  可以将<transition>元素作为<global-transitions>的子元素,把它们定义为全局转移

  <global-transitions>

    <transition on="cancel" to="endState" />

  </global-transitions>

流程数据

  声明变量

    流程数据保存在变量中,而变量可以在流程的各个地方进行引用。<var>元素是创建变量的最简单形式

    <var name="customer" class="com.springinaction.pizza.domain.Customer"/>

    作为行为状态的一部分或者作为视图状态的入口,可以使用<evluate>元素来创建变量。将变量设置为表达式计算的结果

    <evaluate result="viewScope.toppingsList" expression="T{com.springinaction.pizza.domain.Topping}.asList()" />

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

定义流程数据的作用域

  流程中携带的数据会拥有不同的生命作用域和可见性,这取决于保存数据的变量本身的作用域。Spring Web Flow定义了物种不同的作用域

  Conversation  最高层级的流程开始时创建的,在最高层级的流程结束时销毁。被最高层级的流程和其所有的子流程所共享  

  Flow  当流程开始时创建,在流程结束时销毁。只有在创建它的流程中是可见的

  Request  当一个请求进入流程时创建,在流程返回时销毁

  Flash  当流程开始时创建,在流程结束时销毁。在视图状态渲染后,他也会被清除

  View  当进入视图状态时创建,当这个状态退出时销毁。只在视图状态内是可见的

<var>元素声明变量时,变量始终是流程作用域的。当使用<set><evaluate>时,作用域通过name或result的前缀指定。

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

Spring Web Flow的更多相关文章

  1. Spring Web Flow使用

    就当我写(嘘,抄)着玩的. 使用Spring框架的一个子项目--Spring Web Flow来建立和管理Web应用和UI流程. 第一节:使用Spring Web Flow在一个Spring MVC应 ...

  2. Spring Web Flow 简介

    Spring Web Flow 简介 博客分类: 转载 SSH 最近在TSS上看到了一片介绍Spring Web Flow的文章,顺便就翻译了下来,SWF的正式版估计要到6月份才能看到了,目前的例子都 ...

  3. spring web flow 2.0入门(转)

    Spring Web Flow 2.0 入门 一.Spring Web Flow 入门demo(一)简单页面跳转 附源码(转) 二.Spring Web Flow 入门demo(二)与业务结合 附源码 ...

  4. Spring web flow的意义

    为什么要使用Spring web flow呢? 这里需要强调的一点就是,但凡一个技术的出现和流行,必有其适用的环境和存在的意义. Spring web flow加强了中央集权,这个该怎么理解呢?以往我 ...

  5. 第8章—使用Spring Web Flow—Spring Web Flow的配置

    Spring中配置Web Flow Spring Web Flow 是 Spring 的一个子项目,其最主要的目的是解决跨越多个请求的.用户与服务器之间的.有状态交互问题,比较适合任何比较复杂的.有状 ...

  6. spring in action 8.1 使用Spring web flow

    一.说明 Spring Web Flow是spring MVC的扩展,它支持基于流程的应用程序,他将流程的定义和实现流程行为的类和视图分离开来. 1.1 spring中配置web flow,目前需要在 ...

  7. 第08章-使用Spring Web Flow

    使用Spring Web Flow Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程序.它将流程的定义与实现流程行为的类和视图分离开来. 1 在Spring中配置 ...

  8. Spring实战第八章学习笔记————使用Spring Web Flow

    Spring实战第八章学习笔记----使用Spring Web Flow Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序. 其实我们可以使用任何WEB框架写流程化的应 ...

  9. Spring学习笔记4—流程(Spring Web Flow)

    Spring Web Flow是Spring框架的子项目,作用是让程序按规定流程运行. 1 安装配置Spring Web Flow 虽然Spring Web Flow是Spring框架的子项目,但它并 ...

随机推荐

  1. pycharm下打开、执行并调试scrapy爬虫程序

    首先得有一个Scrapy项目,我在Desktop上新建一个Scrapy的项目叫test,在Desktop目录打开命令行,键入命令:scrapy startproject test1  目录结构如下: ...

  2. HDU-2874-森林求LCA/tarjan

    http://acm.hdu.edu.cn/showproblem.php?pid=2874 给出一个森林,询问任意两点最短距离. tarjan跑一遍即可,就是这个题卡内存,vector会MLE,换前 ...

  3. 15. 3Sum C++

    参考资料: https://leetcode.com/problems/3sum/discuss/7402/Share-my-AC-C%2B%2B-solution-around-50ms-O(N*N ...

  4. 51Nod 1001 数组中和等于K的数对

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1001一开始的想法是排序后二分搜索,发现会进行非常多不必要的遍历,十分耗时 ...

  5. 迭代器与泛型for

    迭代器与closure function allwords() local line=io.read() return function() while line do local s,e=strin ...

  6. Linux五种IO模型(同步 阻塞概念)

    Linux五种IO模型 同步和异步 这两个概念与消息的通知机制有关. 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.比如,调用readfrom系统调用时,必须等待IO操 ...

  7. git rebase commit 信息处理

    pick:正常选中 reword:选中,并且修改提交信息: edit:选中,rebase时会暂停,允许你修改这个commit(参考这里) squash:选中,会将当前commit与上一个commit合 ...

  8. Qt动态布局

    QVBoxLayout *m_pvLayout = NULL: QWidget *m_pWidgetPlay = NULL: m_pvLayout = new QVBoxLayout(this); m ...

  9. Win10系列:UWP界面布局基础2

    属性设置 在面向对象程序开发中,所提及的属性通常指的是对象的属性.在XAML代码中,定义元素时也可以为其设置属性,例如对于一个TextBox元素,有背景属性.宽度属性和高度属性等.为了满足实际应用的需 ...

  10. Java中的 JDK下载和环境配置(方式一)

    第一步:需要安装JDK. JDK下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151 ...