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. html5 meta标签的认知储备

    在开发移动或者PC端的时候除了'<meta charset="UTF-8">'这个设置编码格式的meta标签,还有一些其他方面的设置 一.<meta name=& ...

  2. Leetcode 863. 二叉树中所有距离为 K 的结点

    863. 二叉树中所有距离为 K 的结点  显示英文描述 我的提交返回竞赛   用户通过次数39 用户尝试次数59 通过次数39 提交次数174 题目难度Medium 给定一个二叉树(具有根结点 ro ...

  3. Nginx配置——区分PC或手机访问不同域名

    新官网上线,但在手机上访问新官网的体验很差,要求在手机上访问新官网时访问旧官网,可以通过修改Nginx配置来实现自动跳转.首先是新官网的Nginx配置文件加个跳转判断,通过user-agent判断来源 ...

  4. mysql查看和修改密码策略

    8.X版本: #查看密码策略 show variables like '%validate_password.policy%'; show variables like '%validate_pass ...

  5. 如何让一个div水平和垂直居中对齐

    以下方法来自百度知道:https://zhidao.baidu.com/question/558984366971173044.html 方法1: .parent { width: 800px; he ...

  6. forget stereo step word out8

      1★ stereo st əri əu 立体的   2★ step st əp 后,前妻所生,步骤  

  7. ID基本操作(标尺,参考线,网格)5.11

    参考线:标尺参考线,分栏参考线,出血参考线.在创建参考线之前确保标尺和参考线都可见.并且选中正确的跨页和页面作为目标, “版面”“创建参考线”可以输入数值创建参考线. 跨页参考线的创建:拖动参考线时鼠 ...

  8. Win10系列:UWP界面布局基础9

    在XAML中,样式.模板.画笔和动画等都被看做是资源,它们最终的作用都是相同的,就是让设计人员可以使用这些资源创建更好的视觉效果,对其设计的产品外观进行标准化统一,那么如何使用这些资源并组织和重用呢, ...

  9. NTT模板(无讲解)

    #include<bits/stdc++.h>//只是在虚数部分改了一下 using namespace std; typedef long long int ll; ; ; ; ; ll ...

  10. 初始JSP

    什么是JSP 1.JSP(Java Server Pages):在HTML中嵌入Java脚本代码 静态内容是JSP页面中的静态文本,其基本是HTML文本,与Java和JSP语法无关. 例子: 运行结果 ...