Spring Web Flow

Spring Web Flow :流程,基于Spring MVC 的DispatchServlet

使用方法

  • 配置命名空間,目前不支持java方式的配置
<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://www.springframework.org/schema/webflow"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/webflow
                          http://www.springframework.org/schema/webflow/spring-webflow.xsd">
  • 流程執行器,負責創建和執行流程執行器webflowContext.xml
    <webflow:flow-executor id="logoutFlowExecutor" flow-registry="logoutFlowRegistry">
        <webflow:flow-execution-attributes>
            <webflow:always-redirect-on-pause value="false"/>
            <webflow:redirect-in-same-state value="false"/>
        </webflow:flow-execution-attributes>
    </webflow:flow-executor>
  • 配置流程注冊器,加載流程定義,并讓執行器能夠使用它們.webflowContext.xml
    <webflow:flow-registry id="logoutFlowRegistry" flow-builder-services="builder" base-path="/WEB-INF/webflow">
        <webflow:flow-location-pattern value="/logout/*-webflow.xml"/>
    </webflow:flow-registry>

也可以用 <webflow:flow-location path=""/>指定一個絕對路徑,而不用webflow:flow-location-patternbase-path

  • 配置服務構造器webflowContext.xml
    <webflow:flow-builder-services id="builder"
                                   development="true"
                                   view-factory-creator="viewFactoryCreator"
                                   expression-parser="expressionParser"/>
  • 處理流程請求cas-servlet.xml
    FlowHandlerMapping 幫助DispatchServlet將請求發送給Spring Web Flow
    <!-- logout webflow configuration -->
    <bean id="logoutFlowHandlerMapping" class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping"
          p:flowRegistry-ref="logoutFlowRegistry" p:order="3">
        <property name="interceptors">
            <array value-type="org.springframework.web.servlet.HandlerInterceptor">
                <ref bean="localeChangeInterceptor"/>
            </array>
        </property>
    </bean>

FlowHandlerMapping的工作僅僅是將請求重定向給 Spring Web Flow
響應請求的是FlowHandlerAdapter 等同于Spring MVC的控制器,處理請求.配置如下:cas-servlet.xml

    <bean id="logoutHandlerAdapter" class="org.jasig.cas.web.flow.SelectiveFlowHandlerAdapter"
          p:supportedFlowId="logout" p:flowExecutor-ref="logoutFlowExecutor"
          p:flowUrlHandler-ref="logoutFlowUrlHandler"/>

    <bean id="logoutFlowUrlHandler" class="org.jasig.cas.web.flow.CasDefaultFlowUrlHandler"
          p:flowExecutionKeyParameter="RelayState"/>

流程的組件

如果流程是旅行,那么狀態就是路途上的城鎮,風景點,轉移就是公路,流程數據就像一路買的紀念品和記憶

  • 狀態

狀態類型 它是用來做什么的
視圖(view) 暫停流程并邀請用戶參與流程
行為(Action) 行為狀態,流程邏輯發生的地方
決策(Decision) 基于流程數據的評估結果確定流程方向
子流程(SubFlow) 在當前的流程上下文中啟動一個新的流程
結束(End) 流程的最后一站
  • 視圖狀態:
 <view-state id="redirectToFrontApp" view="externalRedirect:#{currentEvent.attributes.logoutUrl}&amp;RelayState=#{flowExecutionContext.key}">
   <transition on="next" to="frontLogout" />
 </view-state>

屬性解釋
id:在流程內標識這個狀態,(邏輯視圖名)
view:展現的邏輯視圖名
model:表單所綁定的對象

    <view-state id="viewLoginForm" view="casLoginView" model="credential" >
        <binder>
            <binding property="username" required="true" />
            <binding property="password" required="true"/>
            <binding property="captcha"/>
            <!--
            <binding property="rememberMe" />
            -->
        </binder>
        <on-entry>
            <set name="viewScope.commandName" value="'credential'"/>

            <!--
            <evaluate expression="samlMetadataUIParserAction" />
            -->
        </on-entry>
<!--         <transition on="submit" bind="true" validate="true" to="realSubmit"/> -->
        <transition on="submit" bind="true" validate="true" to="validate"/>
    </view-state>
  • 行為狀態
    例子:
  <action-state id="frontLogout">
    <evaluate expression="frontChannelLogoutAction" />
    <transition on="finish" to="finishLogout" />
    <transition on="redirectApp" to="redirectToFrontApp" />
  </action-state>
或
    <action-state id="validate">
        <evaluate expression="captchaVaditeAuthenticationViaFormAction.validate(flowRequestContext, flowScope.credential, messageContext)"/>
        <transition on="error" to="initializeLogin"/>
        <transition on="valid" to="realSubmit"/>
    </action-state>

屬性解釋:
evaluate:行為狀態要做的事情
expression : 調用那個Action,并計算結果.用SpEL表達式

  • 決策狀態
    決定分支
    <decision-state id="serviceCheck">
        <if test="flowScope.service != null" then="generateServiceTicket" else="viewGenericLoginSuccess"/>
    </decision-state>

test是SpEL表達式,返回結果必須是Boolean格式,可以調指定bean(一般是Action)中的一個方法.

  • 子流程狀態
<subflow-state id="order" subflow="pizza/order">
   <input name="order" value="order"/>
   <transition on="orderCreated" to=" payment" /> 
</subflow-state>
  • 結束狀態
<end-state id="redirectView" view="externalRedirect:#{requestScope.response.url}"/>
或
<end-state id="viewRedirectToUnauthorizedUrlView" view="externalRedirect:#{flowScope.unauthorizedRedirectUrl}"/>

view:如果是externalRedirect:前綴,將重定向到流程的外部頁面;如果是flowRedirect:前綴,將重定向到另一個流程中

  • 轉移

    <transition on="finish" to="finishLogout" />
    <transition on="front" to="frontLogout" />

Action中返回的寫法

       if (needFrontSlo) {
           return new Event(this, FRONT_EVENT);
       } else {
           // otherwise, finish the logout process
           return new Event(this, FINISH_EVENT);
       }

如果只有to屬性,則是默認的轉移狀態
異常轉移

<transition to="viewServiceErrorView"
                    on-exception="org.springframework.webflow.execution.repository.NoSuchFlowExecutionException"/>

全局轉移 將重復寫的共用的轉移抽取出來

    <global-transitions>
        <transition to="viewLoginForm" on-exception="org.jasig.cas.services.UnauthorizedSsoServiceException"/>
        <transition to="viewServiceErrorView"
                    on-exception="org.springframework.webflow.execution.repository.NoSuchFlowExecutionException"/>
        <transition to="serviceUnauthorizedCheck" on-exception="org.jasig.cas.services.UnauthorizedServiceException"/>
        <transition to="serviceUnauthorizedCheck" on-exception="org.jasig.cas.services.UnauthorizedServiceForPrincipalException" />
    </global-transitions>
  • 流程數據

  • 聲明變量
<var name="credential" class="org.jasig.cas.authentication.RememberMeUsernamePasswordCredential" />
或
<evaluate result="viewScope.toppingsList" expression="T(com.springinaction.pizza.domain.Topping).asList()"/>
#viewScope 視圖作用域
或
<set name="flowScope.pizza" value="new com.springinaction.pizza.domain.Pizza()"/>
#flowScope 流程作用域

var定義的可以在流程的任意狀態訪問.
作用域

范圍 生命作用域和 可見性
Conversation 最高層級的流程開始創建,被最高層級及其所有子流程共享
flow 只有在創建他的流程中是可見的,var是流程作用域的
Request 請求進入流程時創建,流程返回時銷毀
Flash 流程開始時創建,結束時銷毀,在視圖狀態渲染后也會被清除
View 進入視圖狀態時創建,當這個狀態退出時銷毀
  1. flowScope
  2. requestParameters
  3. flowRequestContext
  4. requestScope
  5. requestScope.response.responseType.name() == 'POST'"

開始狀態:默認是第一個流程定義文件中的第一個狀態,也可以用 start-state

    <on-start>
        <evaluate expression="initialFlowSetupAction"/>
    </on-start>
            <input type="hidden" name="execution" value="${flowExecutionKey}" />
            <input type="hidden" name="_eventId" value="submit" />

-### 實例

-### 保護Web流程

<view-state id="restricted"> <secured attributes="ROLE_ADMIN" match="all"/>
</view-state>

找到的類似文章鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,482評論 2 379

推薦閱讀更多精彩內容