Spring Web Flow 的优势是什么?

What are the Spring Web Flow advantages?

谁能帮助我了解 Spring Web Flow 的优点。 我理解的是

  1. 所有流程都可以集中配置在一个XML文件中。
  2. 不需要将数据从一个请求转移到另一个请求的开销,因为它可以通过流范围完成。
  3. 它在面包屑导航等情况下尤其有用。
  4. 流程可以进一步划分为子流程以降低复杂性。

还有哪些是我没有调整过的吗?

此外,您可以使用后退按钮并保留状态,直到您选择存储的快照数量为止。

您可能还会发现 this related question 有用。

我要唱反调并说不要将它用于简单用例以外的任何用途。简单的用例意味着没有 ajax 调用,没有模态对话框,没有部分更新只是标准 html forms/flows 用于简单的持久性(即页面 ​​A -> 页面 B -> 页面 C,其中每个 'page' 映射到 1 对 1 关系中的视图状态定义,所有这些定义都在同一流 xml 文件中定义)。

Spring webflow 缺点​​:

  1. 是的,一切都在 xml 文件中,理论上它应该很简单,但是当你有多个流 xml 文件时,每个文件都有多个状态定义和可能的子流定义它维护起来很麻烦,或者很容易确定流的顺序逻辑是什么。 (有点像旧的 "GOTO operator",其中流逻辑的任何部分都可以跳回到任何先前或以后定义的部分,从而形成流逻辑,尽管在 xml 中看似 "sequential"... un-直观遵循)

  2. SpringWebflow 文档的某些功能不直观或完全没有记录,导致数小时的反复试验。例如,异常处理,'output' 标签的使用(仅在子流中有效->返回父调用者未记录),向用户发送回 flash 视图响应也是不直观的,并且使用与 Spring 不同的容器MVC(很多时候,当流程结束时,您想向在 webflow 外部的控制器中定义的用户发送消息...但是由于流程结束,您无法使用 flashScope 在 spring webflow 中执行此操作容器)等...

  3. 虽然听起来不错,但添加子流程并不会降低复杂性,实际上会增加复杂性。由于子流的定义方式。定义又长又复杂,当您在主要父流程和子子流程中都有许多最终状态时,可能会造成混淆。

  4. 如果与某些第 3 方视图框架(如 Apache Tiles 或 Theymeleaf)集成,初始设置和配置可能会很痛苦……我记得在这上面花了几个小时甚至几天。

  5. 状态快照(保存用户在页面之间的输入)虽然是流程 A view-state_1 <-> 流程 A view-state_2 的强大功能,反之亦然。这在 Main Flow A <-> Sub Flow B 之间不起作用,反之亦然......迫使开发人员手动绑定(或者更确切地说是 hack)保存父主流 <-> 子流之间的用户状态。

  6. 调试放置在 webflow 中的应用程序逻辑可能很困难。例如,在 webflow 中,您可以在 xml 中使用 SPEL 分配变量并执行条件检查,但这往往是一个陷阱。随着时间的推移,你会学会避免将应用程序逻辑放在实际的 webflow xml 中,并且只使用 xml 来调用服务 class 方法并将返回值放在各种范围内(同样这很难学习 lesson/best 实践未记录)。此外,因为您正在使用 SPEL 执行逻辑...重构 classes、方法名称或变量有时会默默地破坏您的应用程序,从而显着增加您的开发时间。

  7. 片段渲染... webflow 的一个强大但不直观的功能。设置片段渲染是我使用 webflow 必须做的最痛苦的事情之一。缺少文档。我认为如果有更好的文档记录和易于设置,此功能很容易成为专业人士。我实际上记录了如何通过 Whosebug 使用此功能...

  8. 每个流
  9. 静态 URL 秒。如果您的流程有多个视图,在 1 个流程中定义,您的 URL 将不会更改从视图状态到视图状态的导航。如果您想用动态 url 控制或匹配页面内容,这可能会受到限制。

  10. 如果您的流程在“/WEB-INF/flows/doSumTing/sumting-flow.xml”中定义并且您的 "base-path" 设置为 "WEB-INF/flows"。然后导航到您的流程,您转到 http://<your-host>/<your-webapp-name-if-defined>/doSumTing 。流文件名被完全忽略,根本不在 URL 中使用。虽然现在很清楚,但我刚开始时发现这不直观。

Spring Webflow 专家:

  1. "scope" 容器 flowScope、viewScope、flashScope、sessionScope 的概念以及对这些容器的轻松访问 WITH IN A FLOW 为开发人员提供了灵活性因为这些可以从任何地方访问并且是可变的。

  2. 轻松定义视图状态、操作状态、决策状态、结束状态,它清楚地定义了每个状态正在做什么,但如缺点中所述...如果您的应用程序很复杂并且有许多不同的状态和转换不断地来回......这会使你的 -flow.xml 文件变得混乱,难以阅读或遵循顺序逻辑。只有当您的用例简单且状态定义数量较少时,这才容易。

  3. 很少用到,但是webflow的一个强大的特性就是流继承。跨多个流的通用流功能可以在单个抽象父流中定义并由子流扩展(类似于 class 中的抽象定义 java)。如果您有许多共享通用逻辑的流程,那么此功能对于 DRY 原则来说非常有用。

  4. 易于定义的验证规则和对 JSR-303 的支持(但 Spring MVC 也有这个)

  5. 输出标签可用于在主流<->子流之间来回发送POJO。这个特性很好,因为参数不需要通过 get/post 通过 url 传递,并且可以传递任意数量的 POJO。

  6. 清晰定义的视图。视图名称是什么以及它被映射到哪个模型变量(例如 <view-state id="edit" view="#{flowScope.modelPathName}/editView" model="modelObj"> )。同样在刚刚演示的示例中,可以对视图名称或 webflow 中的大多数参数使用预处理表达式...不错的功能,但没有很好地记录:/

结论: Spring Webflow 项目是个好主意,理论上听起来不错,但缺点是在复杂的用例中使用起来很麻烦,显着增加了开发时间.由于存在针对复杂用例 (Spring MVC) 的更好解决方案,对我而言,不值得在网络流程上投入大量资金,因为您可以使用 Spring MVC 获得相同的结果,并且两者的开发时间都更快复杂和简单的用例。此外,Spring MVC 得到积极维护,拥有更好的文档和更大的用户社区。也许如果我的一些缺点得到解决,它会使天平向 Webflow 倾斜,但在那之前我会推荐 Spring MVC 而不是 webflow。

注意:我可能遗漏了一些东西,但这是我突然想到的。