Oracle Account

Manage your account and access personalized content. Sign up for an Oracle Account

Sign in to Cloud

Access your cloud dashboard, manage orders, and more. Sign up for a free trial

下载
 Oracle JDeveloper
标签
adf , java , 全部
产品徽标 从设计到实践全面了解 Oracle ADF 应用程序

作者:Chris Muir ACE 总监 和 Penny Cookson ACE

第 2 章 —“必须具备”需求:基本搜索应用程序

2009 年 5 月发表

 单击此处 查看“从设计到实践全面了解 Oracle ADF 应用程序”描述和目录。

在本章中,我们将构建 必须具备 需求:最初,我们只需要搜索字段和基本搜索屏幕。

图 1

我们从 ADF 业务组件视图对象开始,添加绑定变量和要触发的简单验证,然后执行搜索。

了解了表结构之后,我们现在知道在 Oracle JDeveloper 11 g ADF 应用程序中开始构建什么。我们从一个基于“Fusion Web Application 模板”的应用程序入手,该模板提供了由所需的 Oracle ADF 业务组件和 ADF Faces RC 库预先配置的 Model 和 ViewController 项目。

图 2

文档提示: 不知道如何在 Oracle JDeveloper 11 g 中创建应用程序吗?请参阅 Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework 11g Release 1 的第 1 章 1.3.1 节“ Creating an Application Workspace ”以获取说明。

创建视图对象

接下来,我们针对所选的 Model 项目运行“Business Components from Tables”向导,基于 parcels 表创建一个只读视图对象和一个应用程序模块,该模块稍后用于向 ViewController 项目提供该视图对象。

图 3

文档提示: 有关如何在 Oracle JDeveloper 11 g 中通过表创建业务组件的更多信息,请参阅 Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework 11g Release 1 第 4 章 。有关视图对象的更多信息,请参阅 第 5 章

为确保一切正常运行,我们在 AppModule 上运行 Business Component Browser。然后,我们会看到来自 ParcelsView 视图对象的以下结果:

图 4

视图对象中似乎新增了一列 RowID,这很令人惊讶。这列是哪儿来的?Oracle ADF 业务组件视图对象和实体对象要求至少一个属性标记为主键,以便在内部使用时唯一识别每条记录。在我们的例子中,基础表没有主键字段,因此 Oracle ADF 业务组件退而求其次,针对数据库中的基础记录使用 Oracle RowID。这并未给我们造成很大困扰,当我们创建 Web 页面时,我们会把 RowID 列隐藏起来,用户不会看到。

现在我们已经创建了视图对象,接下来需要提供搜索功能。Oracle ADF 业务组件支持很多允许用户进行搜索的机制,其中一个机制是默认构建的,可以通过单击 Business Component Browser 中的 View Criteria 按钮进行查看:

图 5

这将调用 Business Component View Criteria 对话框,允许我们输入搜索条件并在 Business Component Browser 中返回匹配的记录。

在我们的例子中,虽然该机制很有用,但我们都知道即将面临的需求:将字符串搜索字段转换成大写形式从而与数据库数据匹配,并删除运货单编号中的连字符(如果有的话)。

另一种机制是为视图对象创建绑定变量。我们将视图对象查询修改为类似如下所示:

图 5

文档提示: 不知道如何创建一个带有绑定变量的视图对象吗?请参阅 Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework 11g Release 1 的第 5 章 5.9 节“ Working with Bind Variables ”以获取说明。

我们注意到同一个命名选项下增加了绑定变量。在这个阶段,我们无需担心将搜索字段转换为大写形式或者更正运货单编号的要求,因此我们不用管其余的查询。我们要注意即使已经将需求放在“应该具备”类别中,这并不意味着我们就应完全忽略它。可以通过使用我们稍后将利用的特性来简化将来的工作。

我们再次通过 Business Component Browser 测试视图对象,以确保没有犯错。这次我们运行视图对象时,将出现一个对话框,要求我们输入每个绑定变量的值。完成后,假设我们输入了有效的搜索值,将返回一条记录:

图 7

如要求中所述,我们需要确保所有绑定变量搜索字段均已输入然后再执行查询。Oracle ADF 业务组件提供了适合的阻塞点方法,用以检查在 ViewObjectImpl executeQueryForCollection() 方法中执行查询之前已经提供了绑定变量。确保先调用该方法,然后再针对数据库触发实际的视图对象查询。

为此,我们首先需要为 ParcelsView 生成 ViewObjectImpl 类,方法是:打开视图对象编辑器的 Java 节点,然后依次选择 Edit 按钮和 Generate View Object Class 选项:

图 8

我们通过生成的 ParcelsViewImpl 类覆盖 executeQueryForCollection() 方法,如下所示:
public class ParcelsViewImpl extends ViewObjectImpl {
    @Override
    protected void executeQueryForCollection(Object queryCollection, 
                   Object[] bindParams, int noUserParams) {
      super.executeQueryForCollection(queryCollection, bindParams, noUserParams);
  ... the rest of the class ...
现在,我们可以编写一个方法来提取绑定参数并检查我们收到了多少参数:
private void enforceQueryCriteria() {
  Object[] attrValues = getNamedWhereClauseParams().getAttributeValues();
  int i = 0;
  boolean missingParam = false;
  while (i < attrValues.length && !missingParam) {
    if (attrValues[i] == null || (attrValues[i] instanceof String && attrValues[i].equals("")))
      missingParam = true;
  if (missingParam)
    throw new JboException("You must enter all the enquiry criteria");
理想情况下,JboException 消息应源自一个消息包,但我们将简化这个示例。

拥有该方法之后,我们返回到 executeQueryForCollection() 方法,调用之前的 enforceQueryCriteria() 方法以强制执行要求:

public class ParcelsViewImpl extends ViewObjectImpl {
    @Override
    protected void executeQueryForCollection(Object queryCollection, 
                   Object[] bindParams, int noUserParams) {
      enforceQueryCriteria();
      super.executeQueryForCollection(queryCollection, bindParams, noUserParams);
  ... the rest of the class ...
在 Business Components Browser 中测试该解决方案的过程中,打开 ParcelsView 时将出现一个错误:

图 9

似乎是初始化视图对象时触发了一个默认查询并调用了 executeQueryForCollection() 方法,这导致过早触发了新的 enforceQueryCriteria() 方法。因此,我们将对 ViewObjectImpl 进行以下小改动,包括一个停止在初始查询上触发 enforceQueryCriteria() 方法的 firstQuery 标志:
public class ParcelsViewImpl extends ViewObjectImpl {
  boolean firstQuery = true;
  @Override
  protected void executeQueryForCollection(Object queryCollection, Object[] bindParams, int noUserParams) {
    if (firstQuery)
      firstQuery = false;
      enforceQueryCriteria();
    super.executeQueryForCollection(queryCollection, bindParams, noUserParams);
  ... the rest of the class ...

构建搜索页面

假设 Oracle ADF 业务组件按照我们需要的方式运行,现在该创建我们的第一个 Web 页面了。给定一个名为 SearchPage.jspx 的空白页面,我们可以使用 Data Control Palette 将我们的视图对象拖到该页面上:

图 10

此外,我们还为 SearchPage 中的视图对象添加了每个绑定变量,以及一个标签为 Enquiry 的 ExecuteWithParams 按钮:

图 11

最后,我们进行一些小改进,包括视图对象绑定变量和属性标签,并且从底部的结果中删除搜索字段。

图 12

现在,我们拥有了基本应用程序,我们的内部 ACME Parcels 呼叫中心员工可以使用它查询数据库。

图 13

总结

在本章中,我们了解了如何构建一个基本搜索屏幕以满足应用程序 必须具备 需求。 第 3 章 介绍如何向应用程序添加一些其他特性,包括记录用户的 IP 地址(如果他们接受我们的条款和条件)。  单击此处 查看“从设计到实践全面了解 Oracle ADF 应用程序”描述和目录。