这真的很晚了,但我看不到这个问题的令人满意的答案,并且想分享我在最近的一个项目中尝试过的一种方法,我觉得它比严格绑定到弹簧视图的弹簧网络流方法更好。我使用带有 Spring MVC 的 Angular js 创建了一个 SPA。在 Angular js 中,我没有使用路由器或状态,而是在控制器中创建了一个 div,如下所示
<div width="100%" id="fullertonDataPanel" ng-include="page"></div>
在服务器端,为了捕获从一个帧(我指的是 SPA 中的特定屏幕)到另一个帧的所有可能转换,我使用 MVEL 创建了一个规则树。所以在数据库中,我有一个结构,它为每一帧存储了一棵规则树。MVEL 表达式中的数据由每个操作调用的各种服务设置。因此,对于任何操作,都遵循以下步骤。
1) 验证动作。
2) 调用各种服务。
3) 从这些服务中捕获数据,并将其与用户的现有数据合并。
4) 将此捕获的数据连同当前帧的详细信息一起输入到每个帧的规则集合中。
5) 将树的规则运行到当前帧并获取其输出。
6) 如果只有一个转换,那么这就是最终转换。如果有 2 个转换并且一个是默认转换,则忽略默认转换并使用另一个转换。
7)将过渡的模板名称返回给角度控制器,并在控制器范围内设置页面变量的值。
使用这种方法,我的所有服务所要做的就是将数据存储在特定操作的不同数据字段中。Web Flows 或任何复杂流程定义(如 Spring-Web Flow 中定义的定义)的所有复杂 if-else 条件都不是必需的。MVEL 规则引擎管理所有这些,并且由于它们都在数据库中,因此无需重新启动服务器即可更改它。
我相信这种带有 MVEL 的通用方法是一种灵活的方法,它可以全面处理复杂流的问题,而不会使应用程序代码混乱或添加额外的不必要的 xml 文件。