终止实际的弹簧网络流程执行

时间:2013-04-20 19:30:57

标签: spring-mvc spring-webflow spring-webflow-2

是否可以在spring mvc上下文中确定实际的运行流并终止它?

我之所以要问的是,在我的商店网络应用程序中,整个结帐流程是一个网络流程,但标题菜单仍然可见,现在我遇到的问题是,如果菜单链接被点击,则流程退出但我不承认。

我希望我想要的是可以理解的,我感谢任何帮助来解决这个问题:)

感谢。

2 个答案:

答案 0 :(得分:1)

如果我正确地理解了你的问题 - 你想终止当前的流程,但仍然有菜单点击工作 - 是吗?

如果是,则拥有所有子流继承的全局公共流。然后,将其添加到每个流的flow标记中,其中commonFlow是全局流定义文件的名称或ID。

parent="commonFlow"

在此全局流定义中,定义菜单选项的转换:

<global-transitions>
<!-- If Menus are triggered on flows, we end them first. -->
<transition on="menuClick" to="endCurrentFlowThenMenu"/>
</global-transitions>

然后为菜单定义重定向:

<end-state id="endCurrentFlowThenMenu" view="flowRedirect:menuView"></end-state>

但是,这仅在当前流是父级/顶级流时才有效。如果它是一个子流,它会变得有点脏 - 你需要一个解决方法,以便所有子流首先结束:

<global-transitions>
<!-- If Menus are triggered on flows and subflows, we end them first. -->
<transition on="menuClick" to="endCurrentFlowThenMenuLevel1"/>
    <transition on="endCurrentFlowThenMenuLevel1" to="endCurrentFlowThenMenuLevel2"/>
</global-transitions>

在这种情况下,您可以定义匹配的结束状态:

<end-state id="endCurrentFlowThenMenuLevel1" view="flowRedirect:newFlow">
</end-state>
<end-state id="endCurrentFlowThenMenuLevel2" view="flowRedirect:newFlow">
</end-state>

我在每个结束状态上重复view属性的原因是,即使当前流是顶级流,它仍然可以工作。根据最大最深子流,您需要具有多个转换和结束状态以匹配它们(即,如果最大最深功能可以有2个子流,则重复上述3次)。

这里的技巧是,如果当前流量已经是顶级流量,SWF将不会使父流量冒泡,只会执行flowRedirect

但是,如果当前流是子流,SWF将不会在子流上执行重定向,而是首先冒泡到父流,寻找刚刚结束的当前子流的匹配转换。它将继续执行此操作,直到找到顶级流程,在这种情况下它将执行重定向,从而有效地结束流程中的所有子流。

答案 1 :(得分:0)

可能在流和子流之间共享全局转换,这样做的方式类似于上面的代码。

基本上,您必须定义一个抽象流, commons-headers ,在流标记内设置 abstract = true ,然后定义 global-transitions 将在流/子流之间共享,这些全局转换可以重定向到某种事件,在本例中为 end-state

调用流定义,主流,定义子流状态标记,此处必须编写从被调用流子流返回的转换,其中必须与 transition 子流的end-state标记之间共享的 id 相同,这是完成子流并返回主流的方法。如果您希望使用某些全局转换,则必须在子流状态标记内定义这些转换,为主流在属性上设置相同的值,并将 global-flow设置为属性(在此示例中将是loginEnd和signEnd)。最后一步,主流到属性必须与某些全局流状态id 属性重合(在此示例中为loginEnd和signEnd)。

<强>共享报头

<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/webflow
    http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"
abstract="true">

<end-state id="loginEnd" view="flowRedirect:login" />

<end-state id="signupEnd" view="flowRedirect:signup" />

<global-transitions>
    <transition on="login" to="loginEnd" />
    <transition on="signup" to="signupEnd"/>
</global-transitions>

主要流程

<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
    http://www.springframework.org/schema/webflow
    http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"
    parent="commons-header">


<view-state id="inicio" view="main.xhtml">
    <transition on="manageSpace" to="adminSpaces" />

    <transition on="goSpace" to="visitSpace" />
</view-state>

<subflow-state id="visitSpace" subflow="space">
    <on-entry>
         <evaluate expression="space.showSpace(requestParameters.idSpace,flowRequestContext)" result="conversationScope.visitedSpace" />
    </on-entry>

    <transition on="finishSubFlow" to="inicio" />

    <transition on="loginEnd" to="loginEnd" />
    <transition on="registerEnd" to="registerEnd" />
</subflow-state>

<end-state id="error" view="flowRedirect:error" />

<强>子流

<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/webflow
    http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"
parent="commons-header">


<view-state id="showPicture" view="space_pictures.xhtml">

    <on-entry>
         <evaluate expression="multimediaProvider.showPages('picture')" result="viewScope.pagesList"/>
     </on-entry>

    <transition on="goMain" to="finishSubFlow" />
    <transition on="visit" to="visitPicturePage" />
</view-state>

    <view-state id="visitPicturePage" view="show_picturePage.xthml">
        <on-entry>
            <set name="flowScope.code" value="requestParameters.code" />
        </on-entry>
        <on-render>
             <evaluate expression="multimediaProvider.loadPage(flowScope.code)" />
        </on-render>

        <transition on="goMain" to="finishSubFlow" />       
    </view-state>

<end-state id="finishSubFlow" />