Spring Web Flow
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的更多相关文章
- Spring Web Flow使用
就当我写(嘘,抄)着玩的. 使用Spring框架的一个子项目--Spring Web Flow来建立和管理Web应用和UI流程. 第一节:使用Spring Web Flow在一个Spring MVC应 ...
- Spring Web Flow 简介
Spring Web Flow 简介 博客分类: 转载 SSH 最近在TSS上看到了一片介绍Spring Web Flow的文章,顺便就翻译了下来,SWF的正式版估计要到6月份才能看到了,目前的例子都 ...
- spring web flow 2.0入门(转)
Spring Web Flow 2.0 入门 一.Spring Web Flow 入门demo(一)简单页面跳转 附源码(转) 二.Spring Web Flow 入门demo(二)与业务结合 附源码 ...
- Spring web flow的意义
为什么要使用Spring web flow呢? 这里需要强调的一点就是,但凡一个技术的出现和流行,必有其适用的环境和存在的意义. Spring web flow加强了中央集权,这个该怎么理解呢?以往我 ...
- 第8章—使用Spring Web Flow—Spring Web Flow的配置
Spring中配置Web Flow Spring Web Flow 是 Spring 的一个子项目,其最主要的目的是解决跨越多个请求的.用户与服务器之间的.有状态交互问题,比较适合任何比较复杂的.有状 ...
- spring in action 8.1 使用Spring web flow
一.说明 Spring Web Flow是spring MVC的扩展,它支持基于流程的应用程序,他将流程的定义和实现流程行为的类和视图分离开来. 1.1 spring中配置web flow,目前需要在 ...
- 第08章-使用Spring Web Flow
使用Spring Web Flow Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程序.它将流程的定义与实现流程行为的类和视图分离开来. 1 在Spring中配置 ...
- Spring实战第八章学习笔记————使用Spring Web Flow
Spring实战第八章学习笔记----使用Spring Web Flow Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序. 其实我们可以使用任何WEB框架写流程化的应 ...
- Spring学习笔记4—流程(Spring Web Flow)
Spring Web Flow是Spring框架的子项目,作用是让程序按规定流程运行. 1 安装配置Spring Web Flow 虽然Spring Web Flow是Spring框架的子项目,但它并 ...
随机推荐
- bzoj-2038-莫队
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 15784 Solved: 7164[Sub ...
- 转-如何使用iTunes制作iPhone铃声
新版iTunes(iTunes11)推出以后,界面上发生了一些改变,给人带来一种面貌一新的感觉,但也给许多朋友带来一些操作上的不太适应.下面就大家比较关心的iPhone的铃声制作方法,我在iTunes ...
- js javascript 容错处理代码屏蔽js错误
加入到head <SCRIPT language=javascript> window.onerror=function(){return true;} </SCRIPT> o ...
- Beta阶段——第1篇 Scrum 冲刺博客
第1篇 Scrum 冲刺博客 a. 介绍小组新加入的成员,Ta担任的角色. 新加入成员 郭炜埕 原先担任的角色 前端界面设计 现在担任的角色 前端开发,并协助后端开发 新加成员介绍 炜埕同学对界面设计 ...
- 迭代器与泛型for
迭代器与closure function allwords() local line=io.read() return function() while line do local s,e=strin ...
- httpd.conf文件格式解析
apache http server,俗称apache,程序名httpd,默认配置文件/etc/httpd/conf/httpd.conf:该文件通过其中的Include conf.d/*.conf指 ...
- makefile文件写法解析
一.makefile文件示例 makefile文件并不难写,一个makefile模版如下所示,所有makefile文件在此基上稍微修改就可以了. # this is a makefile #这一行是注 ...
- java爬虫进阶 —— ip池使用,iframe嵌套,异步访问破解
写之前稍微说一下我对爬与反爬关系的理解 一.什么是爬虫 爬虫英文是splider,也就是蜘蛛的意思,web网络爬虫系统的功能是下载网页数据,进行所需数据的采集.主体也就是根据开始的超链接,下 ...
- studio配置本地gradle-x.x.x-all.zip
在引入别的项目时,一般会突然一直卡在了building...,下载网络gradle. 我们从网络下载gradle.zip到本地,通过将.\项目\gradle\wrapper下的gradle-wrapp ...
- 【SQL】group by 及 having
Group By 分组汇总 HAVING:给分组设置条件 1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”, ...