笔记37 Spring Web Flow——流程的组件
在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——流程的组件的更多相关文章
- Spring实战第八章学习笔记————使用Spring Web Flow
Spring实战第八章学习笔记----使用Spring Web Flow Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序. 其实我们可以使用任何WEB框架写流程化的应 ...
- 笔记39 Spring Web Flow——订单流程(收集顾客信息)
如果你曾经订购过披萨,你可能会知道流程.他们首先会询问你的电 话号码.电话号码除了能够让送货司机在找不到你家的时候打电话给 你,还可以作为你在这个披萨店的标识.如果你是回头客,他们可以 使用这个电话号 ...
- 笔记38 Spring Web Flow——订单流程(定义基本流程)
做一个在线的披萨订购应用 实际上,订购披萨的过程可以很好地定义在一个流程中.我们首先从 构建一个高层次的流程开始,它定义了订购披萨的整体过程.接下 来,我们会将这个流程拆分成子流程,这些子流程在较低的 ...
- 笔记42 Spring Web Flow——Demo(2)
转自:https://www.cnblogs.com/lyj-gyq/p/9117339.html 为了更好的理解披萨订购应用,再做一个小的Demo. 一.Spring Web Flow 2.0新特性 ...
- 笔记43 Spring Web Flow——订购披萨应用详解
一.项目的目录结构 二.订购流程总体设计 三.订购流程的详细设计 1.定义基本流程pizza-flow.xml <?xml version="1.0" encoding=&q ...
- 笔记41 Spring Web Flow——Demo
订购披萨的应用整体比较比较复杂,现拿出其中一个简化版的流程:即用户访问首页,然后输入电话号(假定未注册)后跳转到注册页面,注册完成后跳转到配送区域检查页面,最后再跳转回首页.通过这个简单的Demo用来 ...
- 笔记36 Spring Web Flow——配置
Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序.Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程 序.它将流程的定义与实现流程行 ...
- 笔记40 Spring Web Flow——订单流程(构建订单)
二.订单子流程 在识别完顾客之后,主流程的下一件事情就是确定他们想要什么类型 的披萨.订单子流程就是用于提示用户创建披萨并将其放入订单中 的,如下图所示. showOrder状态位于订单子流程的中心位 ...
- Spring学习笔记4—流程(Spring Web Flow)
Spring Web Flow是Spring框架的子项目,作用是让程序按规定流程运行. 1 安装配置Spring Web Flow 虽然Spring Web Flow是Spring框架的子项目,但它并 ...
随机推荐
- stdio - 标准输入输出库函数
SYNOPSIS 总览 #include <stdio.h> FILE *stdin; FILE *stdout; FILE *stderr; DESCRIPTION 描述 标注 I/O ...
- SVM 详解
https://cloud.tencent.com/developer/article/1411618 (关于hinge损失函数的定义) https://zhuanlan.zhihu.com/p/61 ...
- 使用Hystrix实现断路器处理
在之前的架构的基础上我们会发现,一旦级别低的服务宕了,会导致调用它的服务也挂掉,这样容易产生级联效应(雪崩效应),为了防止这种情况的出现,我引入了Hystrix来处理,先介绍ribbon使用Hystr ...
- sping+quartz定时任务的最简单实践
1,启动spring容器 Tomcat启动的时候,加载web.xml的listener和context-param,spring的listener监听到对应的contextConfigLocation ...
- python3-xlwt-Excel设置(字体大小、颜色、对齐方式、换行、合并单元格、边框、背景、下划线、斜体、加粗)
搬运出处: https://blog.csdn.net/weixin_44065501/article/details/88899257 # coding:utf-8 import patterns ...
- 练习 |跟着Python达人
[学习Python都是用来干嘛的?] 朱卫军 数据分析师 NEV行业 python那些事儿众号主 网址 https://www.zhihu.com/question/34098079/answer/8 ...
- Vue学习笔记【15】——Vue实例的生命周期
生命周期与生命周期钩子 什么是生命周期:从Vue实例创建.运行.到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期! 生命周期钩子:就是生命周期事件的别名而已: 生命周期钩子 = 生命周期 ...
- 思维+multiset优化——cf1249E
正着想很难,但是反着想就容易有思路 /* 将问题转化为 挑选最多的线段,每个点的覆盖次数不超过k次 multiset里存k个右端点,表示第i层当前的最远右端点,每次来一根新线段,能填就填进并更新,不能 ...
- go解析markdown转成html
一.代码 package main import ( "fmt" "github.com/microcosm-cc/bluemonday" "gith ...
- 关于Kerberos协议流程的总结
Kerberos协议工作原理分析 这里面借用一下师傅们的图来说明一下  Kerberos协议的流程大致如下(假设A要获取对Server B的访问权限) 第一步(KRB_AS_REQ) 这一步客户 ...