概述:
觉得学一个东西首先大概跑通一个demo,有很多不懂,没有关系,接下来学习概念,你就会明白为什么会这么做?这就是带个问题学习、上一节模仿别人写的demo,大概了解流程
8.1 在Spring中配置Web Flow
增加xml中web FLow 命名空间
xmlns:flow="http://www.springframework.org/schema/webflow-config"
http://www.springframework.org/schema/webflow-config
http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.3.xsd
8.1.1 装配流程执行器(CEO)
<flow:flow-executor id="flowExecutor" />
8.1.2 配置流程注册表(部门经理)flow registry
<flow:flow-registry id="flowRegistry" base-path="WEB-INF/flows">
<flow:flow-location-pattern value="*-flow.xml"/>
</flow:flow-registry>
<flow:flow-registry id="flowRegistry">
<flow-location path="/WEB-INF/flows/springpizza.xml" />
</flow:flow-registry>
总结:
1、flow-location-pattern 表示利用正则表达式匹配,而flow-location是具体的地址
转存失败重新上传取消
8.1.3 处理流程请求
请求过来-->DispatcherServlet ->FlowHandlerMapping->FlowHandlerAdapter
上面FlowHandlerMapping 类似 ResultMapping,路径映射
FlowHandlerAdapter 类似具体控制器
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
<property name="flowRegistry" ref="flowRegistry" />
</bean>
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>
8.2 流程组件
状态、转移和流程数据
8.2.1 状态
Action(行为) : 行为状态是流程逻辑发生的地方
Decision(决策): 决策状态将流程分成两个方向,类似if
End(结束) 结束状态是流程的最后一站,一旦进入End状态,流程就会终止
Subflow(子流程) 子流程状态会在当前正在运行的流程上下文启动一个新的流程
视图(View) 视图状态会暂停流程并邀请用户参与流程,其实就是显示jsp网页
视图状态: <view-state id="welcome"/>
<view-state id="welcome"/> 如果没有view,默认view为welcome,当然也可以显式指定 ,如果展示数据可以用model属性
行为状态:<action-state>
<action-state id="saveOrder">
<evaluate expression="pizzaFlowActions.saveOrder(order)" />
<transition to="thankYou"/>
</action-state>
<evaluate >一般是调用具体类实现默认验证。expression=SpEL表达式
决策状态
<decision-state id="checkDeliveryArea">
<if test="pizzaFlowActions.checkDeliveryArea(customer.zipCode)"
then="addCustomer"
else="deliveryWarning" />
</decision-state>
子流程状态: <subflow-state>
<subflow-state id="order" subflow="pizza/order">\
<input name="order" value="order"/>
<transition on="orderCreated" to="payment"/>
</subflow-state>
结束状态: <end-state>
<end-state id="customerReady"/>
"externalRedirect" : 流程之外的视图
“flowRedirect:” 重定向另个流程中
8.2.2 转移(各个状态之间的交互)<transition>
例如:<transition on="phoneEntered" to="customerReady" /> to:表示转移目标, on:表示动作触发
异常转移:
<transition
on-exception="com.springinaction.pizza.service.CustomerNotFoundException" to="registrationForm" />
全局转移:(整个流程终止)
<transition on="cancel" to="endState"/> 变成
<global-transitions>
<transition on="cancel" to="endState"/>
</global-transitions>
所有状态都会默认拥有这个cancel转移
8.2.3 流程数据
声明变量
<var name="customer" class="com.springinaction.pizza.domain.Customer"/>
视图作用域
<evaluate result="viewScope.toppingsList"
expression="T(com.springinaction.pizza.domain.Topping).asList()"
<set name="flowScope.pizza"
value="new com.springinaction.pizza.domain.pizza()"/>
定义流程数据的作用域;
Conversation: 最高层级作用域
Flow: 创建它流程可见
Request: 当一个请求进入流程时创建
Flash:与Flow类似,当流程开始创建,在流程结束时销毁
View: 当进入视图状态时创建,当这个状态退出时销毁,只在视图状态内是可见的
当使用<var>元素声明变量时,变量始终是流程作用域的,也就是在定义变量的流程内有效。当使用<set>或<evaluate>的时候,作用域通过name或result属性的前缀指定。
总结:流程的三要素就是:状态、转移、流程数据