是否可以在spring mvc上下文中确定实际的运行流并终止它?
我之所以要问的是,在我的商店网络应用程序中,整个结帐流程是一个网络流程,但标题菜单仍然可见,现在我遇到的问题是,如果菜单链接被点击,则流程退出但我不承认。
我希望我想要的是可以理解的,我感谢任何帮助来解决这个问题:)
感谢。
答案 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" />