如何在Play中实现流量控制?

时间:2012-03-02 14:34:12

标签: java playframework

我们正在尝试在Play中实现一些流控制,这是一个包含几个步骤的向导。在Play中执行此操作的最佳做​​法是什么?

我们的要求:

  1. 应该允许多步流程,例如step1 - > step2 - >步骤3 - >步骤4 - >光洁度
  2. 应该能够根据上下文更改顺序或步骤,因此如果用户选择step2上的复选框,则流程应为step1 - > step2 - > warningStep - >步骤5 - >光洁度
  3. 理想情况下,需要支持“后退”按钮才能在步骤之间返回
  4. 我们遇到的问题是,流程中的任何一个步骤都不知道下一步应该重定向的位置,因为Play会话非常简单,所以在这里没有多大帮助。

    以下是我们目前的解决方案:

    1. 使用@OneToMany public List<FlowStep> flowSteps
    2. 在用户对象中的数据库中存储流程步骤
    3. 在用户模型中提供方法以添加/删除/跳过并更改为此用户存储的流程步骤的顺序
    4. 正常实施步骤,表格操作通向“doStep3”控制器等
    5. 使用@Before和@After拦截器实现“Flows”控制器,在处理完当前步骤并且未发现验证错误后正确地重定向到下一步
    6. 添加了重定向到下一步的Flows.next()控制器(用于“跳过”按钮href)
    7. 此解决方案有哪些缺点?有没有更好的方法(可能是一些Play内置方法)来改进它?

3 个答案:

答案 0 :(得分:2)

你想要的是finite state machine。要实现它,您需要一个知道步骤之间所有可能转换的类。然后你可以提供当前步骤和任何相关输入,它将返回输出(输出是下一个渲染的视图)。

然后使用render重定向用户,如:

render("my/view/path.html", myparams);

这不是唯一的选择,转换的存储将取决于您需要它们的复杂程度(可以针对简单场景进行硬编码,也可以存储在数据库中以用于更复杂的场景),但它应该可以工作。

由于Play是无状态的,您需要将信息保存在数据库中(对于需要在几个步骤中获取帐户信息的复杂方案),或者,如果相关的工具只是少数,则将它们存储在饼干本身。

当你将状态机耦合到控制器时,我会避免使用@ Before / @ After。理想情况下,您希望它们是独立的,状态机只返回可以在以后转换为视图路径的转换。这将简化转换过程。

如果场景不是非常复杂,我甚至不愿意将它们存储在数据库中。如果你想要它可重复使用并且非常灵活,那就去做吧,否则它可能更简单,只需要对它进行硬编码即可。

答案 1 :(得分:2)

您是否在Play文档中查看了此部分(非常快速阅读):
http://www.playframework.org/documentation/1.2.4/model#stateless

它列出了您所要求的选项。

答案 2 :(得分:1)

您可以尝试使用Play Cache mechanism作为伪会话来存储已验证的步骤,而不是在数据库中进行处理。使用Play Cache将是一个更简单的解决方案