什么时候在Spring MVC上使用Spring WebFlow是有意义的?

Spring MVC已经成为构建企业Web应用程序的一个非常流行的框架。 任何复杂的Web应用程序都有某些需要编码的流程,包括一些条件流程(即,如果信用卡信息正确则显示处理顺序,如果未正确输入某些内容则显示validation错误)。

什么时候在Spring MVC上使用Spring WebFlow是有意义的? 关于使用Spring WebFlow的决策过程应该是什么?

如果您的Web应用程序具有一些应用程序进程。 例如,如果您有某种注册过程,一个按钮可以转到一个页面而另一个按钮可以转到另一个页面。 Spring Webflow可以很好地处理转换到不同的进程集。

基本上,如果应用程序的某些部分是链接的,并且页面在执行过程中相互依赖,则可以使用SWF。

在webflow中我个人最喜欢的是两件事:

  1. 能够inheritance流和视图状态。 当您想要在应用程序的不同部分之间共享一些常见的逻辑方面时,这非常方便。 例如,您有要在单独的流中抽象的CRUD逻辑,然后允许子流inheritance此逻辑。 每个流都可以有输入和输出,因此您的逻辑可以非常精细。
  2. 强大的测试框架。 在unit testing中,可以涵盖流逻辑的几乎所有方面。 您可以模拟许多程序化的东西,例如动作激活,从一个视图到另一个视图的转换,流持久性处理等等

我不喜欢的是新版本的不一致和后向兼容性差。 例如,最新的webflow 2.1与JSF 1.x jira不兼容。 与Spring Security集成也存在许多问题。 例如,在spring security 3.x中,他们只更改了一些包名称。通常,正如Sasi所说,webflow几乎会迫使你在不同的webflow中分离你的逻辑 – 我认为这很好。

Webflow有效解决的一个问题是它与控制逻辑完全分离(或者至少很难混合)业务逻辑。
同意@John的用例,但我想指出一旦你开始大量使用webflow,你会发现自己编写了很多xml文件(因为在webflow中你指定了xml文件中的所有流)。 对我个人而言,这几乎是一个破坏性的交易。

我使用过MVC和SWF。 我个人更喜欢SWF而不是MVC,原因如下:

  1. Spring MVC没有内置的机制来跨同一浏览器中的多个选项卡进行会话控制。
  2. 在SWF中处理浏览器返回比MVC更容易。