Spring Web Flow 是Spring MVC 的扩展,它支持开发基于流程的应用程序。它将流程的定义与实现流程行为的类和视图分离开来。
1.配置Web Flow
在Spring MVC上下文定义,添加的命名空间:
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
完整配置:
<?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/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/webflow-config
http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd">
<!-- flow-executor流程执行器 -->
<flow:flow-executor id="flowExecutor"/>
<!-- 流程注册表 -->
<flow:flow-registry id="flowRegistry" base-path="/WEB-INF/flows">
<flow:flow-location-pattern value="*-flow.xml"/>
<!-- 这样,结合base-path属性,凡是在base-path下,且以-flow.xml结尾的文件都将视为流程定义 -->
<!-- 当然,也可以不要base-path,像下面这样直接定义 ,id可以不写,访问这个流程的时候用/id即可-->
<flow:flow-location path="/WEB-INF/flows/springpizza.xml" id="pizza"/>
</flow:flow-registry>
<!-- 定义HandlerMapping -->
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
<property name="flowRegistry" ref="flowRegistry"/>
</bean>
<!-- 定义HandlerAdapter -->
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>
</beans>
流程执行器:会为用户创建并启动一个流程执行实例。当流程暂停的时候(如为用户展示视图时),流程执行器会在用户执行操作后恢复流程。
流程注册表:加载流程定义文件并让流程执行器能够使用它们。
个人认为,Spring WebFlow的实现的核心就是基于其实现了HandlerMapping和HandlerAdapter。
2.流程组件
流程是由三个主要元素定义的:状态、转移和流程数据。状态是流程中事件发生的地点。转移用来连接状态。流程数据是流程的当前状况。
2.1 状态
Spring Web Flow定义了五种不同类型的状态:
状态类型 | 它是用来做什么的 |
---|---|
行为(Action) | 行为状态时流程逻辑发生的地方 |
决策(Decision) | 决策状态将流程纷飞两个方向,他是基于流程数据的评估结果来确定流程方向 |
结束(end) | 结束状态时流程的最后一站,一旦进入结束状态,流程就会终止 |
子流程(Subflo) | 子流程状态会在当前正在运行的流程上下文中启动一个新的流程 |
视图(view) | 视图状态会暂停流程并邀请用户参与流程 |
视图状态:
<view-state id