在本文中,我将考虑在Oracle ADF和Oracle Jet的组合之上实现应用程序的各种体系结构模式。 练习ADF的组织可能会考虑将Oracle Jet合并到现有项目中,以刷新外观并使其具有现代感和响应能力,并以新方式实施新功能。 它可能会考虑将Oracle Jet用于全新的项目,以及显然用于与移动设备的混合应用程序开发相关的项目。
Oracle Jet与UI有关,仅与客户端有关。 因此,无论如何,服务器端都必须实现一些东西。 显然,许多组织将决定使用ADF来重用其在ADF中的知识,经验,实施和投资。 这是很合理的。 因此,让我们看一下在将Oracle Jet与Oracle ADF相结合时我们有哪些选择。
第一个,最明显和最受欢迎的选择是将Oracle Jet置于ADF BC之上。 因此,Web或混合移动应用程序的客户端是通过Jet实现的,而服务器端是作为Rest服务公开的ADF BC。 借助JDeveloper 12.2.x,您只需单击几下鼠标便可以将ADF BC作为Rest服务公开。
这种方法的优点是非常简单的体系结构。 简单的东西就有机会工作更长的时间。 另一个非常有价值的好处是,我们将重用我们的资源,我们的知识和ADF经验,如果正确地实现了现有的ADF应用程序,那么我们将重用业务逻辑实现的最关键部分。
但是,我们必须了解,在ADF应用程序中完美运行的ADF BC商业服务对于Jet应用程序可能没有用。 这是为什么? 主要原因是我们更改了状态管理模型。 我们从经典的ADF有状态行为切换为REST无状态模型。 此外,在Jet Web和Hybrid应用程序中,UI设计更有可能会有所不同。
因此,我们需要创建新的ADF BC服务,以支持无状态模型并为新UI的方便提供服务。
好消息是,我们不必从头开始构建所有内容。 如果以正确的方式构建现有的ADF BC模型,则我们可以重用其核心部分,包括实体和在实体级别实现的业务逻辑。
因此,我们可以将整个ADF BC模型拆分为包含实体,实用程序和共享AM的核心部分,以及包含特定AM和VO并为ADF应用程序和Jet应用程序提供服务的外观部分。
重新考虑了我们的ADF BC并准备好为ADF和Jet应用程序提供服务后,我们现在可以将Jet功能集成到现有的ADF项目中。 常见的架构方法是
为了使用ADF来实现系统的某些页面,一些页面是使用Jet来实现的,还有一个移动混合应用程序也可以通过Oracle Jet来实现。
这种方法的优点是我们将事物分开保存。 看起来不同的应用程序在共同的业务模型之上运行。 每个应用程序都引入了自己的UI,适用于针对其实现的那些用例。 此外,它们为整个系统提供了不同的入口点。 我们可以通过常规ADF页面访问它,我们可以与移动设备一起使用,也可以从Jet网页访问它,而Jet网页又可以轻松地集成到任何父级网页中,例如门户网站应用程序。
但是这种优势可能会变成一种劣势,因为对于每个进入点,我们都应该考虑身份验证,内部化,本地化等。
这种方法将更多的运行组件带入整个系统结构,因此CI,CD,自动化测试和环境在这里变得更加复杂。
另一个明显的选择是将Jet内容集成到ADF页面中,以便从用户角度看它看起来像一个页面,但在幕后却是两个不同Web应用程序的混合。
这个选项不是我的最爱,我会避免。 因为基本上,您在这里要做的是在同一页面上混合两个Web应用程序。 这意味着将有两个具有不同事务的不同会话,因此会有独立的实体缓存和用户上下文。
Jet内容不参与JSF生命周期,因此整个页面以两种不同的方式提交。 ADF希望拥有整个页面,因此诸如响应式几何管理和“拖放”之类的出色功能将不适用于Jet内容。
在我看来,当我们需要在页面上显示一些外部内容形式时,这种方法在非常特殊的情况下是有意义的。 例如,如果我们的页面是门户或仪表板的一种,它在一个地方收集来自不同来源的数据。 在这种情况下,可以在类似的页面和常规Jet应用程序中使用相同的Jet组件。
当我们通过远程任务流调用将ADF内容集成到Jet页面时,同样的考虑也针对相反的方法。 该技术很有意义,但是当我们想重用Jet中未实现的现有ADF功能时,仅应在特定的用例中使用。 至少目前还没有。 这种方法不应用作构建我们的应用程序的标准工具。
最重要的是,Oracle ADF和Oracle JET可以完美地协同工作,这对于拥有扎实的ADF背景的组织来说是一个不错的选择。 唯一的选择就是明智地选择将这两个完全不同的工具结合在一起的体系结构方法。
而已
翻译自: https://www.javacodegeeks.com/2018/05/oracle-adf-jet-architecture-patterns.html