Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序。Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程 序。它将流程的定义与实现流程行为的类和视图分离开来。在介绍Spring Web Flow的时候,我们将暂时放下Spittr样例并使用生成披萨订单的新Web应用程序。我们会使用Spring Web Flow来定义订 单流程。

一、在Spring中配置Web Flow

Spring Web Flow是构建于Spring MVC基础之上的。这意味着所有的流 程请求都需要首先经过Spring MVC的DispatcherServlet。我们 需要在Spring应用上下文中配置一些bean来处理流程请求并执行流 程。

现在,还不支持在Java中配置Spring Web Flow,所以我们别无选择, 只能在XML中对其进行配置。有一些bean会使用Spring Web Flow的 Spring配置文件命名空间来进行声明。因此,我们需要在上下文定义 XML文件中添加这个命名空间声明:

1.1 装配流程执行器

正如其名字所示,流程执行器(flow executor)驱动流程的执行。当 用户进入一个流程时,流程执行器会为用户创建并启动一个流程执行 实例。当流程暂停的时候(如为用户展示视图时),流程执行器会在 用户执行操作后恢复流程。 在Spring中,<flow:flow-executor>元素会创建一个流程执行 器:

尽管流程执行器负责创建和执行流程,但它并不负责加载流程定义。 这个责任落在了流程注册表(flow registry)身上,接下来我们会创建 它。

1.2 配置流程注册表

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

在这里的声明中,流程注册表会在“/WEB-INF/flows”目录下查找流程 定义,这是通过base-path属性指明的。依据<flow:flowlocation-pattern>元素的值,任何文件名以“-flow.xml”结尾的 XML文件都将视为流程定义。 

所有的流程都是通过其ID来进行引用的。这里我们使用了 <flow:flow-location-pattern>元素,流程的ID就是相对于 base-path的路径——或者双星号所代表的路径。下图展示了示例 中的流程ID是如何计算的。

1.3 处理流程请求

DispatcherServlet一般将请求分发给 控制器。但是对于流程而言,我们需要一个FlowHandlerMapping 来帮助DispatcherServlet将流程请求发送给Spring Web Flow。 在Spring应用上下文中,FlowHandlerMapping的配置如下:

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

这个处理适配器是DispatcherServlet和Spring Web Flow之间的 桥梁。它会处理流程请求并管理基于这些请求的流程。在这里,它装 配了流程执行器的引用,而后者是为所处理的请求执行流程的。

 

笔记36 Spring Web Flow——配置的更多相关文章

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

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

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

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

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

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

  4. 笔记41 Spring Web Flow——Demo

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

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

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

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

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

  7. 笔记37 Spring Web Flow——流程的组件

    在Spring Web Flow中,流程是由三个主要元素定义的:状态.转移和 流程数据. 一.状态 Spring Web Flow定义了五种不同类型的状态.通过选择Spring Web Flow的状态 ...

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

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

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

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

随机推荐

  1. ScrollView嵌套listview显示一行bug

    首先看看修复bug之后的显示对比图,结果一目了然 显示一行之前 修改bug之后 主要就是ScrollView嵌套listview显示计算  直接上代码   一目了然 <com.wechaotou ...

  2. android5.1 隐藏状态栏

    修改frameworks/base/core/res/res/values/dimens.xml文件中 <!-- Height of the status bar --> <!-- ...

  3. KiCAD绘制电源符号

    KiCAD绘制电源符号 KiCAD自带的电源符号有时候不符合我们的操作习惯,需要自己重新定义电源符号,这时候就需要新建(不能更改系统自带库的电源符号) 1.新建符号,参照下图行设置 2.放置引脚和图形 ...

  4. mysql莫名报"unknown column ... in 'on clause'"

    今天遇见个会诡异的问题 一个web程序本地调试的好好的,结果发布到服务器上程序就报错了,报"unknown column ... in 'on clause'",网上搜了下,说是m ...

  5. mysql的事务四个特性以及 事务的四个隔离级别

    一.事务四大属性 分别是原子性.一致性.隔离性.持久性. 1,原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库, ...

  6. Vue学习笔记【13】——键盘修饰符以及自定义键盘修饰符

    1.x版本中自定义键盘修饰符[了解] Vue.directive('on').keyCodes.f2 = 113; 2.x版本中自定义键盘修饰符 通过Vue.config.keyCodes.名称 = ...

  7. java相差小时数

    public static String getTime(Date date){ StringBuffer time = new StringBuffer(); Date date2 = new Da ...

  8. Ext 选项卡面板TabPanel

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. C语言新手写扫雷攻略1

    工欲善其事,必先利其器,首先要准备好开发环境,既然是C语言,那就不是WinAPI的扫雷,就是纯的C语言开发,但是以前的C都是TC开发的,现在用肯定是过时很久了,但是也是有解决办法的,某些大神开发出Ea ...

  10. Golang(Go语言)内置函数之copy用法

    该函数主要是切片(slice)的拷贝,不支持数组 将第二个slice里的元素拷贝到第一个slice里,拷贝的长度为两个slice中长度较小的长度值 示例: s := []int{1,2,3} fmt. ...