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. 使用ajax请求接口,跨域后cookie无法设置,全局配置ajax;及使用axios跨域后cookie无法设置,全局配置axios

    问题一: 使用ajax/axios跨域请求接口,后端放行了,能够正常获取数据,但是cookie设置不进去,后端登录session判断失效 ajax解决办法: //设置ajax属性 crossDomai ...

  2. python爬虫基本原理及入门

    爬虫:请求目标网站并获得数据的程序 爬虫的基本步骤: 使用python自带的urllib库请求百度: import urllib.request response = urllib.request.u ...

  3. [CodeForces - 447C] C - DZY Loves Sequences

    C - DZY Loves Sequences DZY has a sequence a, consisting of n integers. We'll call a sequence ai, ai ...

  4. Git merge && git rebase的用法

    Git merge的用法: git merge Dev // Dev表示某分支,表示在当前分支合并Dev分支 git merge -m  “Merge from Dev”  Dev //-m可以加上m ...

  5. Windows下安装 Memcache

    1.下载Memcached Windows服务端程序.(memcached >= 1.4.5 版本安装32 32位系统 1.4.5版本:http://static.runoob.com/down ...

  6. ssh和ssl的联系和区别

    ssh:Secure Shell,安全Shell,是一个软件,处于应用层旨在取代明文通信的telnet:对应的开源实现程序是openssh. ssl:Secure Sockets Layer,安全套接 ...

  7. 使用Spring-data-jpa(1)(三十)

    在实际开发过程中,对数据库的操作无非就“增删改查”.就最为普遍的单表操作而言,除了表和字段不同外,语句都是类似的,开发人员需要写大量类似而枯燥的语句来完成业务逻辑. 为了解决这些大量枯燥的数据操作语句 ...

  8. learning ddr mode register MR3

  9. day24 模块03_re

    休养生息 --模块03 1.正则表达式 2.在python中使用正则.re 一,正则表达式 (匹配字符串,主要是给字符串使用的) 1)元字符 .  除换行符之外 \w 数字,字母,下划线组成   \W ...

  10. 将excel数据分块多线程导入

    参考链接:http://blog.csdn.net/liqi_q/article/details/53032027