Play中的多步流程

时间:2012-11-07 14:18:00

标签: playframework playframework-2.0

我正在尝试在Play 2.0.3中实现一些流控制,这是一个包含几个步骤的向导。 Play中最好的方法是什么?

我希望有多步流程,例如 step1 - > step2 - >完成

主要问题是不允许用户跳过例如step2并直接完成(用户可以在浏览器 / finish 中手动输入链接)。

感谢。如果我没有很好地解释自己,请告诉我。

3 个答案:

答案 0 :(得分:4)

您至少有两个选择:

  • 使用POST方法在步骤之间发送数据,这将始终使用相同的URL,如果用户将刷新页面,他将返回到第一步。您的步骤标识符将只是隐藏的表单字段。
  • 使用jQuery显示后续步骤,您甚至不需要在步骤之间向服务器发送数据。您可以构建一个大表单(如果它的形式)并使用jQuery显示/隐藏其部分。在完成后,您将执行常见表单的提交,其中包含所有步骤,您可以在其中验证并显示“谢谢”页面。
  • 您可以选择将AJAX与jQuery结合使用来分隔验证和保存步骤。

答案 1 :(得分:2)

完全无状态的方式可能是将所有数据存储在步骤的网址中,其中步骤n + 1包含步骤n中的所有数据:

GET   /step1    controllers.Application.step1
GET   /step2    controllers.Application.step2(dataFromStep1)
GET   /step3    controllers.Application.step3(dataFromStep1, dataFromStep2)
POST  /finish   controllers.Application.finish

此解决方案的优点在于其简单性以及在Play执行下一步之前检查所有必需步骤是否已完成的事实!路由器。

但是,如果您的网址数量很多,那么这个解决方案的适用性会降低。在这种情况下,您需要:

  • 将每个步骤的数据保存到持久存储中(使用会话是另一种选择,但大小限制为4KB);
  • 识别您的用户,例如/step2网址不会为不同的用户返回相同的内容;
  • 设置超时以丢弃不完整的提交并清理持久存储;
  • 手动检查您的业务代码,确保所有步骤都已完成,以便最终提交。

答案 2 :(得分:1)

我会将步骤存储在数据库中(长期)或缓存(短期内)。这样您就可以构建一些逻辑if (secondQuestionAnswered) { .. },并确保您的用户没有跳过任何内容和/或用户可以在他想要的时候完成这些步骤。如果您的应用程序增长并且您需要扩展它,那么持久保存在数据库或缓存中也会受益。