Spring Web Flow 是 Spring 的一個子項目,其最主要的目的是解決跨越多個請求的、用戶與服務器之間的、有狀態交互問題,比較適合任何比較復雜的、有狀態的、需要在多個頁面之間跳轉的業務過程。
配置SWF需要
- 裝配流程執行器(flow executor)
執行器驅動流程的執行,當用戶進入流程時,流程執行器會為用戶創建並啟動一個流程執行實例,當流程暫停的時候(如為用戶展示視圖時),流程執行器會在用戶執行操作后恢復流程。
<!--Execute flows:the entry point into the Spring Web Flow system--> <flow:flow-executor id="flowExecutor"/> <!--Dispatches requests mapped to flows to FlowHandler implementations--> <bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter"> <property name="flowExecutor" ref="flowExecutor"/> </bean>
- 配置流程注冊表
流程注冊表的工作室加載流程定義並讓流程執行器能夠使用它們。
<!--The reigistry of executable flow definitions--> <flow:flow-registry id="flowRegistry" base-path="/WEB-INF/flows"> <flow:flow-location-pattern value="/**/*-flow.xml"/> </flow:flow-registry>
- 處理流程請求
DispatcherServlet會將請求分發給控制器,SWF中需要一個FlowHandlerMapping來幫助DispatcherServlet將流程請求發送給SWF。
<!--Maps request paths to flows in the flowRegistry--> <bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping"> <property name="flowRegistry" ref="flowRegistry"/> </bean>
FlowHandlerMapping裝配了流程注冊表的引用,這樣就知道如何將請求的URL匹配到流程上。比如請求"/pizza",就會找WEB-INF/pizza目錄下的流程。
在Spring Web Flow 中,流程是由三個主要元素定義的:狀態、轉義和流程數據。
- 狀態(State)是流程中時間發生的地點。
狀態類型 | 功能 | 標簽 |
---|---|---|
行為(Action) | 行為狀態是流程邏輯發生的地方 | <action-state> |
決策(Decision) | 決策狀態將流程分成兩個方向,它會基於流程數據的評估結果確定流程方向 | <decision-state> |
結束(End) | 結束狀態是流程的最后一站,一旦進入End狀態,流程就會終止 | <end-state> |
子流程(Subflow) | 子流程狀態會在當前正在運行的流程上線文中啟動一個新的流程 | <subflow-state> |
視圖(View) | 視圖狀態會暫停流程並邀請用戶參與流程 | <view-state> |
Spring Web Flow 定義了 5 個切入點,通過 flow 定義文件的配置,可在這 5 個切入點插入相關業務邏輯代碼。
<view-state id="viewCart" view="viewCart" > <on-render> <evaluate expression="productService.getProducts()" result="viewScope.products"/> </on-render> </view-state>
- 轉移(transition)是流程的連接不同狀態的動作。
<transition on="cancel" to="cancel"/>
屬性to用於指定流程的下一個狀態,屬性on指定觸發轉移的事件。
轉移連接了流程中的狀態,除了結束狀態之外的每個狀態,至少都需要一個轉移。狀態可以有多個轉移,分別對應於當前狀態結束時可以執行的不同路徑。
此外,還可以定義全局轉移,使的流程中的所有狀態都會默認用於某個轉移。
<global-transitions> <transition on="cancel" to="endState"/> </global-transitions>
- 流程數據
流程數據保存在變量中,而變量可以在流程的各個地方進行引用。可以使用
- <var>:最簡單的形式,作用域為整個流程
- <evaluate>:計算了一個表達式並將結果放到了變量中
<evaluate expression="pizzaFlowActions.lookupCustomer(requestParameters.phoneNumber)" result="order.customer"/>
- <set>:與<evaluate>類似,都是將變量設置為表達式。
Spring Web Flow 定義了五種不同的作用域:
范圍 | 生命作用域和可見性 |
---|---|
Conversion | 最高層級的流程開始時創建,在最高層級的力促恆結束時銷毀。被最高層級的流程和其所有的子流程所共享。 |
Flow | 當流程開始時創建,在流程結束時銷毀。只有在創建它的流程中是可見的。 |
Request | 當一個請求進入流程時創建,在流程返回時銷毀 |
Flash | 當流程開始時創建,在流程結束時銷毀。在視圖狀態渲染后,它也會被清除。 |
View | 當進入視圖狀態時創建,當這個狀態退出時銷毀。只在視圖狀態內是可見的。 |
1
sourceCode:https://github.com/ljw8947/SpringInAction/tree/master/Capter8/Spizza