Spring 實戰-第八章-使用Spring Web Flow


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2024 CODEPRJ.COM