练习 2.3:创建并配置客户机端数据

在开始之前,必须先完成练习 2.2:添加服务器端数据

在此练习中,将学习如何添加客户机端数据,它包括下列步骤:(根据先前创建的服务器端 bean)为页面创建客户机端数据对象,并根据需要配置该数据对象。

创建客户机端数据对象

正如在“页数据”视图中创建 bean 一样,您将创建一个同等功能的“客户机数据”对象。

  1. 确保已打开 tutorial.jsp 文件。
  2. 在“客户机数据”视图中(在“页数据”选项卡旁边),右键单击某一空白处并选择新建 > 客户机数据
  3. 服务器数据模型部分选择 root bean 并单击确定

此时,您将看到 root bean 位于“客户机数据”视图中。客户机数据 bean 与页数据 bean 的唯一实质性差别仅在于“Users/Portfolios/Positions”部分中的 purchaseDate 字段。对于客户机端数据,可将“日期”看作是类似于“字符串”的基本类型。

注意:如果模型具有类型为 BigDecimal 的属性,则客户机端不支持任意精度的小数,并且会将其向下转换为 double。这就意味着如果使用 BigDecimal 值,将会失去数据的精度。

创建客户机端数据对象时,工具会在项目中生成许多文件和类。在 root 源包中,如果名为“OdysseyBrowserFramework.properties”的属性文件尚未存在,则将会创建它。在 com.ibm.dynwdo4jsmediators 包中,将创建两个文件,并且将修改该属性文件以注册项目的这两个文件:

com.ibm.dynwdo4jsmediators.root 包包含特殊生成的介体和 diffhandler 文件:

具有 bean 的“客户机数据”视图

配置客户机端数据对象

在本节中,您将了解如何配置客户机端数据以完成下列任务:

要启动配置客户机数据工具(在此练习的剩余部分都将使用此工具),找到“客户机数据”视图。右键单击 root 节点并选择配置。将出现配置客户机数据工具。

“配置客户机”工具

关于模型名称

缺省情况下,当您将模型导出至浏览器时,该模型使用的名称就是您创建 bean 时的内部 bean 的名称。然而,Web 应用程序可能不会始终期望这样做。特别是在门户网站环境中,您可能想要指定一个常见的名称以便多个 Portlet 在浏览器上可以真正共享模型数据。然而,您可能想要将模型仅用于您的 portlet,则在此情况下,可能想对您的 portlet 指定一个特定名称。

在任何情况下,确保不要使模型名称太简单。例如,将它命名为 Root 就会很麻烦,因为其他开发者也可能会使用该名称。在浏览器上,有一个平面名称空间;因此,两个同名的模型将发生冲突。因此,通常最好是使用能够反映 Java 中的类名的复杂名称。例如,com_ibm_myApp_myModel。

在本教程中,可以保留模型名称的缺省值。

修剪客户机端数据结构

有时候,您从服务器中获得了太多数据;可能有一些类或属性不需要发送至客户机。因此可以配置“客户机数据”对象,以便可以修剪掉不想要的类或属性。

  1. 在“基本”选项卡中,展开客户机数据模型窗口中的根(Root)
  2. 清除 root 节点下面的 stocks (Stock[])placeHolderStock (Stock) 节点前面的复选框。
  3. 清除 root/users/portfolio/positions 节点下面的 portfolio (Portfolio)user (User) 节点前面的复选框。当使用复杂数据结构进行编程时,通常需要使用这些反向指针来提高性能;然而,在本教程中,它们实际上采用创建循环结构的方式,此结构使得“客户机数据”视图中数据的最终显示变得更复杂。

注意:如果在特定数据结构中多次使用了给定类,则使用该类的每个位置发生的更改都将应用到定制它的字段中。要验证这种情况,启用 root.users.portfolios.user 属性并选择某些复选框。您将会看到,在对 Root 下的 User 类的引用中,那些相同的字段会自动更新。

定义主要属性

可以配置如何识别对象的标识。如果单击一个类的常规属性,例如,名称属性 root,您将看到选择了一个称为“主要”的复选框。

如果给定同一个类的两个实例,您如何才能知道它们是相同的还是不同的?如果具有两个用户,您如何才能知道他们是相同的还是不同的?除非您知道“用户”的主键部分是使实例唯一的部分,否则将不能区分它们。更多地了解设置主键

  1. 展开 users 节点以查看四个属性:refNum、lastName、id 和 portfolios。定义该类的方式,保证 refNum 字段对于两个不同的用户是唯一的,因此,这是唯一需要标记为“主要”的字段。如果您查看其它字段,则将看到 refNum、lastName 和 ID 全部都已经标记为“主要”。缺省情况下,任何不是列表或数组的字段都会自动被标记为“主要”。系统无法知道哪些字段是主要的,哪些字段不是主要的。
  2. 您必须指出哪些字段是主要的,哪些字段不是主要的。虽然从实质上来说不需要这样做(缺省值将起作用),但是还是应该认真考虑确保在模型中正确定义了主要字段。浏览数据结构,并确保本教程中只有以下列示的那些字段才被标记为主要:
    字段
    Root Name
    Users refNum
    Portfolio user, porfolioName
    Position refNum
    Stock Symbol

添加客户机属性

将使用“数据网格”来显示给定投资组合的内容(它的位置)。根据数据结构,Position 类有 8 种属性:price(买价)、quantity、refNum、symbol、purchaseDate、stock(已购买的股票)、portfolio(拥有该位置的投资组合)和 user(位置的所有者)。

缺少某些内容:value 属性,它将等于股票数量乘以股票的当前价格。提供此信息的一种方法就是:更改 Java bean,并计算产品。但是,这样做会存在一定问题,这是因为计算得来的值只是某一时刻的值:如果浏览器上的数量已更改,则计算得来的值将不会反映此更改。为了避免这个过程,使用客户机属性,该属性是一个任意 JavaScript 表达式,该表达式是在为该对象创建的对象上下文中执行的。

  1. 在“配置客户机数据”对话框中,选择 users 和 portfolios 下面的 positions 节点。
  2. 单击添加客户机属性。在 Position 类的属性列表中添加了新的条目。
  3. 选择 float 作为类型,并将字段命名为 value,因为将在此处存储美元值。
  4. 表达式文本区域中输入以下表达式:
    this.eGet('quantity')*this.eGet('stock').eGet('currentPrice')
    更正字段以添加属性

    此表达式使用浏览器上的 SDO 对象,并且可以使用表示要获取的属性的字符串来调用 eGet 方法。如果此属性是服务器端数据中的列表或数组,则 eGet 将在浏览器上返回一个 JavaScript 数组。因此,此 position 对象的 quantity 字段乘以此 position 对象指向的 stock 对象的 currentPrice 字段。在浏览器上,每当请求新属性时就会对此表达式求值,因此,此表达式将与 quantity 和 currentPrice 这两个值同步。

    表达式文本区域中可以输入任何有效的 JavaScript。例如,您可以输入一个这样的函数:它返回给定的两个值的百分比。还可以提供一个字段,用来显示通过迭代每个位置并累积总计而获得的整个投资组合的总市值。您可以看到您具有的任何内容,包括已经编写的定制 JavaScript 函数。只需要遵守下面两条规则:
    1. this 指针指的是已经为其创建属性的类的一个实例。表达式的返回值必须符合为属性指定的类型。
    2. 如果属性被设置为 integer,并且表达式返回一个不能转换为 integer 的字符串,则将产生运行时异常。
    注意:请不要使您的表达式依赖于另一种客户机属性,它的表达式又依赖于此属性。这种依赖性将导致无限循环,并且在浏览器中将产生堆栈溢出异常。如果您在编写 Java 代码,也需要采取相同的预防措施。

关于高级选项卡

尽管本教程中未使用“高级”选项卡,但是“高级”选项卡上提供的几个按钮有助于您理解。第一个按钮是装入 EMap 源,它允许您访问系统中的一个密钥文件,该密钥文件配置如何将服务器端的数据发送至浏览器,以及如何返回这些数据以进行区分处理。配置程序提供界面来配置该文件中的信息。仅当您是高级用户时才能改变此文件。

第二个按钮是从服务器端数据重新生成,当服务器数据发生更改时,使用此按钮来刷新客户机数据信息。此时,“客户机数据”对象不反映服务器数据源中可能已发生的更改;因此,需要重新生成内部有用信息,例如,获取新字段。

第三个按钮是从项目中除去,它允许您从项目中除去所有客户机数据构件。在测试或开发的早期阶段,当页面和它包含的数据还未最终确定时,此按钮是很有用的。如果您在“客户机数据”视图中选择要除去的节点,则将只除去该页面中的条目,而您第一次创建客户机数据元素时生成的所有构件仍将保留在项目中。如果想要将它们全部除去,则必须单独除去它们。

现在,您可以开始进行练习 2.4:绑定数据并定制显示了。

使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.