评估标签在视图状态或动作状态之间有什么区别

时间:2015-04-30 06:02:43

标签: java spring-mvc spring-webflow

我想通过调用函数并在流程范围中设置一些变量来实现到另一个视图的转换。成功或错误事件没有区别。我知道,我可以在视图状态和动作状态下使用evaluate标记作为调用函数。将评估标记放在每个标记中有什么区别吗?对于这种情况哪一个更好?

1 个答案:

答案 0 :(得分:1)

WebFlow在某种意义上是灵活的,你可以通过  '在任何状态下评估表达。和'出口'标签或动作状态标签。与任何允许灵活性的框架一样,最好选择一个贯穿所有流程的策略。您可以简单地将评估表达式执行到' on-entry'或者' on-render'在视图状态中标记'但使用中间行动状态是有利的。首先执行你的表达,然后转换到' view-state'。

优势:

有时您必须评估多个表达式,但它们都是同一行动的一部分'。将这些多重评估分组为“动作状态”和“动作状态”。并提供行动状态'一个有意义的id名称可能有助于流可读性和潜在的故障排除,如果在该动作状态中抛出异常。

所以,例如,

让我们说在呈现视图状态之前我们必须调用3种不同的服务方法。我们可以这样做:

<view-state id="myViewState" view="myViewFile" model="entity">
   <on-entry>
       <evaluate expression="myService.findObjById(id)" result="flowScope.model" />
       <evaluate expression="myService.updateUserStats(someField)"/>
       <evaluate expression="myService.performSomeOtherAction()"/>
   </on-entry>

</view-state> 

这可以正常工作,但如果我们从&#39; on-entry&#39;删除所有这些服务方法调用会更好。并把它们放在自己的行动状态中。一旦完成执行,然后转换到&#39;视图状态&#39;

<action-state id="prepareMyViewState">
       <evaluate expression="myService.findObjById(id)" result="flowScope.model" />
       <evaluate expression="myService.updateUserStats(someField)"/>
       <evaluate expression="myService.performSomeOtherAction()"/>
       <transition to="myViewState"/>
</action>

<view-state id="myViewState" view="myViewFile" model="entity">

</view-state>

这两个例子都是&#34;正确&#34;但是具有行动状态的人更加冗长,并且清楚地定义了关注点的分离。因此,如果在action-state&#39; prepareMyViewState&#39;中抛出异常。我们确切地知道这个动作状态的作用是从名称反对视图状态&#39; myViewState&#39;抛出可能与视图状态的准备或呈现相关的异常。此外,将来如果要添加/编辑/删除服务调用,当它们被置于具有有意义名称&#39; prepareMyViewState&#39;的自己的操作状态时,您可以轻松地在流文件中发现它。

同样,我会强调这里没有错误的答案我只会说选择一种风格&#39;这在整个Web流应用程序中都是一致的。具有中间动作状态的第二种风格是我将使用的风格。