< 上一课 | 下一课 >

第 5 课:向抵押贷款计算器处理程序添加代码

向您在上一课中创建的处理程序添加函数。

在本课程中,您将直接使用 EGL 源代码,从您编写的 EGL 库开始。一个库中可能包含常量、变量和函数,可以通过应用程序中不同的逻辑单元来访问这些对象。库的一项重要特征是,对变量所作的更改可用于任何访问该库的逻辑单元。但是,本教程讨论的重点在于函数,您将函数放入库中,以避免在多处维护同一个广泛使用的逻辑。

要处理一些普通问题,您可以使用 EGL 模型视图控制器 (MVC) 框架,此框架由 com.ibm.egl.rui 项目提供。尽管初始“MVC”通常描述企业应用程序的不同组件,但是 Rich UI 中的 MVC 框架仅关心用户界面的组件。这种情况下,模型是一个变量或记录字段,视图是一个窗口小部件,而控制器是用于监视模型与视图之间的数据传输的声明。该数据传输有时候是自动进行的,有时候是对函数调用的响应,稍后对此进行了说明。

上一课中的拖放操作不仅添加了控制器声明,而且添加了表单管理器,表单管理器是一个允许您将其他声明视作单个表单的组件的声明。表单管理器包括一组表单字段,每个表单字段可以包括标签、控制器和错误字段。

创建 EGL 库

创建一个 EGL 库,以存放用于提供 MONEY 变量的美国货币格式的函数。更复杂的函数可允许使用本国货币符号、分隔符以及不同的输入类型。但是,对于本教程,使用简单函数即可满足要求。
  1. 在项目资源管理器中选择 MortgageUIProject。
    已选择 MortgageUIProject。
  2. 单击新建 EGL 源文件按钮。
    “新建 EGL 源文件”按钮是一组按钮(总共四个按钮)中的第二个按钮。
  3. 在“新建 EGL 部件”窗口中,按如下所示指定包:
    libraries
  4. 按如下所示为此文件命名:
    MortgageLib
  5. 单击完成 新的源文件将在 EGL 编辑器中打开。
  6. 除去此文件中的注释并添加以下代码:
    library MortgageLib 
       function formatMoney(amount STRING in) returns(STRING)
          len int = strlib.characterLen(amount);
          index int = len - 6; // 2 dec places + decimal + 3 chars before separator
          while(index > 0)
             amount = amount[1 : index] :: "," :: amount[index + 1 : len];
             index -= 3;
             len += 1;
          end
          return("$" :: amount);
       end
    end

    如上所示,您指定库名并嵌入一个新函数 formatMoney(),此函数向输入字符串添加逗号和美元符号。此处假定输入字段中包含具有两个小数位的金额值。

  7. 保存该文件。一旦保存了该文件,就会自动生成此库。
MortgageLib 库现在可供使用。

更改处理程序中的代码

在添加新函数之前,您必须进行一些次要更改:
  1. 单击 MortgageCalculatorHandler源代码选项卡。
  2. 设置贷款总额利息字段的缺省值。转至声明了 inputRec 记录的行,并向此声明中添加两个赋值,如下所示:
    inputRec MortgageCalculationResult 
       {term = 30, loanAmount=180000, interestRate = 5.2};
    保存该文件,然后单击预览选项卡。现在,界面中显示了“贷款年限”字段的缺省值(其中包括您在上一课中指定的值):
    界面中现在显示了贷款总额和利率。
  3. 在此处理程序的第一行上,在 UI 窗口小部件的声明之前声明一个变量,代码使用此变量来访问专用服务:
    mortService MortgageCalculationService{@dedicatedService};
    mortService 声明位于 UI GridLayout 声明前面。
  4. 将鼠标光标悬停在红色 X 或者红色的下划线上,以了解错误原因为如下所示:“无法解析 MortgageCalculationService 类型。” 假定您先前设置了您正在使用的项目的 EGL 构建路径,以便该项目可以访问其中包含服务的项目,那么此错误可能令人费解。此处的问题是源文件未从另一个项目中导入服务部件。
  5. 要解决此错误,请在此文件中的其他 import 语句后面输入以下 import 语句:
    import services.MortgageCalculationService;
    几秒钟之后,即使您未保存此文件,也会除去错误标记。
  6. 在许多情况下,开发环境可以为您插入缺少的 import 语句。要了解这种在操作上的便利性,请除去您刚输入的 import 语句。当您看到错误标记重新出现时,按 Ctrl+Shift+O 组合键以重新插入该语句。
  7. 保存该文件。

完成 inputRec_form_Submit 函数

EGL 创建了一个存根 inputRec_form_Submit 函数。此函数用于验证表单上的所有字段以及“落实”这些字段。落实操作是 MVC 实现的一部分,意味着会使用窗口小部件中的值来更新 inputRec 记录。

您将添加代码以调用两个另外的函数。第一个函数使 processImage 图像可视,这就让用户知道应用程序正在运行。第二个函数将调用服务以计算抵押贷款还款金额。

要完成 inputRec_form_Submit 函数,请将 if 语句更新为如下所示:
if(inputRec_form.isValid())
   inputRec_form.commit();
   showProcessImage();
   calculateMortgage();
else
   errorLabel.text = "Input form validation failed.";
end
请勿担心代码格式;后续章节会处理此问题。此外,后续章节会除去此处所显示的错误标记:
已完成的 inputRec_form_Submit() 函数调用。

添加 showProcessImage 函数

您需要 showProcessImage 函数以使 processImage 图像可视。要在 Rich UI 编辑器中编写此函数,请在此处理程序中最后一个 end 语句前面添加下列各行:
function showProcessImage()
   processImage.visible = yes;
end
注: 任何图像窗口小部件都具有 visible 属性。在上一课中,当您取消选中 processImage 图像的可视复选框时,即已更改此属性的初始值。

添加 hideProcessImage 函数

您需要 hideProcessImage 函数以在必要时隐藏图像。在 showProcessImage 函数后面添加下列各行:
function hideProcessImage()
   processImage.visible = no;
end

添加 calculateMortgage 函数

calculateMortgage 函数将调用服务以根据 UI 中所显示的值来计算抵押贷款。要在 Rich UI 编辑器中编写此函数,请在 hideProcessImage 函数后面添加下列各行并忽略错误标记:
function calculateMortgage()
   call mortService.amortize(inputRec) 
      returning to displayResults 
      onException handleException;
end	
注:
  1. Rich UI 中的 call 语句是一个变体,仅用来访问服务。在这种情况下,运行时通信是异步进行的,这意味着在服务作出响应的同时,用户可以继续与处理程序进行交互。
  2. 服务请求者通常将记录传递给所访问的服务。在本教程中,处理程序将传递全局变量 inputRec,并在同一记录中接收从此服务返回的值。

添加 displayResults 函数

displayResults 函数是一个回调函数,在服务将业务数据成功返回给 Rich UI 处理程序之后,此函数将立即运行。要编写此函数,请在 calculateMortgage 函数后面添加下列各行:
function displayResults(retResult MortgageCalculationResult in)
   paymentLabel.text = MortgageLib.formatMoney(retResult.monthlyPayment as STRING);
   inputRec_form.publish();
   hideProcessImage();
end
注:
  • 在新的 EGL 库部件中使用 formatMoney 函数对还款金额添加逗号和美元符号。因为您已创建不涉及到 MVC 框架的 paymentLabel 变量,所以必须由您自己处理格式调整。
  • 如先前所述,表单管理器中包括表单字段,而表单字段中又可以包括控制器和其他声明。publish 函数在任何表单管理器中都可用,并依次调用特定于控制器的 publish 函数,以按如下所示执行操作:
    1. 从此变量中检索用作控制器模型的数据。
    2. 调整该数据的格式。
    3. 将已调整格式的数据写入用作控制器视图的窗口小部件。

    考虑到事件的顺序,通常按照当前教程所示来调用表单级别的 publish 函数:在用于接收来自服务的数据的回调函数中。

编写异常处理程序

如果调用服务导致错误,那么不会调用通常的回调函数。但是,如果您准备使用异常处理程序(如此例中所示),那么将调用该函数。

按如下所示执行操作:

  1. displayResults 函数后面添加以下代码:
    	// catch-all exception handler
    	private function handleException(ae AnyException in)
    		errorLabel.text = "Error calling service: " + ae.message;
    	end
    对于具有 private 修饰符的函数,只能由该函数所在的 EGL 部件调用;在此例中,只能由嵌入处理程序调用。此函数将文本置于您在上一课中创建的 errorLabel 窗口小部件中。
  2. 按如下所示更新恰好在 call 语句前面的 calculateMortgage 函数:
    errorLabel.text = "";
    这样,您将在调用用于计算抵押贷款的服务之前取消选中 errorLabel 字段。如果您不添加该代码,那么在发生错误(例如,服务连接临时中断)的情况下将显示错误消息,即使在成功调用此服务之后也会显示错误消息。
  3. 右键单击编辑器中的空白处。单击对导入进行组织 EGL 将对它可以解析的所有未定义的符号添加 import 语句。
  4. 保存该文件。如果您在源文件中发现错误,请将您的代码与在第 5 课之后已为 MortgageCalculatorHandler.egl 完成的代码中的文件内容进行比较。
  5. 解决任何错误之后,通过按 Ctrl+Shift+F 组合键重新调整输入的格式,然后再次保存该文件。

测试计算器

现在,您可以测试计算器。

  1. 通过单击编辑器底部的预览选项卡来切换至“预览”视图。 您可以在“预览”视图中充分测试应用程序(其中包括测试用户界面和服务),无论服务已部署在服务器上,还是仅以 EGL 源代码形式提供,都可以进行测试。 EGL 将显示您在创建此处理程序时所输入的缺省值。
  2. 单击计算 EGL 将显示每月还款金额。
    每月还款金额显示在“还款金额”字段中。
  3. 在第一个字段中输入一个字母。 与多个 EGL Dojo 窗口小部件一样,一旦发生错误,就会显示一个红色标记,并且在邻近的工具提示中会显示一条错误消息。
    每月还款金额显示在“还款金额”字段中。

    当焦点不在窗口小部件中时,就会隐藏工具提示;当窗口小部件重新获得焦点时,就会显示工具提示。

  4. 更改三个字段中任何字段的值,然后再次单击计算 还款金额字段将相应地更改。

课程复习要点

您已学习如何完成下列任务:
  • 在 Rich UI 编辑器的源代码选项卡中执行操作
  • 为可复用的函数创建 EGL 库部件
  • 使用 EGL 模型视图控制器框架
  • 从函数调用 EGL 服务
  • 发现并处理错误

在下一课中,您将创建一个饼图,以对所给定计算中的本金总额与利息总额进行比较。

< 上一课 | 下一课 >

反馈