2012-07-25 63 views
1

什么是调用业务逻辑的最佳位置?我有以下要求。Spring WebFlow - 视图状态或动作状态下的业务逻辑

1)。从用户获取搜索标准

2)。如果当前用户正在尝试搜索未经授权的结果,则会抛出业务异常

3)。检索结果

4)。如果结果数量为0,则再次进入搜索页面并输入消息。 5)。如果结果数量>限制,请再次进入搜索页面并输入消息。 6)。转到showresults页面。

这是我迄今为止...

<flow....> 
     <on-start> 
      <evaluate expression="appConfig.setUpSupportData()" result="flowScope.supportData"/> 
     </on-start> 
     <view-state id="searchHome" view="searchHome" model="searchCriteria"> 
      <transition on="search" to="doSearch"/> 
     </view-state> 

     <action-state id="doSearch"> 
      <evaluate expression="searchUtil.getSearchResults(flowScope.searchCriteria)" result="flowScope.personList"/> 
      <evaluate expression="searchUtil.showSearchResults(flowScope.personList, flowRequestContext)" > 
        <attribute name="name" value="expression2"/> 
      </evaluate> 
      <transition on="expression2.yes" to="showSearchResults"/> 
      <transition on="expression2.no" to="searchHome"/> 
    </action-state> 
    <view-state id="showSearchResults"></view-state> 
</flow> 

我的问题是,我应该调用getSearchResults在行动stae或视图状态=“showSearchResults”()方法?如果我在action-sta中调用该方法,则必须将搜索结果放入流量显示器中,以便第二个视图可以得到结果 - 在此场景中,我很担心内存。如果我在第二个view-on-entry中调用方法,我可以将personList放入视图范围中,但是如何处理2,4和5情况?

在此先感谢!已经你自己的问题的

回答

0

你已经回答了一部分:

  • 使用的动作状态来调用业务逻辑,给你提供了如何应对不同的结果更多的控制:去这里上的异常,如果一切顺利,去其他地方,等等。缺点是你需要将数据放在一个更长的范围内(流程范围)以使其可用于视图状态。
  • 使用视图状态允许您通过使用render-action或entry-action检索数据来使用短期范围(视图范围或请求范围),但在处理时不会给予太多控制行动成果。

在这两者之间进行选择是有点交易的。如果搜索结果可能变得非常大,那么使用短期范围尽可能减少内存负载可能是一个重要的问题,因此您可以使用视图状态。在其他情况下,动作状态可能更合适。

一种替代的方法是引入一个应用控制器(从流调用)调用业务逻辑,并返回一个包含几件事情的对象:

  • 搜索结果
  • 一个潜在的信息/警告要显示的消息

然后,您可以使用视图状态,视图将能够从结果对象中简单地拾取搜索结果和信息/警告消息并显示它。