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

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

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

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:flow="http://www.springframework.org/schema/webflow-config"
  5. xsi:schemaLocation="http://www.springframework.org/schema/webflow-config
  6. http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.3.xsd
  7. http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd ">
  9. </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. leetcode-algorithms-2 Add Two Numbers

    leetcode-algorithms-2 Add Two Numbers You are given two non-empty linked lists representing two non- ...

  2. Leetcode 117

    if(root == NULL) return; queue<TreeLinkNode *> que; que.push(root); while(!empty(que)){ int le ...

  3. Python的time和datetime

    #python中时间日期格式化符号 %y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01-12) %d 月内中的一天(0-31) %H 24小时制小时数( ...

  4. 音频 API 一览

    iOS 和 OS X 平台都有一系列操作音频的 API,其中涵盖了从低到高的全部层级.随着时间的推移.平台的增长以及改变,不同 API 的数量可以说有着非常巨大的变化.本文对当前可以使用的 API 以 ...

  5. List Available DBCC Commands

    DBCC Commands or Database Consistency Checker commands have been with SQL Server from its early ages ...

  6. 使用VAE、CNN encoder+孤立森林检测ssl加密异常流的初探——真是一个忧伤的故事!!!

    ssl payload取1024字节,然后使用VAE检测异常的ssl流. 代码如下: from sklearn.model_selection import train_test_split from ...

  7. 【oracle常见错误】ora-00119和ora-00132问题的解决方法

    oracle11g安装后,本地无法登录!前提:服务全部打开,监听也配置好了! win7 64位 oracle 11g 简单的sql命令: 先登录到sqlplus:sqlplus/nolog; 登录数据 ...

  8. learning ddr seft-refresh mode summary

  9. learning scala read from file

    scala读文件:   example: scala> import scala.io.Sourceimport scala.io.Source scala> var inputFile ...

  10. IOS应用内支付IAP从零开始详解

    前言 什么是IAP,即in-app-purchase 这几天一直在搞ios的应用内购,查了很多博客,发现几乎没有一篇博客可以完整的概括出所有的点,为了防止大伙多次查阅资料,所以写了这一篇博客,希望大家 ...