是否可以在 spring mvc 上下文中确定实际运行流程并终止它?
我问的原因是,在我的商店网络应用程序中,整个结帐过程是一个网络流程,但标题菜单仍然可见,现在我遇到的问题是,如果单击菜单链接,流程就会退出,但我没有认不出来
我希望我想要什么是可以理解的,我感谢任何帮助解决这个问题:)
谢谢。
是否可以在 spring mvc 上下文中确定实际运行流程并终止它?
我问的原因是,在我的商店网络应用程序中,整个结帐过程是一个网络流程,但标题菜单仍然可见,现在我遇到的问题是,如果单击菜单链接,流程就会退出,但我没有认不出来
我希望我想要什么是可以理解的,我感谢任何帮助解决这个问题:)
谢谢。
如果我正确理解了您的问题-您想终止当前流程但仍然可以单击菜单-对吗?
如果是,请拥有一个由所有子流继承的全局公共流。然后,将其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 不会在子流上执行重定向,而是首先冒泡到父流,为刚刚结束的当前子流寻找匹配的转换。它将继续执行此操作,直到找到顶级流,在这种情况下它将执行重定向,从而有效地结束流程中的所有子流。
可以在流和子流之间共享全局转换,方法类似于上面的代码。
基本上,您必须定义一个抽象流,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" />