系列:Oracle ADF 开发必读 — 第 8 部分


使用 Oracle Metadata Services 构建可定制应用程序

用实例介绍针对个性化和定制的 Oracle ADF 服务

作者:John Stegeman

2010 年 5 月发布

下载:


如今,应用程序用户希望他们经常使用的应用程序能够记住他们喜欢的工作方式,从而无需每次登录时都重新设置应用程序。例如,用户希望他们常用的搜索和屏幕布局日复一日地保持不变,以便他们更加轻松直观地使用应用程序。利用 Oracle Metadata Services 提供的基础,Oracle Application Development Framework (ADF) 应用程序可以提供这样的持久个性化。本文介绍如何配置您的 Oracle ADF 应用程序以允许最终用户进行定制。

桌面应用程序用户习惯于能够设置并保存他们的个人应用程序首选项。例如,Oracle JDeveloper 11 g 用户可以重排应用程序窗口并设置其他首选项,并且认为当他们退出 Oracle JDeveloper 11 g 并在第二天返回时,他们的首选布局和其他选项不会发生变化,和退出之前一样。通过以这种方式保存个人首选项,用户能够以所需的工作方式来定制应用程序,从而提高工作效率。如今,许多应用程序是通过 Web 浏览器提供的,将有越来越多的用户希望能够对基于 Web 的应用程序进行同样的定制。在新的应用程序中建立这样的可定制性可能需要花费大量开发时间;开发人员需要构建一个框架将个性化设置保存到一个数据存储中并在运行时对特定用户应用这些个性化设置。对于复杂的企业应用程序(如 Oracle E-Business Suite),为构建这样的框架而付出努力很可能是值得的;但对于较小的应用程序,这种努力常常是不值得的。

幸运的是,对于使用 Oracle ADF 的开发人员来说,Oracle 已为个性化和定制创建了服务并且已在 Oracle ADF 中集成了这些服务,这些服务称为 Oracle Metadata Services (MDS)。Oracle E-Business Suite 版本 11i 和 12 使用了 Oracle MDS 的前身以允许用户对自己的自助服务应用程序进行个性化设置,并允许应用程序管理员针对特定用户群定制应用程序的各个方面。在 Oracle JDeveloper 11 g 中,开发人员可以利用这些功能为 Oracle ADF Web 应用程序提供同样的功能。

本文撰写时使用的是 Oracle JDeveloper 11 g (11.1.1.2)。如果您使用所提供的示例应用程序,您将需要更改 Application Navigator 中 Application Resources 面板中定义的 HR 连接的连接信息。另请注意,要运行示例应用程序,您应遵循本文所述任何所需配置步骤。

Metadata Services 概念

Oracle MDS 将定制和个性化信息存储在一个信息库中。该信息库可以存储在数据库中,也可以存储在基于文件的存储中;由于可伸缩性和可靠性以及其他方面的原因,我强烈建议使用数据库存储 MDS 信息库(本系列的下一篇文章将介绍如何配置该信息库)。对于开发/测试/调试周期,与 Oracle JDeveloper 11 g 集成的 Oracle WebLogic Server 提供了一个本地 MDS 信息库,这样您就不需要为进行开发而单独建立一个信息库了。

这个 MDS 信息库可以存储各种类型的定制数据及其他元数据,包括:

  • 用户在运行时更改过的 Oracle ADF Faces 组件的特定属性(例如,表中各列的顺序)
  • 用户保存的搜索条目(用 af:query 组件创建的)
  • 在设计时针对包括 Oracle ADF Faces、Oracle ADF 业务组件和 Oracle ADF 控制器(页面流)在内的各种 Oracle ADF 内容开发的自定义设置
  • 对资源包的定制
  • 其他 Oracle 产品(如 Oracle B2B)的元数据
  • Oracle WebCenter 应用程序的元数据

本文将介绍如何配置 Oracle ADF 应用程序以允许最终用户在运行时进行定制,以及如何在开发环境下运行和测试可定制应用程序。本系列中的下一篇文章将介绍如何创建设计时定制,以及如何配置基于数据库的 MDS 信息库。

最终用户定制需求

为了让一个 Oracle ADF Faces 应用程序允许最终用户在运行时定制应用程序,您须执行以下几个步骤:

  • 配置 Oracle JDeveloper 11 g 项目以允许最终用户定制。
  • 配置默认的自定义类。Oracle JDeveloper 11 g 文档未明确是否需要执行此步骤;但在实际中,我发现如果省略了此步骤则更改不会持久,并且我还在日志中观察到如下错误:

    stegeman-mds1-f1

    图 1 如果未指定自定义类,日志中会出现警告

  • 针对要启用定制的 Oracle ADF Faces 组件配置 Oracle ADF 应用程序描述文件。
  • 为了在 af:query 组件中保存用户查询,要配置一个元数据命名空间(如 Oracle JDeveloper 11 g 版本说明中所述 — 如果您使用的是 Oracle JDeveloper 11 g 11.1.1.3 版,则不必如此)。
  • 为了进行部署,您必须创建并注册一个 Oracle MDS 信息库(随后的一篇文章将描述这一步骤)。

另外,您的应用程序还必须符合以下要求:

  • 您的 Oracle ADF Faces 页面必须以 XML 格式 (.jspx) 保存,并且必须为页面中的每个用户可定制组件指定一个 ID。之所以有这些要求,是因为 Oracle MDS 记录用户所进行的定制时使用的方式。
  • 您的应用程序必须启用安全性。这一要求是为了让 Oracle MDS 有一个身份,凭借这个身份来保存用户定制。

实际上,您首次创建 Oracle ADF 应用程序时,执行所有要求的步骤是最容易的,因为 Oracle JDeveloper 11 g 会替您配置一些设置项(如自动以 XML 格式创建您的 Oracle ADF Faces 页面)。

第 1 步:创建示例应用程序模型层

为了演示如何配置和测试最终用户定制,我将使用一个简单的应用程序。为了开发和运行该示例应用程序,您需要访问一个安装了 HR 示例模式的 Oracle 数据库。(您可以从这里下载 Oracle Database 快捷版 (XE),这是 Oracle Database 的一个免费版本。)首先,您将创建该应用程序并创建一些默认的 Oracle ADF 业务组件。然后,在您创建任何 Oracle ADF Faces 页面之前,您将配置该应用程序使其支持定制。最后,您将创建和测试一些可定制的页面。您可以执行下面总结的步骤来创建该应用程序,也可以下载示例应用程序。如果您愿意亲自创建该应用程序,请执行下面的步骤(我相信您已具备 Oracle JDeveloper 11 g 的一些基本经验,因此这里提供的是简要的步骤):

  1. 创建一个新的 Fusion Web Application (ADF),具体做法是从 Oracle JDeveloper 11 g
    File 菜单中选择 New,然后从 New Gallery 中选择相应的选项:

    创建一个新的 Fusion Web Application。

    图 2 创建一个新的 Fusion Web Application

    为该应用程序指定一个名称并接受所有默认设置,完成该应用程序的创建。

  2. 右键单击 Model 项目,然后选择 New,这将启动 Business Components from Tables 向导。创建一个到 HR 示例模式的数据库连接并创建以下 Oracle ADF 业务组件:
    1. EMPLOYEES 表的一个实体对象
    2. 一个基于 EMPLOYEES 实体对象的可更新的视图对象
    3. 没有只读视图对象(在向导的这一步只需单击 Next
    4. 一个默认的应用程序模块(一旦到达向导这一步,您就可以单击 Finish 了)

如果您愿意,可以通过右键单击该应用程序模块并选择 Run 来测试您创建的 Oracle ADF 业务组件。您应该能够双击 EmployeesView1 视图对象实例并滚动浏览数据库中的员工。

第 2 步:配置应用程序使其支持用户定制

如本文前面所述,理想情况下,您应在开始创建任何 Oracle ADF Faces 页面之前配置应用程序以使其支持最终用户定制。要配置该应用程序,执行以下步骤:

  1. 在 Application Navigator 中双击 ViewController 项目以显示项目属性。选择 ADF View 节点,通过选择对应的选项在会话上启用用户定制,然后单击 OK

    在 ViewController 项目中启用用户定制

    图 3 在 ViewController 项目中启用用户定制

  2. 使用 Application Navigator,展开 Application Resources 部分,双击 adf-config.xml 文件(该文件位于 Descriptors 文件夹的 ADF META-INF 子文件夹下):

    找到 adf-config.xml 文件

    图 4 找到 adf-config.xml 文件

  3. 为了让运行时更改真正地持久生效,必须至少注册一个自定义类。单击 Add 图标添加一个自定义类。在 Edit Customization Class 对话框中,指定 oracle.adf.share.config.UserCC 作为该自定义类的名称(这是 Oracle ADF 提供的默认自定义类;这里不使用该 UserCC 自定义类的功能,但为了让个性化生效,必须指定一个自定义类),然后单击 OK

    指定自定义类

    图 5 指定自定义类

  4. 指定哪些 Oracle ADF Faces 11 g 组件应允许最终用户定制。为此,选择 adf-config.xml 编辑器的 View 部分,然后使用 Add 按钮添加特定组件。对于我们的示例应用程序,我们将允许用户定制表中各列的顺序、大小及其他(通过对列组件启用定制来实现),并且允许用户定制是否显示特定的面板框(通过对 panelBox 组件启用定制来实现):

    将 panelBox 添加到可定制组件列表中。

    图 6 将 panelBox 添加到可定制组件列表中。

    当您将 column 和 panelBox 这两个组件添加到可定制标签列表之后,该编辑器应如下所示:

    adf-config.xml 编辑器显示 column 和 panelBox 为可定制标签

    图 7 adf-config.xml 编辑器显示 column 和 panelBox 为可定制标签

    如果您愿意,还可添加其他组件并指定这些组件的哪些特定属性将持久保存。有关默认情况下可持久保存的 Oracle ADF Faces 组件及其属性,可参阅此文档

  5. Oracle JDeveloper 11 g 版本说明中所述,为了对用户保存的查询启用持久性(针对 af:query 组件),您必须手动更改 adf-config.xml 文件的配置;如果您使用的是 Oracle JDeveloper 11 g 11.1.1.3 版,则不必进行手动更改。为了进行更改,单击 adf-config.xml 编辑器的 Source 选项卡以显示该文件的 XML 源代码。找到 cust-config 元素,将版本说明中的代码粘贴过来(我还想添加一条 XML 注释以便能记住添加该代码的原因)。完成此步骤之后,您的 adf-config.xml 文件的 adf-mds-config 元素应类似如下所示:

    手动更改后的 adf-config.xml 文件的 adf-mds-config 节

    图 8 手动更改后的 adf-config.xml 文件的 adf-mds-config 节

第 3 步:创建示例应用程序视图层

对于示例应用程序的视图层,您可以随意创建任何 Oracle ADF Faces 页面。在我的示例中,我选择创建两个页面:一个页面上包含一个 af:query 组件,这样我可以对用户查询保存功能进行测试。另一个页面上包含一个 af:table 组件和一些 af:panelBox,这样我可以对重新排列表列顺序的功能和显示/不显示面板框的功能进行测试)。要记住的关键事情是(如前所述),要确保您的 JavaServer Faces (JSF) 页面以 XML 格式 (.jspx) 保存并且您希望允许用户进行定制的组件已设置了 ID 属性。如果您已执行了至此为止的上述配置步骤,这两件事情会自动完成。下面我们来执行创建查询页面的步骤:

  1. 右键单击 ViewController 项目并启动 New 向导创建一个新的 JSF 页面。

    创建一个新的 JSF 页面

    图 9 创建一个新的 JSF 页面

  2. 为这个新页面指定一个名称,确保选中了 Create as XML Document (*.jspx) 选项,然后再单击 OK

    指定 JSF 页面名称

    图 10 指定 JSF 页面名称

  3. 在 Application Navigator 中展开 Data Controls 部分。展开 EmployeesView1 视图对象实例,在 Named Criteria 文件夹中找到 All Queriable Attributes。将 All Queriable Attributes 项作为一个 ADF Query Panel with Table 拖放到 JSF 页面上:

    创建 ADF 查询面板

    图 11 创建 ADF 查询面板

  4. 保留 Edit Table Columns 对话框中默认选中的选项,单击 OK

您可以仿照这一过程创建另一个包含 af:table 和 af:panelBox 组件(以及任何其他您想测试的组件)的示例页面。我创建了一个页面并将一个面板组布局从组件模板拖放到这个页面上;然后,我在该面板组布局中添加了一些面板框并将一些输出文本组件放入到这些面板框中。最后,我从数据控件模板中将 EmployeesView1 视图对象实例作为一个 ADF 表拖放到我的页面上。我的页面最终如下所示:

第二个 Oracle ADF Faces 示例页面

图 12 第二个 Oracle ADF Faces 示例页面

第 4 步:对应用程序启用 Oracle ADF 安全性

最后,在您可以对最终用户定制结果的持久性进行测试之前,需要对您的应用程序启用安全性以便 MDS 能够识别进行定制的用户;至少,您的应用程序需要进行身份验证配置。 OTN 的 ADF 代码角区域有一些涉及 ADF 安全性设置的教程(参见“ADF 代码角互联网电视”)。然而,为了进行演示,我们将对示例应用程序进行非常简单的安全设置。幸运的是,Oracle JDeveloper 11 g 提供的安全向导使我们可以相当容易地进行这个简单设置。要在示例应用程序中进行安全配置,执行以下步骤:

  1. 从 Application Navigator 的应用程序菜单启动 ADF Security 向导:

    启动 ADF Security 向导

    图 13 启动 ADF Security 向导

  2. 对于我们的简单测试,选择 ADF Authentication 并单击 Next

    只选择 ADF Authentication

    图 14 只选择 ADF Authentication

  3. 此时,您可以只单击 Finish 来结束该向导,如果您愿意,也可以单击 Next 经历每个不同的步骤以查看您可以使用的各个选项。
  4. 完成该向导后,Oracle JDeveloper 11 g 会显示一条消息告知您安全基础架构已创建,并且提供一个可获取详细信息的链接:

    安全基础架构已创建

    图 15 安全基础架构已创建

  5. 为了对这个启用了安全性的应用程序进行测试,您应使用 Oracle JDeveloper 11 g 的 jazn-data.xml 编辑器创建一些用户。您可以通过 Application Navigator 的菜单访问该编辑器,如下所示:

    打开 jazn-data.xml 编辑器

    图 16 打开 jazn-data.xml 编辑器

  6. 现在,您可以使用 Add 按钮在配置中添加一些用户。在我的测试中,我添加了两个名为“john”和“josephine”的用户,每个用户都用“weblogic1”作为口令。由于我们的测试应用程序只有身份验证(而没有授权),您不必为这些用户分配任何角色:

    创建用户

    图 17 创建用户

第 5 步:在集成的 Oracle WebLogic Server 中测试 Metadata Services

现在,您可以使用 Oracle JDeveloper 11 g 中集成的 Oracle WebLogic Server 对最终用户定制结果的持久性以及保存的查询的持久性进行测试了。您不必建立和注册一个 MDS 信息库,因为集成的 Oracle WebLogic Server 使用一个本地 MDS 信息库进行测试。您可以配置这个模拟的信息库,使其在每次重新运行应用程序时保留或删除最终用户的定制信息(默认情况下将保留最终用户的定制信息)。为了配置此项设置,可以从 Application Navigator 的菜单中选择 Application Properties

配置应用程序的属性

图 18 配置应用程序的属性

MDS 信息库的配置信息位于 Run 节点下面的 MDS 区域:

MDS 信息库的配置信息

图 19 MDS 信息库的配置信息

我们首先来测试 SampleControls 页面(内含面板框和表)。根据至此我们已进行的配置,我们认为用户对面板框的 disclosed/undisclosed 状态或表中各列的顺序所进行的任何更改应能保存下来,即使在用户退出后再次返回到该应用程序时也是如此。为了对此进行测试,我们现在运行该示例页面:右键单击该页面并选择 Run。应用程序启动后,会提示您输入登录信息登录该程序。首先我们以 john 用户身份登录。由于您以前未以 john 用户身份运行过该程序,该页面显示默认的设置(所有面板框都显示出来,表中各列以默认顺序排列):

默认设置下的 SampleControls 页面

图 20 默认设置下的 SampleControls 页面

对该页面进行一些更改,如关闭第二个面板框、缩小 EmployeeId 列的宽度、将 LastName 列拖到表中第一列的位置:

进行一些用户定制之后的 SampleControls 页面

图 21 进行一些用户定制之后的 SampleControls 页面

如果您自己的定制结果满意,则可通过关闭浏览器退出该应用程序(确保关闭您的浏览器的任何打开的实例,这样不会缓存凭证)。在 Oracle JDeveloper 11 gLog 窗口中,单击 Target URL 再次运行该程序:

在 Log 窗口中找到 Target URL

图 22 在 Log 窗口中找到 Target URL

这一次,以 josephine 用户身份登录该应用程序。您会看到在出现的页面中显示所有面板框,并且各列均为默认的大小、处于默认的位置,这是因为用户 John 所作的更改只是针对其个人的,只会对其个人生效。您可以重复此过程(关闭浏览器,再次运行该程序),以 John 用户身份登录,验证该用户以前所作更改保留了下来。

测试查询页面

您可以按相同的过程对用户保存的查询的持久性进行测试,这次是运行 QueryTest.jspx 页面(右键单击该页面并选择 Run)。我们来创建和保存这样一个查询,该查询查找所有姓“Smith”的员工。为此,可在查询面板的 LastName 区域中键入 Smith,然后单击 Search 按钮来验证这个搜索:

创建 Smith 搜索

图 23 创建 Smith 搜索

接下来,我们保存该搜索:单击 Save 按钮并为该查询提供一个名称。

保存 Smith 搜索

图 24 保存 Smith 搜索

现在可以验证该搜索已保存下来了:关闭浏览器窗口,以 john 或 josephine 用户身份再次登录程序,确认已对那个当事人保存了该搜索。当事人应可在 Saved Search 列表中看到保存的搜索:

查看保存的搜索

图 25 查看保存的搜索

总结

您已了解如何对 Oracle ADF Faces 应用程序启用和配置最终用户定制持久性、如何在集成的 Oracle WebLogic Server 中对这样的应用程序进行测试。本系列的下一篇文章将实施种子定制以针对不同的用户群设计不同的应用程序体验。

转到第 10 部分 | 返回目录

 

资源


John Stegeman ( stegemanoracle.wordpress.com) 是一位 Oracle ACE 总监(Oracle 融合中间件),也是 Xchanging 这个全球性业务流程外包和 IT 服务公司的一位架构师。他从 1990 年开始就使用 Oracle 产品工作,从版本 3 开始就使用 Oracle JDeveloper 了。