使用 ADF 业务组件开发业务服务

目的

在本教程中,您要为应用程序创建业务服务。业务服务是应用程序的一部分,它负责持久化应用程序中的数据以及在中间层实现业务规则。此处有若干种不同的技术可供选用。在本教程中,您将针对中间层业务服务使用 Oracle ADF 业务组件,然后向该模型添加验证和业务规则。

所需时间

大约 50 分钟

主题

本教程包括下列主题:

 概述
 情景
 前提条件
 构建业务模型

实现业务规则

 测试模型
 总结

查看屏幕截图

 将鼠标置于此图标上 可以加载和查看该组件选项板的所有屏幕截图。(警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)

注:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图来将其隐藏。

概述

在开发 Java 应用程序时,您可以使用 ADF 业务组件映射到底层数据库表,或在将数据提交到数据库之前将其持久保存到应用程序中。ADF 业务组件包含实体对象、视图对象和应用程序模块。

您将创建一系列实体对象和视图对象,并将它们添加到一个应用程序模块。然后,实现验证和业务规则,并测试该模型以确保其可正常运行。

返回主题列表

情景

计划的应用程序将处理来自 CUSTOMERS 和 ORDERS 表的数据。然而,并非所有的数据都可显示在计划的应用程序中,某些页面将显示来自多个表的数据。您需要指定希望从数据库表显示的数据,还需要在模型中实现业务规则,以便所有用户界面都执行该规则。

返回主题列表

前提条件

开始本教程之前,您应该:

1.

可以访问或已经安装了 Oracle JDeveloper (10.1.3.1.0)。可以从 Oracle 技术网下载它。

2.

可以访问或已经安装了 Oracle 数据库 10g 随附的 Oracle 示例模式。

本教程使用 OE 模式。具体来说,页面使用了 EMPLOYEES 表。

可以在线获取有关在 JDeveloper 中安装 OE 模式并创建到其的连接的指导:

http://www.oracle.com/technology/obe/obe1013jdev/common/OBEConnection.htm

3.

启动 JDeveloper。双击 JDeveloper 可执行文件 jdeveloper.exe ,该文件位于您解压缩它的根目录 ( &ltjdev_home> ) 中。

如果 Migrate User Settings 对话框打开,请单击 NO

关闭 Tip of the Day 窗口。

4.

现在应显示 JDeveloper IDE。

返回主题列表

构建业务模型

创建 ADF 业务组件的方法有多种。本教程将结合使用这些方法。为应用程序构建 ADF 业务组件涉及以下任务:

 创建数据库连接
 创建应用程序和项目
 创建 ADF 业务组件
 自定义业务组件

创建数据库连接

Java 数据库连接 (JDBC) 是 Java 应用程序用于连接关系数据库的一种标准应用程序编程接口 (API)。要创建本教程中使用的 OE 模式的 JDBC 连接,执行以下步骤:

1.

单击 Connections Navigator 选项卡(如果没有显示 Connections Navigator),选择 View | Connection Navigator

将鼠标置于该图标上可以查看该图像

2.

右键单击 Database 节点,从上下文菜单中选择 New Database Connection。单击 OK

将鼠标置于该图标上可以查看该图像

3.

如果显示了 Create Database Connection 向导的 Welcome 页面,则单击 Next

在此向导的 Type 页面上,输入连接名称 oeconn,然后单击 Next

将鼠标置于该图标上可以查看该图像

4.

在此向导的 Authentication 页面上,输入 oe 作为 Username,输入 oe 作为 Password。选中 Deploy Password 复选框,然后按 Next

将鼠标置于该图标上可以查看该图像

5.

在此向导的 Connection 页面上,输入 localhost 作为 Host Name,输入 XE 作为 SID。单击 Next

将鼠标置于该图标上可以查看该图像

6.

单击 Test Connection

如果数据库可用并且连接详细信息正确,则您将在 Status 窗口中看到 Success!

如果发生错误,单击 Back 进行任何必要的修改,然后重新测试连接。

如果连接成功,单击 Finish

将鼠标置于该图标上可以查看该图像

7.

该连接现在应出现在 Connection Navigator 中的 Database connection 节点下。

将鼠标置于该图标上可以查看该图像

8. 单击 Save All Save All 按钮,或选择 File | Save All 来保存您的工作。

返回主题

创建应用程序和项目

在 JDeveloper 中,文件按应用程序和项目排列。应用程序是控制结构中最高的一级,由一个或多个项目组成。JDeveloper 项目是用于按逻辑分组相关文件的组织结构。您可以使用项目来组织源代码。

JDeveloper 通过模板只显示那些您感兴趣的特定工作方面所需的技术选项。如果您针对应用程序应用 Web Application [JSF, ADF BC] 模板,则 JDeveloper 将插入两个项目:Model 和 ViewController。

要创建本教程所需的应用程序和项目,执行下列步骤:

1.

单击 Applications Navigator 选项卡。

在 Application Navigator 中,右键单击 Applications 节点,然后从上下文菜单中选择 New Application

2.

在 Create Application 对话框中,输入 OrderEntry 作为 Application Name。注意,当您输入应用程序名时,目录名将自动改变。

从 Application Template 下拉列表中选择 Web Application [JSF, ADF BC],然后单击 OK


3.

Applications Navigator 现在显示了 OrderEntry 应用程序和两个节点。在本教程中,您将在 Model 项目中构建业务组件。而在另一个教程中,您将使用 ViewController 项目构建用户界面。

返回主题

创建 ADF 业务组件

现在,开始构建 ADF 业务组件。创建业务组件的方法有若干种,但在此练习中,请使用向导进行创建。

该向导将引导您按步骤创建:

要创建充当应用程序数据模型的业务组件,执行以下步骤:

1.

在 OrderEntry 应用程序中,右键单击 Model 项目,然后从上下文菜单中选择 New

将鼠标置于该图标上可以查看该图像

2.

在 New Gallery 中,展开 Categories 列表中的 Business Tier,并选择 ADF Business Components,然后从 Items 列表中选择 Business Components from Tables

单击 OK

将鼠标置于该图标上可以查看该图像

3.

在 Initialize Business Components Project 对话框中,从 Connection 下拉列表中选择 oeconn,然后单击 OK

将鼠标置于该图标上可以查看该图像

4.

如果显示 Create Business Components from Tables 向导的 Welcome 页面,则单击 Next

在向导的 Entity Objects 页面上,您可以指定其中将创建实体对象的程序包的名称。接受默认程序包,其名为 model

您还可以指定实体对象所基于的数据库表。单击 Query 显示可用表的清单。

将鼠标置于该图标上可以查看该图像

5.

在 Available 列表中,通过 [Ctrl]+[单击] 选中以下两个表: CUSTOMERSORDERS。单击 Add  将其移入 Selected 列表中。

将鼠标置于该图标上可以查看该图像

单击 Next

6.

在向导的 Updatable View Objects 页面上,您可以创建从实体对象查询数据的视图对象。

程序包对于分组工作的逻辑片段很有用处。要将视图对象放入自己单独的程序包中,请将 Package 更改为 model.queries

单击 Add All  将实体对象移入 Selected 列表,然后单击 Next

将鼠标置于该图标上可以查看该图像

7.

在向导的 Read-Only View Objects 页面上,单击 Next,因为您希望只创建可更新的视图对象。

将鼠标置于该图标上可以查看该图像

8.

在向导的 Application Module 页面上,选中 Application Module 复选框。

要将应用程序模块放入自己的程序包中,请将 Package 更改为 model.services

为该应用程序模块指定名称 CustomerOrderBusinessService ,然后单击 Next

将鼠标置于该图标上可以查看该图像

9.

在向导的 Diagram 页面上,您可以选择创建业务组件的直观表示。为此,选中 Business Components Diagram 复选框。

将 Package 设为 model ,将 Name 设为 CustomerAppBC_Diagram

取消选中 Domains 复选框,然后单击 Next

将鼠标置于该图标上可以查看该图像

10.

在向导的 Finish 页面上,您可以查看对象列表,然后单击 Finish 进行对象创建。

将鼠标置于该图标上可以查看该图像

11.

创建完成后,业务组件图将在编辑器中打开。您可以缩放该图,或使用编辑器窗口顶部的工具更改组件的排列,可以来回滚动查看已创建的对象。

将鼠标置于该图标上可以查看该图像

12.

在 Applications Navigator 中,您还可以查看已创建的对象。展开 Model 对象和 Application Sources 节点。您应当看到三个程序包和一个业务组件图。

展开各个程序包以查看 model 程序包中创建的实体对象、 model.queries 程序包中创建的视图对象以及 model.services 程序包中创建的应用程序模块。

将鼠标置于该图标上可以查看该图像

.

13. 单击 Save All Save All 按钮,或选择 File | Save All 来保存您的工作。

返回主题

自定义业务组件

使用该向导创建的业务组件可能需要进行修改,具体取决于您打算在其中使用这些业务组件的应用程序。在这一部分的练习中,您将自定义默认的业务组件。

通常,实体对象的属性采用一对一的方式映射到数据库中的列,并且它们在应用程序中的一些视图对象中得到重复使用。但在某些情况下,您需要限制实体对象中的属性。在本例中,您将从实体对象中移除应用程序不再使用的属性,但首先必须将该属性从相关视图对象中移除。您还要移除视图对象中的属性,但保留实体对象中的该属性。

另一个要做的修改是删除数据模型中的一个 OrdersView 视图对象实例,该实例可访问独立于客户信息的订单信息。计划的应用程序仅访问与客户相关的订单,因此模型中不需要这个多余的 OrdersView 实例。

要对业务组件进行这些修改,执行以下步骤:

1.

要移除实体对象中的属性,首先必须将该属性从相关视图对象中移除。

您可以通过各种方法编辑业务组件。本教程将使用 Applications Navigator 和业务组件图来编辑对象。图中的业务组件与 Applications Navigator 中的对象保持同步。

在 Applications Navigator 中,右键单击 CustomersView 视图对象,并从上下文菜单中选择 Edit CustomersView

2.

在 View Object Editor 中,选择左侧树中的 Attributes 节点

在右侧的 Selected 列表中,选择 CustGeoLocation 并单击 Remove  将其移入 Selected 列表。

单击 OK


3.

在该图中,右键单击 Customers 实体对象,然后从上下文菜单中选择 Properties

4.

在 Entity Object Editor 中,从左侧树中选择 Attributes,并从右侧 Entity Attributes 面板中选择 CustGeoLocation 属性。单击 Remove 删除该属性。

单击 OK

:或者,您可以直接从图中删除该属性。请确保只删除该属性而不是整个实体。

5.

如前所述,视图对象就是查询,没有必要镜像实体对象中的所有属性。OrdersView 视图对象中的 Orders 实体对象无需 PromotionId 属性;但是,可将其保留在实体对象中,因为不同的应用程序可能会用到该属性。

在图中,双击 OrdersView 调用 View Object Editor,然后选择 Attributes 节点。选择 PromotionId 并单击 Remove Add Instance button 将该属性从 Selected 列表中移出。

单击 OK

6.

双击 CustomerOrdersBusinessService 应用程序模块以调用 Application Module Editor。注意数据模型中视图对象间的层次关系。

7.

注意,在 Application Module Editor 中,CustomersView1 具有一个称为 OrdersView2 的详细视图对象。这种关联根据数据库中的外键默认创建。

该应用程序模块还包含另一个 OrdersView 实例,名为 OrdersView1。您可以使用该实例直接访问订单。然而,在计划的应用程序中,您打算只访问与客户相关的订单,因此无需该独立的 OrdersView 实例,可将其从数据模型中移除。

要从模型中将其删除,请选择 OrdersView1 并单击 Remove Instance

单击 OK 更新该应用程序模块,并离开 Application Module Editor。

8.

在该图上,注意 OrdersView1 视图对象实例不再显示在该应用程序模块中。

要调整图中应用程序模块的大小,右键单击 CustomerOrderBusinessService 应用程序模块,然后从上下文菜单中选择 Optimize Shape Size | Height and Width

9.

单击 Save All Save All 按钮,或选择 File | Save All 来保存您的工作。

返回主题

返回主题列表

实现业务规则

您当前使用的数据库模式通过数据库中的约束和 PL/SQL 对数据实施了一些业务规则。例如,客户的信贷限额必须小于或等于 5000。但在本教程中,您先在中间层通过业务组件以声明方式完成验证,然后再将数据提交给数据库。

要将规则添加到模型中,执行下列步骤:

 添加简单的验证规则
 定义格式掩码
 指定默认值
 修改视图对象属性
 添加自定义验证

返回主题列表

添加简单的验证规则

公司业务规则将 5000 定义为客户信贷的绝对上限。但就订单输入而言,客户信贷限额不得大于 4000。此业务规则将在订单输入应用程序中实现。

要在实体对象中实现验证,执行以下步骤:

1.

在 Applications Navigator 中,展开 OrderEntry | Model 项目和 Application Sources | model 程序包。右键单击 Customers 实体对象,然后从上下文菜单中选择 Edit Customers

?

2.

在 Entity Object Editor 的树控件中,选择 Validation

从 Declared Validation Rules 列表中选择 CreditLimit

单击 New,添加一组新的验证条件。


3.

使用 Rules 下拉列表查看可供您使用的不同类型的规则。

在本示例中,您需要 Compare Validator,因此请从 Rules 下拉列表中选择它,并设置以下值:

属性 CreditLimit
运算符 LessOrEqualTo
比较对象 字面值
输入字面值 4000
错误消息 客户的信贷限额必须小于 4000

单击 OK

您已经添加了一个实体对象级的验证规则。这意味着所有访问它的视图对象和应用程序模块可以重复使用它。

如果您有时间:请尝试添加其他简单的验证规则,如:

 将 Marital Status 的值限制为“married”或“single”。
 将 Gender 的值限制为“M”或“F”。

提示:请将 List Validator 规则用于此类验证。提供的帮助给出了如何添加列表项的建议。

保持 Entity Object Editor 打开以用于下一部分的教程。

返回主题

定义格式掩码

您需要确保数据以一致的格式显示,而不管访问它的方式如何。在本例中,信贷限额是一个货币额度,因此应使用正确的货币符号和小数分隔符显示。出生日期应以 MM/DD/YY 格式显示。

要向信贷限额和出生日期属性中加入格式掩码,执行以下步骤:

1.

Customers 实体对象打开 Entity Object Editor 后,在树控件中展开 Attributes 节点。

从展开的节点中选择 CreditLimit,并选择 Control Hints 选项卡。

?

2.

从 Format Type 下拉列表中选择 Currency

输入所选择的 Tooltip Text。


3.

从左侧的树中选择 DateOfBirth,然后单击 Control Hints 选项卡。

从 Format Type 下拉列表中选择 Simple Date

Format 下拉列表中的预定义格式掩码不符合您的需要,因此请在 Format 字段中输入您自己的格式掩码: MM/dd/yy 并单击 Apply 接受这些更改。

将鼠标置于该图标上可以查看该图像

:格式掩码区分大小写,并且必须 完全按上面所示原样输入。

4.

当右侧的 Control Hints 选项卡激活时,单击左侧树中的属性并更新属性 CustFirstName 的标签文本以显示标签 Name ,并更新 CustLastName 以显示标签 Surname 单击 Apply 接受这些更改。

将鼠标置于该图标上可以查看该图像

注: 此格式化方法是在实体对象级别添加的。这意味着所有访问它的视图对象和应用程序模块可以重复使用它。

保持 Entity Object Editor 打开以用于下一部分的教程。

返回主题

指定默认值

某些字段应自动填充默认值。在本例中,新客户的 CreditLimit 默认设置为 100。操作员可以改写该值,但在此应用程序中应该提供默认值(类似于 Forms 中的初始值)。

要向实体对象中添加默认值 ,执行以下步骤:

1.

从展开的 Attributes 节点中选择 CreditLimit,然后选择 Entity Attribute 选项卡。

将 Default 设置为 100,然后单击 OK 更新实体对象并关闭此编辑器。

?

2.

单击 Save All Save All 按钮 保存您的工作。

返回主题

修改视图对象属性

以上更改是在实体对象级别进行的,还可以在视图对象级别进行类似更改。

在应用程序中,有一些使用同一实体对象的视图对象。在多数情况下,在实体对象级别更新属性可能很有用。如果您将视图对象考虑为查询(例如,从一些表中选择列),那么在某些实例中,您可能希望在视图对象级而不是实体对象级更改一些属性。例如,您可能希望为值列表创建视图对象,或在视图对象上具有一个 order by 子句。在本练习中,我们所要做的就是在视图对象级上稍做调整,以对此进行说明。

要修改视图对象,执行以下步骤:

1.

在该图或 Application Navigator 中,双击 CustomersView 以调用 View Object Editorto。CustomersView 位于 model.queries 程序包的 Model | Application Sources 中。

在树控件中展开 Attributes 节点并选择 CustLastname,然后选择 Control Hints 选项卡。

2.

注意,Label Text 为空。这意味着使用了默认标签,或应用了在实体对象级别设置的 Label Text。

将 Label Text 更改为 VO Last Name,以说明 VO 会重写 EO 的属性设置。而使其他设置保持不变。


3.

通过在查询中设置 ORDER BY 子句更改所查询的对象的顺序。

在树控件中选择 SQL Statement

单击 Order By 右侧的 Edit

将鼠标置于该图标上可以查看该图像

4.

利用该对话框,您可以创建复杂的表达式。在本教程中,将添加一列。由于该对话框会以紧凑外形显示,因此需要对其重新调整大小以查看更多的细节。

单击 New Add button 向表达式添加新值。

在 Order By 对话框中,展开 Expression Palette 中的 Customers

将鼠标置于该图标上可以查看该图像

5.

选择 CUST_LAST_NAME 并单击 Insert column Add button 将其移入左侧的 Expression 域。

将鼠标置于该图标上可以查看该图像

6.

单击 Validate 将列添加到 Order By 列表,然后单击 OK

将鼠标置于该图标上可以查看该图像

注:该视图对象只是一个 SQL 查询,因此可以使用 Optimizer Hints 对其进行调整,也可以查看 Explain Plan。查看树控件中的 Tuning 部分。

7.

单击 OK 完成视图对象的编辑。

当询问您是否测试 SQL 查询语法的正确性时,请单击 Yes,然后单击 OK 确认查询有效。

将鼠标置于该图标上可以查看该图像

8. 单击 Save All Save All 按钮 保存您的工作。

返回主题

添加自定义验证

迄今为止,您添加的验证主要是声明式的。JDeveloper 使您可以灵活地定义比声明方式复杂很多的验证。使用 ADF 业务组件时,可以修改实体对象或视图对象的 Java 代码来完成自定义验证。

要添加针对客户的电子邮件的定制验证,执行以下步骤:

1.

在 Application Navigator 中,右键单击 Customers 实体对象,然后从右键菜单中选择 Go to Entity Object Class

将鼠标置于该图标上可以查看该图像

2.

CustomersImpl.java(Customers 实体对象的 Java 实现)在编辑器中打开。

将以下方法添加到该文件的结尾,并紧靠右大括号 ( }) 前:

public boolean validateEmail (String value)
{
  return (value.indexOf('@') != -1 );
}

此代码只检查电子邮件地址中是否存在 @ 符。当然,在实际情况下,您可能要编写一个更为复杂的验证。

用于验证属性的方法必须定义为 public、接受一个与属性类型相同的参数并返回一个 boolean 值。该方法名必须以关键字
validate 开头。

将鼠标置于该图标上可以查看该图像

3.

在 Application Navigator 中,双击 Customers 以调用 Entity Object Editor。

在 Entity Object Editor 中,选择左侧树中的 Validation

在 Declared Validation Rules 下,选择 CustEmail 并单击 New

将鼠标置于该图标上可以查看该图像

4.

在 Add Validation Rule 对话框的 Rules 下拉列表中,选择 MethodValidator

选择 ValidateEmail(字符串值) 方法,然后键入一个正确的错误消息,如 Invalid email address

单击 OK

将鼠标置于该图标上可以查看该图像

单击 OK 以更新 Customers 实体对象。

5. 单击 Save All Save All 按钮 保存您的工作。

返回主题

返回主题列表

测试模型

Oracle JDeveloper 包含一个业务组件浏览器,用它可以测试业务组件,而不必构建任何客户端代码。

要使用业务组件浏览器来测试为业务模型构建的功能,执行以下步骤:

1.

在 Applications Navigator 中,展开 model.services。右键单击 CustomerOrdersBusinessService,然后从上下文菜单中选择 Test

将鼠标置于该图标上可以查看该图像

2.

在 Oracle 业务组件浏览器的 Connect 窗口的 Connection Name 下拉列表中选择 oeconn,然后单击 Connect

将鼠标置于该图标上可以查看该图像

3.

在 Business Component Browser 中双击运行 CustomersView1

确保应用了 CreditLimit 格式掩码,将鼠标悬停在 CreditLimit 字段上以确保工具提示正常工作。CreditLimit 字段应与币种格式掩码一同显示。

您还应看见其上显示了任何经过更改的属性标签(如 CustFirstName),而不是默认标签,以及针对“Last Name”显示的是 VO 标签,而不是在 EO 级定义的那个。

将鼠标置于该图标上可以查看该图像

4.

将信贷限额更新为 6000 并验证是否显示错误消息。

将鼠标置于该图标上可以查看该图像

单击 OK 并将值重新更改为一个小于 4000 的值,继续下一步。

5.

单击 Next Next button 滚动浏览记录,以查看按“Last Name”排序返回的客户。

将鼠标置于该图标上可以查看该图像

6.

单击 Create Create 按钮 添加一个新记录。您应看到信贷限额的默认值。

将鼠标置于该图标上可以查看该图像

单击 Delete Delete 按钮 以删除插入的记录。

7.

删除电子邮件地址中的 @ 符,并验证是否显示错误消息。

将鼠标置于该图标上可以查看该图像

单击 OK 并将 @ 符重新加入电子邮件地址的原处,继续下一步。

8.

现在,双击 OrdersCustomerIdFkLink1 视图链接,调用通过视图链接而连接在一起的 CustomersView1 和 Orders View2 视图对象。

单击 Delete button 在单独窗口中查看结果。

单击 Specify View Criteria  并输入 CustomerId 102 ,然后单击 Find 显示下订单的客户。如果单击以返回到另一个打开的视图对象 CustomersView1,则可以看到显示了同一客户,这是因为应用程序模块自动协调所有视图。

. 将鼠标置于该图标上可以查看该图像

完成测试时,可以选择 Business Components Browser 窗口。

返回主题列表

总结

您学习了如何使用向导根据数据库中的表创建实体对象(名称与表相同)。随后,向导还创建了表示此应用程序使用的数据(特定列)的视图对象,然后创建了视图链接以保留视图对象之间的主/从关系。此外,向导还创建了一个应用程序模块,以包含和协调要用于订单项任务的视图对象和视图链接,并创建一个业务组件图以对组件进行直观表示。

之后,您对实体对象和视图对象的属性进行了编辑,以修改业务组件的默认行为,并测试了构建的模型。

在本教程中,您学习了如何执行下列任务

 创建并修改 ADF 业务组件:实体对象、视图对象和应用程序模块
 创建并编辑业务组件图
 添加声明式验证和自定义验证
 设置默认值
 设置格式掩码
 更改默认标签
 设置工具提示
 更改显示记录的顺序
 通过业务组件浏览器测试模型

相关资料:

通过 ADF Faces 开发 JSF 用户界面

返回主题列表

 将鼠标置于该图标上可以隐藏所有的屏幕截图。

Left Curve
热门下载
Right Curve
Left Curve
更多融合中间件下载
Right Curve