如何在 Java Web 应用程序中实现复杂的页面流

Posted

技术标签:

【中文标题】如何在 Java Web 应用程序中实现复杂的页面流【英文标题】:How to implement a complex page flow in a Java Web application 【发布时间】:2012-11-04 04:10:51 【问题描述】:

我正在尝试将一个相当复杂的页面流(100 多个页面)实现为传统的 Web 应用程序。我找到了一些选择,但没有一个是 100% 令人信服的

    将流程硬编码到控制器中,进行重定向等。这显然不是维护的最佳选择 JSF不仅处理流程,还要求使用JSF作为视图技术。我不喜欢这种锁定 Spring 网络流。当前版本 2.3.1 定义了不易维护的 XML 流。即将发布的 3.0 版本承诺在纯 java 中使用注释定义流,但它甚至没有时间表。此外,过去几年项目开发速度显着放缓。 GWT 和 Vaadin 的概念更接近于传统的桌面应用程序,然后是 Web 应用程序,使用起来确实很方便,但不适合我的项目。

另外我发现了几十个这样的废弃项目:http://javasteps.sourceforge.net/

我想知道为什么所有这些项目都被放弃了,2012年实现复杂页面流的方法是什么?

【问题讨论】:

使用 BPM 定义流程怎么样?基于此,您可以使用不同的 model-2-text 工具来生成例如 spring web mvc 控制器。 @SpaceTrucker BPM 可以做很多事情,但相当复杂,并不真正适用于页面流。在我看来,Spring Web Flow 就像一个迷你 BPM,但只用于页面流,所以如果必须的话,我宁愿使用它...... 我其实很喜欢当前 Spring WebFlow 的 XML 文件方式。我可以在一个地方看到整个流程。这就是我一直对基于注释的方法感到困扰的地方。您必须深入挖掘每个文件才能看到整个结构。也就是说,也许我只是无知,时间会说服我 :-) 我喜欢带注释的“服务”,但它们往往不需要位于大型服务器端流程中。 @dbreaux 我同意,起初 XML 看起来不错,因为它是所有流的单一标准源。我的问题是 XML 不适合编程,它没有验证或验证有限,尤其是在 Spring Web 流中,我将实际的 Java 代码与 XML 混合在一起。另一方面,Spring Source Tools 有一个很好的可视化工具,它甚至可以像使用 XML 一样可视化带注释的流。无论如何这只是梦想,因为我还没有找到基于注释的流引擎,但是...... 我现在正在开发一个新的 Web Flow 应用程序,我真的很喜欢我可以从 XML 中进行基本的字段设置,而无需任何 Java 代码。尽管我同意 XML 中的“编码”也有一些缺点。也同意我喜欢 STS 可视化工具。但也 【参考方案1】:

我个人推荐单页架构:

Architecture of a single-page javascript web application?

我不确定这对您的应用程序是否可行。我已经使用了你上面提到的所有流程,目前正在开发一个单页应用程序,我喜欢它。我们在客户端使用 Dojo,它调用服务器上的 REST API。已经很不错了。

Vaadin 也非常可靠,并且比简单的 GWT 更容易设置。如果您的项目中有很多 UI 人员喜欢用 CSS 和 Javascript 编写代码,那么他们会讨厌这种方法。

Spring Webflow 实际上非常可靠。我有一段时间没看它了,但是当我使用它时,它完成了我当时所做的工作。

【讨论】:

顺便说一句,我知道您提到它是一个 Java 应用程序,但我想我只是假设您可以将服务器端 Java 编写为 REST API,然后使用 Javascript 编写前端代码。同样,对您来说可能不可行。 您引用的答案建议使用 PureMVC,我只是快速查看了一下,但似乎它与 Vaadin 和 GWT 所做的非常相似,所以不确定有什么优势。我非常喜欢 Vaading 和 GWT,但我觉得它并不完全适合我的项目,因为我需要对生成的 html 进行更细粒度的控制。您提到您目前正在开发单页应用程序,您使用 Pure MVC 还是其他方式? 我们正在为我们的应用程序使用 Dojo 小部件和模板。我们还使用了一些使用 Dojo 的 lang.replace 功能的模板,它基本上将 HTML 处理为类似于 Mustache.js。如果您需要对 HTML 进行更细粒度的控制,那么 JS 框架可能非常适合您。 JSF 生成垃圾,Vaadin 和 GWT 也生成 HTML。使用 Dojo、Backbone 或 PureMVC 等框架,您可以自己编写 HTML。 我只是仍然想念它如何帮助我减少处理服务器端页面流的无尽 if else 语句的可怕混乱。 对不起,我完全忘了回复这个。你看过骨干吗? Backbone 中的路由器实现也可能对您有所帮助。【参考方案2】:

这真的很晚了,但我没有看到这个问题的令人满意的答案,并想分享我在最近的一个项目中尝试过的一种方法,我觉得它比严格绑定到的 spring web flow 方法更好春天的景色。我使用带有 Spring MVC 的 Angular js 创建了一个 SPA。在 Angular js 中,我没有使用路由器或状态,而是在控制器中创建了一个 div,如下所示

<div  id="fullertonDataPanel" ng-include="page"></div>

在服务器端,为了捕获从一帧(我指的是 SPA 中的特定屏幕)到另一帧的所有可能转换,我使用 MVEL 创建了一个规则树。所以在数据库中,我有一个结构,它为每一帧存储了一棵规则树。 MVEL 表达式中的数据由每个操作调用的各种服务设置。因此,任何操作都遵循以下步骤。

1) 验证操作。

2) 调用各种服务。

3) 从这些服务中捕获数据并将其与用户的现有数据合并。

4) 将此捕获的数据连同当前帧的详细信息一起输入到每个帧的规则集合中。

5) 对当前帧运行树 w.r.t 的规则并获取其输出。

6) 如果只有一个转换,那么这就是最终转换。如果有 2 个转换并且一个是默认转换,则忽略默认转换并使用另一个转换。

7) 将转场的模板名称返回给角度控制器,并在控制器范围内设置页面变量的值。

使用这种方法,我的所有服务所要做的就是将数据存储在不同的数据字段中,以执行特定操作。 Web Flows 或任何复杂流程定义(如 Spring-Web Flow 中定义的定义)的所有复杂 if-else 条件都不是必需的。 MVEL 规则引擎管理所有这些,并且由于它们都在数据库中,因此无需重新启动服务器即可更改它。

我相信这种使用 MVEL 的通用方法是一种灵活的方法,它可以全面处理复杂流程的问题,而不会使应用程序代码混乱或添加额外的不必要的 xml 文件。

【讨论】:

【参考方案3】:

Vaadin 组件模型有一个新的 MVC 框架和 Web 流实现,称为 Lexaden Web Flow

您可以在您的应用程序中试用它作为可能的替代方案。

【讨论】:

以上是关于如何在 Java Web 应用程序中实现复杂的页面流的主要内容,如果未能解决你的问题,请参考以下文章

在 Google Web Toolkit (GWT) 中实现页眉、页脚和菜单栏

如何在单页移动 Web 应用程序中实现我自己的历史堆栈?

如何在 Hybrid iOS 应用程序中实现 WebRTC?

如何在 Zend Framework 2 中实现表单预览页面?

使用 servlet 在 Java 中实现 REST Web 服务 [重复]

如何在 Razor 页面中实现两个具有单独 BindProperties 的表单?