gpt4 book ai didi

java - Play中如何实现流控?

转载 作者:行者123 更新时间:2023-11-30 06:31:45 27 4
gpt4 key购买 nike

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

我们的要求:

  1. 应该允许多步流程,比如 step1 -> step2 -> step3 -> step4 -> finish
  2. 应该能够根据上下文更改顺序或步骤,因此如果用户在步骤 2 上选择了一个复选框,流程应该是步骤 1 -> 步骤 2 -> 警告步骤 -> 步骤 5 -> 完成
  3. 理想情况下需要支持“后退”按钮以在步骤之间返回

我们遇到的问题是,流程中的任何一步都不知道下一步应该重定向到哪里,而且由于 Play session 非常简单,它在这里没有多大帮助。

这是我们目前的解决方案:

  1. 在用户对象的数据库中存储流程步骤 @OneToMany public List<FlowStep> flowSteps
  2. 在用户模型中提供方法来添加/删除/跳过和更改为该用户存储的流程步骤的顺序
  3. 正常执行步骤,表单操作导致“doStep3” Controller 等
  4. 实现“流程” Controller ,使用@Before 和@After 拦截器在处理当前步骤且未发现验证错误后正确重定向到下一步
  5. 添加了重定向到下一步的 Flows.next() Controller (用于“跳过”按钮 href)

这个解决方案有什么缺点?有没有更好的方法(也许是一些 Play 内置方法)来改进它?

最佳答案

你想要的是一个finite state machine .要实现它,您需要一个知道步骤之间所有可能转换的类。然后您可以向它提供当前步骤和任何相关输入,它会返回输出(其中输出是接下来要呈现的 View )。

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

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

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

由于 Play 是无状态的,因此您需要将信息保存在数据库中(对于需要在多个步骤中考虑信息的复杂场景),或者,如果相关的切换只是少数,则将它们存储在 cookie 中本身。

我会避免使用@Before/@After,因为你正在将状态机耦合到 Controller 。理想情况下,您希望它们是独立的,状态机仅返回转换,您可以稍后将其转换为 View 路径。这将简化不断变化的过渡。

如果场景不是特别复杂,我根本懒得去数据库里存。如果您希望它可重用并且非常灵活,那就去做吧,否则“硬编码”可能更简单。

关于java - Play中如何实现流控?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9534997/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com