0

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

我问的原因是,在我的商店网络应用程序中,整个结帐过程是一个网络流程,但标题菜单仍然可见,现在我遇到的问题是,如果单击菜单链接,流程就会退出,但我没有认不出来

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

谢谢。

4

2 回答 2

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

于 2013-04-29T19:20:10.567 回答
0

可以在流和子流之间共享全局转换,方法类似于上面的代码。

基本上,您必须定义一个抽象流,commons-headers ,在流标签内设置abstract=true ,然后定义将在流/子流之间共享的全局转换,这些全局转换可以重定向到某种事件,在这个以结束状态为例。

调用流定义,主流,定义子流状态标签,这里必须写从被调用流,流返回的过渡,它必须与过渡子流的结束状态标签共享相同的id,这是完成子流并返回的方式到主流。如果您希望使用一些全局转换,那么您必须在子流状态标记内定义这些转换,为主流的 on属性和全局流的 to属性设置相同的值(在本例中为 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" />

于 2015-02-16T17:35:11.897 回答