用自定义 Java 代码扩展 IBM Workplace Designer 的功能

IBM Workplace Designer 是具有内嵌脚本的功能齐全的、基于标准的可视化开发工具,可以使应用程序开发人员、设计人员和其他用户很容易地为 IBM Workplace Collaboration Services 或 IBM Workplace Services Express 创建和部署组件。

Workplace Designer 为 Workplace Collaboration Services 和 Workplace Services Express 提供了同样简单易用、功能强大的基于表单的开发,Domino 开发人员已经用 Lotus Domino Designer 享受这种好处很多年了。Domino ISV 很久以来就能够使用 Lotus Domino Designer 容易地为 Domino 服务器创建和部署组件。现在,Workplace Designer 已经发布了,因此这些开发人员可以容易地在 Workplace Collaboration Services 和 Workplace Services Express 应用程序中创建和部署组件,以满足特定的行业和业务需求。

Workplace Designer 通过其内嵌 JavaScript. 引擎提供了强大的服务器端脚本功能。JavaScript. 代码可以与每个控件、表单或组件的事件相关联。Workplace Designer 还提供了对实用程序 JavaScript. 类的内嵌本地库(比如 DocAPI 和目录服务,以及函数集合)的访问。Workplace Collaboration Services API 还可通过自定义 JavaScript. 代码被直接访问,从而开发人员可以构建与 Workplace Collaboration Services 服务器集成的应用程序。

本文面向具有 Domino 开发、JavaScript. 或其他可视化脚本语言和 Java 背景的 Workplace Designer 组件开发人员、应用程序开发人员和 ISV。本文描述了如何扩展 Workplace Designer 的少量可编程性以包括外部(非 Workplace)Java 代码,其中包括 Lotus Domino 的 Java API。现有 Java 代码可以容易地合并到用 Workplace Designer 构建的应用程序中。本文提供了如何实现该操作的几个样例,以及在 Workplace 环境中进行开发、测试和部署的指南。

本文假设您具有 Web 应用程序开发,尤其是 JavaScript. 的一些经验。略微熟悉 Workplace Collaboration Services 或 Workplace Services Express 服务器也有帮助。

高级开发人员和 ISV 编程人员通常使用各种 Domino 工具包将其代码与 Lotus Notes 和 Domino 集成起来。一些人可能在 Java 技术上投资很大,而且可能已经构建了产品,而现在他们希望将这些产品与 Workplace Collaboration Services 和 Workplace Services Express 应用程序集成起来。Workplace Software Development Kit(原来叫做 Workplace Collaboration Services API Toolkit)允许 ISV 构建协作应用程序以与 Workplace Collaboration Services 服务器一起使用。

不太出名的是 Workplace Designer 的可扩展性及其从 Workplace Designer 组件中调用 “外来” Jar 文件中非 IBM Java 类 API 的能力;但这也是可能的,使得 ISV 能够在使用 Workplace Designer 开发的新 Workplace 应用程序中重用以前开发的 Java 功能。在本文中,我们将讨论 Workplace Designer 中一些可用的可编程性特性,并解释可以如何保留和有效利用已经在 Java 类中所做的投资。

Workplace Designer 可编程性特性和功能

对开发工具的衡量是看它的事件处理能力。在 Workplace Designer 中,每个设计元素可以将 JavaScript. 代码与当元素在 Workplace 服务器上运行时可能发生在该元素上的事件相关联。

Workplace Designer 支持许多级别的事件:

  • UI 控件事件。每个 UI 控件都可以有一组客户端事件。例如,按钮元素可以响应 onClick 事件;编辑控件可以响应 onBlur 事件。关联的 JavaScript. 代码可以指定为在服务器端或客户端执行。
  • 组件事件。这些是标准的 Workplace 服务器事件;例如,当组件实例化时或为 Workplace 应用程序添加或移除组件时。这些事件是使用一组事件全局属性在组件级别定义和处理的。
  • 表单/文档事件。表单具有一组服务器端事件,例如,可以响应 onPageLoad 事件。文档事件与表单事件一样。

事件和 JavaScript

HTML 编程人员应该熟悉可与许多 Workplace Designer 控件一起使用的事件。一般来说,HTML 规范中描述的事件是与控件类型一起使用的。Workplace Designer 还提供了一组与表单设计元素一起使用的事件。对于其中每种事件类型,开发人员可以在密封的 SimpleAction(可以接受参数)的表单中或 JavaScript. 中关联一些代码。除了提供与 JavaScript. 标准的高度兼容性之外,JavaScript. 引擎还允许您使用 Java 代码并调用 Java 标准库,这些标准库可用于运行在服务器上的 Java Virtual Machine (JVM) 中。

如前所述,Workplace Designer 内嵌了一个综合的 JavaScript. 引擎,支持开发功能强大的应用程序。JavaScript. 代码可以设计成运行在服务器或客户机上。JavaScript. 引擎附带的 JavaScript. Editor(参见图 1)支持语法上色和内容帮助。

在编辑器 UI 的 Outline 和 Reference 面板中,可以访问本地对象,从而访问实用程序代码库。还可以创建自己的可重用脚本代码库。JavaScript. 引擎具有允许直接调用任何 Java 代码(包括 JVM 中的 Java API)的 Java 桥。

使用 Workplace Designer 中包括的 JavaScript. 包装器对象,可以实现与 Workplace 业务组件更高级的集成。这些对象提供了到达完全 Workplace Collaboration Services API Java 类的 “前门”,允许构建从 Workplace Designer 的 JavaScript. 编辑器面板直接与 API 进行交互的组件。因此,可以让您的 Workplace Designer 组件生成电子邮件、创建日历条目并与 Workplace Collaboration Services 的各种业务组件进行交互。

在 JavaScript. Editor 中,不仅可以输入普通的 JavaScript. 代码,还可以使用一组特殊的全局对象 JavaScript. 类(可由 Workplace Designer 使用)。

这些类(如图 1 中的 Reference 面板所示)用 Java 代码实现,可以通过内嵌的 Java 桥进行访问。图 1 所示的代码片段使用了 Workplace Designer 的文档类和 XSPUrl 类,XSPUrl 类实现 Workplace Designer URL 的功能。


图 1. JavaScript. Editor
.. Editor

该 Java 桥允许您无需知道它们的任何实现而使用这些类。这正是我们将探讨的 Java 桥,可以调用我们自己的 “外来” API。在这里,外来的含义是非 Workplace 和非 JVM。

图 1 所示的代码片段使用 Workplace Designer 的文档和一个 XSPUrl 类,该类实现 Workplace Designer URL 的功能。代码展示了新建一个文档,然后在浏览器中打开。

在 JavaScript. 中嵌入 Java 代码

有时候,可能希望使用一组外部类文件的可用功能。Workplace Designer 中的 JavaScript. 引擎允许无缝地调用 Java 代码,不管是在标准代码还是私有代码中。例如,使用 java.util 包中的 Date 类:

var startDate = new java.util.Date(2005, 10, 24, 15, 0); 
// create a Java Date object for 3 PM, October 24 2005
var endDate = new java.util.Date(2005, 10, 24, 16, 0);   
// create a Java Date object for 4 PM, October 24 2005

long elapsed_time = endDate.getTime() - startDate.getTime(); 
// compute elapsed time in milliseconds
println("One hour is " + elapsed_time + " milliseconds");

这是可行的,因为运行时 JVM 提供了这些标准 Java 类。

如果要使用的类不在标准 JVM 集合中怎么办?通过将类(最好是打包成 JAR 文件)放在 Workplace 服务器上并配置服务器来识别类,就可以使用这些外来类了。举一个简单的例子。

假设您有一个用 Java 编写的自定义 Converter 类,希望将其用于一个用 Workplace Designer 构建的组件中,但不希望将 Converter 代码中的所有例程放到 JavaScript. 中。该 Converter 类暴露许多方法,这些方法提供不同计量单位之间的转换功能。我们专门看两个方法 —— 摄氏和华氏之间的转换,如下列代码样例所示:

package com.ibm.workplace.converter;

public class Converter
{
   private final double K_far = 1.8;           
   // ((212-32) / 100) = 9 / 5 = 1.80   ;
   private final double K_cel = 0.55555555556; 
   // (100 / (212-32)) = 5 / 9 = 0.555..;

   public Converter()
   {
      super();
   }

   public String getClassVersion()
   {
      return this.getClass().getName() + " Version 1 (01/21/2006 10:00 AM)";
   }
 
   /*
    * temperature conversion - Celsius to Fahrenheit
    */
   public double toFahrenheit(double c)
   {
      return (c * K_far) + 32;
   }
    
   /*
    * temperature conversion - Fahrenheit to Celsius
    */
   public double toCelsius(double f)
   {
      return (f - 32) * K_cel;
   }
}

要在 Workplace Designer 组件中使用该类的方法,则为所选设计元素的相关事件编写 JavaScript. 代码。为了简便,我们将该代码放在按钮的 onClick 事件上,并只将结果输出到服务器日志文件中。在可下载的样例中,显示在屏幕上的输出如图 2 所示。


图 2. 转换器样例演示
转换器样例演示

下例调用一个简单的 Java 类来执行温度转换(摄氏/华氏)。

var myPackage = com.ibm.workplace.converter; 
// access the Java package

var conv = new myPackage.Converter(); 
// instantiate a Java Converter object

var f1 = 50;
var c1 = conv.toCelsius(f1); 
// get Celsius value for 50 Fahrenheit
println(f1 + " degrees F is " + c1 + " degrees C.");

var c2 = 10;
var f2 = conv.toFahrenheit(c2); 
// get Fahrenheit value for 10 Celsius
println(c2 + " degrees C is " + f2 + " degrees F.");

运行时,下列输出显示在 Workplace SystemOut.log 文件中:

[01/21/06 12:38:03:447 EDT] 4e718de7 SystemOut O 50 degrees F is 10 degrees C.
[01/21/06 12:38:03:447 EDT] 4e718de7 SystemOut O 10 degrees C is 50 degrees F.

该代码还被构建成一个简单的 Workplace Designer 组件,可以从本文下载得到。

当将组件部署到 Workplace 服务器上并插入到页面中时,可以看到图 2。当在 Workplace Designer 中打开时,项目显示要部署到 Workplace 服务器上的表单元素(参见图 3)。


图 3. Workplace Designer 中的 formConverter
Workplace Designer 中的 formConverter

组件接受一个表示温度的输入值(/rootConverter/temperature),并根据单击的操作按钮,将该值转换为相应的摄氏或华氏等同温度。例如,当单击 “Convert from Fahrenheit to Celsius” 按钮时,则在该按钮的 onClick 事件中执行下列代码:

var myPackage = com.ibm.workplace.converter; 
// access the Java package
var conv = new myPackage.Converter(); 
// instantiate a Java Converter object

// retrieve the user input field from the form.
var tIn:float = document.getDoubleValue("/rootConverter/temperature");
print( "tIn = "+tIn );

// call out to the Java method on the Converter object
var tOut = conv.toCelsius(tIn);

print( "tOut = "+tOut );

var result = ""+tIn+" F = "+tOut+" C";
print( result );

// display result in form.
document.setStringValue("/rootConverter/result", result);

它将结果显示在表单 (/rootConverter/result) 的结果字段中。这些字段在表单的模式中描述(参见图 4)。


图 4. Workplace Designer 中的 schemaConverter
Workplace Designer 中的 schemaConverter

注意: /rootConverter/temperature 和 /rootConverter/temperature 是用于访问表单上这些字段的 XPath 表达式。该代码(JavaScript. 和 Java)在 Workplace 服务器上执行以响应按钮单击。

Workplace Designer JavaScript. 引擎已经实现了允许变量类型转换的扩展,例如 var tIn:float。

可以用相同的方式调用 Workplace API。Workplace API JAR 文件是安装 Workplace 服务器时附带的。我们只需要在 Workplace Designer 组件中编写 JavaScript. 代码,以与 Workplace 业务组件交互。Workplace API 的主要服务直接暴露在 Workplace Designer JavaScript. 环境中,其方式与前面提到的其他全局对象完全一样。例如,图 5 展示了一些样例 JavaScript. 代码,演示了 Workplace Calendar API 的使用。


图. scriptLibraryMailCalendar
.LibraryMailCalendar

对在应用程序中使用 Workplace API 类的介绍超出了本文范围。可以从 developerWorks Workplace Sample 页面 下载展示其用法的例子。此外,参见红皮书 “IBM Workplace 2.5 Development with Workplace Designer” 以获得有关如何使用 Workplace API 类的其他信息。

开发过程、技术和指南

使自己的外来代码可用于基于 Workplace Designer 的应用程序是一个十分简单的过程。那么如何来实现呢?首先,将您的 Java 代码放入 JAR 文件中。有许多方法可以做到这一点;可以使用批构建过程来构建所有类文件并将其组合到一个 JAR 文件中,命令如下:

jar -cfv com

其中 是目标 JAR 文件的完全限定文件名(例如 sample.jar),com 是包含类文件的软件包树根(例如 \mycode\built\classes\com...)。

侧栏文件 “如何使用 Eclipse 为 Converter 代码生成一个 JAR 文件” 展示了如何从 Eclipse 项目生成 JAR 文件。

假设现在 JAR 文件中具有希望用于 Workplace Designer 组件中的代码。将该 JAR 文件安装在 Workplace 服务器上,然后配置服务器以启用 JAR 文件。

启用 Workplace 服务器上的外来 JAR 文件以用于 Workplace Designer 组件中

安装自定义 JAR 文件需要服务器管理特权和对服务器磁盘驱动器的访问权,所以服务器管理员可能必须执行下列管理任务。

编写 Java 类文件并将其组合到 JAR 文件中之后,通过下列方式将自定义 JAR 文件安装在服务器上:

  1. 将 JAR 文件复制到 Workplace 服务器的 \WorkplaceServer\lwp_lib 目录上,其中 是包含 Workplace 服务器已安装文件(例如 C:\WebSphere)的 IBM WebSphere Application Server 程序目录。如果无法访问 WebSphere Application Server 文件系统,请让服务器管理员帮您复制 JAR 文件。

    注意: IBM i5/OS 用户应将 JAR 文件复制到 /qibm/userdata/WebAS5/Base//WorkplaceServer/lwp_lib。

  2. 浏览至服务器上的 IBM WebSphere Administrative Console,http://machineName.subDomain.domain:port/admin(例如 http://mymachine.ibm.com:9091/admin)。在登录屏幕上,以具有管理员特权的用户身份登录。
  3. 在左面板中选择 Environment Shared Libraries。
  4. 在共享库列表中选择 LotusWorkplaceLib。
  5. 在 Configuration 屏幕上,CLASSPATH 字段列出位于自定义 JAR 文件复制到的相同目录中的所有共享库。添加步骤 1 中复制的自定义 JAR 文件。( 在步骤 1 中定义)。进行该操作最简单的方法是复制和粘贴其他一个条目,然后编辑 JAR 文件名称,例如 \WorkplaceServer/lwp_lib/mycustom_file.jar。
  6. 确保所有条目都正确,完成后单击 OK。
  7. 单击 Shared Libraries 屏幕顶部的 Save。
  8. 单击 Save to Master Configuration 屏幕上的 Save。
  9. 将自定义 JAR 文件安装在服务器上后,重启服务器,以便 JVM 加载该 JAR 文件。

现在可以创建并部署使用外部自定义 Java 代码的 Workplace Designer 组件了。

调试和测试

如果每件事并不是您第一次尝试,那么可以调试您的作品以确定问题在哪里。这可能是枯燥无味的,因为一旦将 JAR 文件安装在 Workplace 服务器上并由 JVM 加载,如果要更改或更新该文件,则必须停止服务器,替换 JAR 文件,然后重启服务器。这可能要花一些时间,所以您不希望经常这样做。

可以采用一些调试技术来让每次迭代更有效。侧栏文件 “如何使用日志记录来帮助您调试代码” 展示了如何在 Java 代码中启用日志记录。日志记录的输出被发送到位于 \Websphere\PortalServer\logs\trace.log 的系统跟踪日志文件中。

为此,在 WebSphere Application Server Administrative 控制台中启用此软件包的日志记录。侧栏文件 “如何在 WebSphere Application Server 中启用日志记录” 展示了如何来实现。

此实用工具允许在开发代码时打开日志记录,然后在准备部署时关闭,从而灵活地控制日志记录的级别,而且不需要更改任何代码。

还可以独立于 Workplace Designer 或 Workplace 服务器来测试您的 Java 类。可以只编写普通的 Java 主例程来调用类的方法。从 Eclipse 调试会更加容易。这种主例程的一个示例在侧栏文件 “独立于 Workplace Designer 组件来测试您的类” 中展示。

如果您喜欢的话,可以使用 JUnit 测试。请参见侧栏文件 “用 JUnit 来测试您的类”。

调用 Domino Java 类以访问 Domino 代码的示例

如果外来 API 正是 Domino Java API,则可以使用相同的策略。首先,将 Domino 服务器中的 Domino JAR 文件 (NCSO.jar) 复制到 Workplace 服务器上的 Workplace 服务器库目录中:

\WorkplaceServer\lwp_lib

NCSO.jar 文件包括 Domino Java API 以及 ORB,允许您从 Workplace 服务器与 Domino 服务器进行远程通信。NCSO.jar 通常位于 Domino 服务器的位置:

\Domino\data\domino\java\NCSO.jar

要使之工作,Domino 服务器需要运行 DIIOP 服务器任务(如果运行 Lotus Domino 5,还要运行 HTTP 任务)。

可以选择将如何从 Workplace Designer 组件中使用 Domino 类。可以使用与上述相同的技术,在 Workplace Designer JavaScript. 代码中直接编写自己的 Domino 访问代码。例如:

var notesPackage = lotus.domino; 
// access the Java package
var session = null;

// retrieve the user input fields from the form.
var host = document.getStringValue("/rootConverter/host");
var userName = document.getStringValue("/rootConverter/userName");
var password = document.getStringValue("/rootConverter/password");

 // retrieve the Domino factory object
var notesFactory = notesPackage.NotesFactory;
var result = "";

try
{
   // use the Domino factory object to get a Domino session
   session = notesFactory.createSession(host, userName, password);
   if (session != null)
      result = "-- Got Session for "
                    + context.getUser().getCommonName() +".";
   else
      result = "-- Session is null.";
}
catch (ne)
{
   result = result + "-- " + ne.getMessage();
   result = result + "-- Failed to get session for "
                     + context.getUser().getCommonName() +".";
}

print("createSession result is : " + result);
var platform. = null;
if (session != null)
{
   // use the Domino session object to get the Domino server platform. name
   platform. = session.getPlatform();
   if (platform. != null)
   {
      result = "-- Got platform. (" + platform. + "} for " + context.getUser().getCommonName() +".";
      print("Platform. = " + platform);
   }
   else
      result = "-- platform. is null.";
}

print("Access Notes result is : " + result); // log result to SystemOut.log

// display result in form.
document.setStringValue("/rootConverter/diiopResult", result);

此外,如果已经具有与 Lotus Domino 通话的自定义 Java 库,那么惟一要做的就是将 JAR 文件(和 NCSO.jar)安装在 Workplace 服务器上,并从 Workplace Designer 组件的 JavaScript. 代码中调用该文件。这可能是比较干净的选项,因为这样会将所有的 Domino 代码(可能十分庞大)保留在组件外部。JavaScript. 代码无需知道 Domino 类的任何内容,您根本不需要将任何 Domino 对象在组件和 Java 代码之间来回传递。您只需要在 Java 库中维护 JavaScript. 代码和后端系统(用于存储、文档管理或 Domino 暴露的其他任何设施)之间的隔离层。在该场景中可以替换 Lotus Domino,而 JavaScript. 组件无需更改。

var notesPackage = com.ibm.workplace.designernotes; 
// access the package

// retrieve the user input field from the form.
var host = document.getStringValue("/rootConverter/host");
var userName = document.getStringValue("/rootConverter/userName");
var password = document.getStringValue("/rootConverter/password");

 // instantiate an external Java object to access Domino classes
var myNotes = new notesPackage.NotesAccessor();

var result = "";

try
{
   // use the accessor object to initialize a session with Domino
   var success = myNotes.initNotes(host, userName, password);

   // retrieve the platform. information from the Domino server
   var platform. = myNotes.getNotesPlatform()
   if (platform. != null)
   {
      result = "-- Got platform. (" + platform. + "} for " + context.getUser().getCommonName() +".";
      print("Platform. = " + platform);
   }
   else
      result = "-- platform. is null.";
}
catch (ne)
{
   result = result + "-- " + ne.getMessage();
   result = result + "-- Failed to get platform. for "
         + context.getUser().getCommonName() +".";
}

print("Access Notes result is : " + result); // log result to SystemOut.log

// display result in form.
document.setStringValue("/rootConverter/diiopResult", result);

// tell the Domino session we are finished using it
myNotes.termNotes();

这两个场景都在可下载样例中有演示。

Domino 访问代码封装在 NotesAccessor 类中,在 Workplace Designer 组件 JavaScript. 代码和处理后端数据管理的代码之间提供了隔离层。在样例中使用了 getPlatform. 方法,因为一旦已经与 Lotus Domino 成功建立了联系,并具有一个会话对象,就可以访问 Domino Java API 中的全部类。

public class NotesAccessor
{
   private Session _dominoSession = null;

   public NotesAccessor()
   {
   }

   /*
    * Initialize the connection to the Domino server
    */
   public boolean initNotes(String host, String username, String password)
   {
      boolean k = false;
      try
      {
          _dominoSession
                = NotesFactory.createSession(host, username, password);
         k = true;
      }
      catch (NotesException e)
      {
         e.printStackTrace();
      }
      return ok;
   }

   /**
    * clean up any Domino objects
    */
   public void termNotes()
   {
      try
      {
          _dominoSession.recycle();
          _dominoSession = null;
      }
      catch (NotesException e)
      {
         e.printStackTrace();
      }
      return;
   }

   /**
    * @return the Notes session.
    */
   public Session getSession()
   {
      return _dominoSession;
   }

   /**
    * @return The name of the platform. the session is running on
    */
   public String getNotesPlatform()
   {
      String retVal = null;
      try
      {
          if (_dominoSession != null)
              retVal = _dominoSession.getPlatform();
      }
      catch (Exception e)
      {
         e.printStackTrace();
      }
      return retVal;
   }

在图 6 中,我们展示了从 Domino 服务器中检索 OS 平台字符串的两个方法,并将之显示在 Workplace Designer 组件表单上。您可以用同样的方式与其他任何产品的 Java API 进行交互。


图 6. Domino 样例演示
Domino 样例演示 

结束语

Workplace Designer 工具针对任何有兴趣开发 IBM Workplace 平台应用程序的人。它为比较简单的任务提供了 SimpleActions 和 JavaScript,并为需要更多马力的任务提供了与基于 Java 的工具相集成的可扩展性。

要了解有关 IBM Workplace Designer 的更多信息和下载样例,请访问以下参考资料。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14751907/viewspace-444275/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14751907/viewspace-444275/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值