在Spring Web Flow中,流程是由三个主要元素定义的:状态、转移和 流程数据。

一、状态

  Spring Web Flow定义了五种不同类型的状态。通过选择Spring Web Flow的状态几乎可以把任意的安排功能构造成会话式的Web应用。

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

1.1 视图状态

  视图状态用于为用户展现信息并使用户在流程中发挥作用。实际的视 图实现可以是Spring支持的任意视图类型,但通常是用JSP来实现的。 在流程定义的XML文件中,<view-state>用于定义视图状态:

  在这个简单的示例中,id属性有两个含义。它在流程内标示这个状 态。除此以外,因为在这里没有在其他地方指定视图,所以它也指定 了流程到达这个状态时要展现的逻辑视图名为welcome。 如果显式指定另外一个视图名,那可以使用view属性做到这 一点:

  如果流程为用户展现了一个表单,如果要指明表单所绑定的对象,可以设置model属性:

1.2 行为状态

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

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

1.3 决策状态

  有可能流程会完全按照线性执行,从一个状态进入另一个状态,没有 其他的替代路线。但是更常见的情况是流程在某一个点根据流程的当 前情况进入不同的分支。决策状态能够在流程执行时产生两个分支。决策状态将评估一个 Boolean类型的表达式,然后在两个状态转移中选择一个,这要取决 于表达式会计算出true还是false。在XML流程定义中,决策状态 通过<decision-state>元素进行定义。典型的决策状态示例如下 所示:

1.4 子流程状态

  将流程分成独立的部分。<subflow-state> 允许在一个正在执行的流程中调用另一个流程。这类似于在一个方法 中调用另一个方法。<input>元素用于传递订单对象作为子流程的输入。如果 子流程结束的<end-state>状态ID为orderCreated,那么流程将 会转移到名为payment的状态。 

1.5 结束状态

  最后,所有的流程都要结束。这就是当流程转移到结束状态时所做 的。<end-state>元素指定了流程的结束,它一般会是这样声明 的:

当到达<end-state>状态,流程会结束。接下来会发生什么取决于 几个因素:

    • 如果结束的流程是一个子流程,那调用它的流程将会从 <subflow-state>处继续执行。<end-state>的ID将会用作 事件触发从<subflow-state>开始的转移。
    • 如果<end-state>设置了view属性,指定的视图将会被渲染。 视图可以是相对于流程路径的视图模板,如果添 加“externalRedirect:”前缀的话,将会重定向到流程外部的 页面,如果添加“flowRedirect:”将重定向到另一个流程中。
    • 如果结束的流程不是子流程,也没有指定view属性,那这个流 程只是会结束而已。浏览器最后将会加载流程的基本URL地址, 当前已没有活动的流程,所以会开始一个新的流程实例。

需要注意的是流程可能会有不止一个结束状态。子流程的结束状态ID确 定了激活的事件,所以你可能会希望通过多种结束状态来结束子流 程,从而能够在调用流程中触发不同的事件。即使不是在子流程中, 也有可能在结束流程后,根据流程的执行情况有多个显示页面供选 择。

二、转移

  转移连接了流程中的状态。流程中除结束状 态之外的每个状态,至少都需要一个转移,这样就能够知道一旦这个 状态完成时流程要去向哪里。状态可以有多个转移,分别对应于当前 状态结束时可以执行的不同的路径。 转移使用<transition>元素来进行定义,它会作为各种状态元素 (<action-state>、<view-state>、<subflow-state>)的 子元素。最简单的形式就是<transition>元素在流程中指定下一 个状态:

属性to用于指定流程的下一个状态。如果<transition>只使用了 to属性,那这个转移就会是当前状态的默认转移选项,如果没有其 他可用转移的话,就会使用它。

  更常见的转移定义是基于事件的触发来进行的。在视图状态,事件通 常会是用户采取的动作。在行为状态,事件是评估表达式得到的结 果。而在子流程状态,事件取决于子流程结束状态的ID。在任意的事 件中,你可以使用on属性来指定触发转移的 事件:

如果触发了phoneEntered事件,流程将会进 入lookupCustomer状态。 在抛出异常时,流程也可以进入另一个状态。例如,如果顾客的记录 没有找到,你可能希望流程转移到一个展现注册表单的视图状态。以 下的代码片段显示了这种类型的转移:

属性on-exception类似于on属性,只不过它指定了要发生转移的 异常而不是一个事件。在本示例 中,CustomerNotFoundException异常将导致流程转移 到registrationForm状态。 

*全局转移

如果多个状态中都复用转移,则可以将<transition> 元素作为<global-transitions>的子元素,把它们定义为全局转 移。

在定义完这个全局转移后,流程中的所有状态都会默认拥有这个cancel转移。

三、流程数据

当流程从一个状态进 行到另一个状态时,它会带走一些数据。有时候,这些数据只需要很 短的时间(可能只要展现页面给用户)。有时候,这些数据会在整个 流程中传递并在流程结束的时候使用。

1.声明变量

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

这里,创建了一个新的Customer实例并将其放在名为customer的 变量中。这个变量可以在流程的任意状态进行访问。作为行为状态的一部分或者作为视图状态的入口,你有可能会使 用<evaluate>元素来创建变量。例如:

 在本例中,<evaluate>元素计算了一个表达式(SpEL表达式)并 将结果放到了名为toppingsList的变量中,这个变量是视图作用 域的。 

类似地,<set>元素也可以设置变量的值:

<set>元素与<evaluate>元素很类似,都是将变量设置为表达式计 算的结果。这里,我们设置了一个流程作用域内的pizza变量,它的 值是Pizza对象的新实例。 

2. 变量的作用域

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

当使用<var>元素声明变量时,变量始终是流程作用域的,也就是在 定义变量的流程内有效。当使用<set>或<evaluate>的时候,作用 域通过name或result属性的前缀指定。例如,将一个值赋给流程作 用域的theAnswer变量:

笔记37 Spring Web Flow——流程的组件的更多相关文章

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

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

  2. 笔记39 Spring Web Flow——订单流程(收集顾客信息)

    如果你曾经订购过披萨,你可能会知道流程.他们首先会询问你的电 话号码.电话号码除了能够让送货司机在找不到你家的时候打电话给 你,还可以作为你在这个披萨店的标识.如果你是回头客,他们可以 使用这个电话号 ...

  3. 笔记38 Spring Web Flow——订单流程(定义基本流程)

    做一个在线的披萨订购应用 实际上,订购披萨的过程可以很好地定义在一个流程中.我们首先从 构建一个高层次的流程开始,它定义了订购披萨的整体过程.接下 来,我们会将这个流程拆分成子流程,这些子流程在较低的 ...

  4. 笔记42 Spring Web Flow——Demo(2)

    转自:https://www.cnblogs.com/lyj-gyq/p/9117339.html 为了更好的理解披萨订购应用,再做一个小的Demo. 一.Spring Web Flow 2.0新特性 ...

  5. 笔记43 Spring Web Flow——订购披萨应用详解

    一.项目的目录结构 二.订购流程总体设计 三.订购流程的详细设计 1.定义基本流程pizza-flow.xml <?xml version="1.0" encoding=&q ...

  6. 笔记41 Spring Web Flow——Demo

    订购披萨的应用整体比较比较复杂,现拿出其中一个简化版的流程:即用户访问首页,然后输入电话号(假定未注册)后跳转到注册页面,注册完成后跳转到配送区域检查页面,最后再跳转回首页.通过这个简单的Demo用来 ...

  7. 笔记36 Spring Web Flow——配置

    Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序.Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程 序.它将流程的定义与实现流程行 ...

  8. 笔记40 Spring Web Flow——订单流程(构建订单)

    二.订单子流程 在识别完顾客之后,主流程的下一件事情就是确定他们想要什么类型 的披萨.订单子流程就是用于提示用户创建披萨并将其放入订单中 的,如下图所示. showOrder状态位于订单子流程的中心位 ...

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

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

随机推荐

  1. input输入框数字转带千分位的字符串

    数字转带千分位的字符串 思路 先获取要转换的数字,对其进行分割 小数部分具体需要保留多少位,具体处理 整数部分用正则做替换 将小数部分和整数部分合计 代码 注意: 本文是基于 jQuery 写的,稍稍 ...

  2. android 数据异步加载

    public class MainActivity extends Activity { ListView listView; File cache; //访问其他线程在当前线程中存放的数据 Hand ...

  3. MVC+EF三层+抽象工厂

    MVC+EF三层+抽象工厂项目搭建   注意:项目经过两次搭建,所以截图中顶级命名空间有ZHH和ZHH2区别,但是架构的内容是一样的,可以将ZHH和ZHH2视为同一命名空间 一:权限管理 二:搜索 | ...

  4. Web server failed to start. Port 8080 was already in use.

    Description: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the ...

  5. 转译es6原生原生对象及方法,如Object.assign,Object.keys等,及promise

    下面主要为兼容恶心的ie 1,首先引入‘babel-polyfill’,可写在webpack.dev.js的entry.vendors数组里面 2,在入口文件如app.js里面import 'babe ...

  6. 【Movist Pro】macOS上的绝佳媒体播放器

    Movist Pro是适用于Mac的高性能电影播放器,如果比较流程和界面,则Movist与QuickTime非常相似.因此,采用播放器几乎不会有任何问题.使用Quicktime或FFmpeg解码电影并 ...

  7. ToDoList 增删改查

    ToDoList 主要功能 增加数据 删除数据 修改数据 查寻数据渲染页面 1 . HTML页面 <!DOCTYPE html> <html lang="en"& ...

  8. clickhouse高可用-节点宕机数据一致性方案-热扩容

    1. 集群节点及服务分配 说明: 1.1. 在每个节点上启动两个clickhouse服务(后面会详细介绍如何操作这一步),一个数据分片,一个数据备份,为了确保宕机数据一致性,数据分片和数据备份不能同一 ...

  9. 网格图必经点+dfs——cf1214D

    先正着走一次把所有可行路径标记出来,然后倒着走两条路径,一条是能向下就向下的路径,另一条能向右就向右. 如果这两条路径相交,那么(1,1)-(n,m)路径上比有个必经点,把这个必经点封上,答案是1,如 ...

  10. 前端使用vue-i18n做中英文翻译

    vue-i18n 仓库地址:https://github.com/kazupon/vue-i18n 兼容性: 支持 Vue.js 2.x 以上版本 安装方法:(此处只演示 npm) npm insta ...