扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
许多组织发现,可以对他们的 Domino Web 应用程序采用的下一合理措施是将其与 IBM WebSphere 软件集成一起。他们这样做有合理的原因。Lotus Domino 的基于文档的架构使它容易创建文档,并在内容创建器与编辑器之间共享文档。它的内置安全性和版本功能适用于管理基于文档的内容。
WebSphere 是高性能、企业级事务型应用服务器。它的核心是强大的 J2EE 引擎,该引擎被设计用来获得高可伸缩性和健壮性。WebSphere 还是最新的 Web 技术的熔炉。寻求通过扩展其当前 Domino 应用程序来使用这些技术的组织会发现,在自己的环境中包含 WebSphere 是一个理性的选择。
虽然好处显而易见,但完成集成可能没那么容易。通常,精通某个系统的开发人员对其他系统并不熟悉。因此,对于开发人员来说,集成就需要组合陡峭的学习曲线和紧张的时间线。IBM 和 Lotus 都认识到了这一点,它们已经合并了许多工具来促进这个过程。
在这个由两部分组成的系列文章中,我们向您介绍两种不同的集成方法:一种方法使用 Domino XML(DXL),另一种方法使用 Domino JSP 标签库,这些标签库是 Lotus Domino Toolkit for WebSphere Studio 的一部分。我们将查看每种方法的优缺点,讨论它们的长处与不足。通过使用清单,我们将帮助您确定哪种方法最适合您和您的应用程序。然后我们将通过例子,向您详细说明每种方法的使用方法。
在本系列文章的第 1 部分中,我们侧重于 Domino XML。在第 2 部分,侧重点是 Domino JSP 标签库。这两篇文章都假设您是熟悉 XML 和 JSP 技术的应用程序开发人员。第 1 部分还假设您具有一些 Java 经验。
两种方法:XML 和 Domino JSP 标签库
Lotus 长期以来一直是 XML 的支持者。从 Lotus Notes/Domino 5 版本开始,Lotus 就一直向 Lotus Notes/Domino 的新版本添加新的功能,来增强它处理 XML 的能力。Lotus Notes/Domino 6.5 也不例外。它提供了许多功能,使开发人员几乎能够从所有 Domino 元素生成和提取 XML。对于那些不太熟悉 Domino 技术的人来说,Domino 数据库包含 Notes 文档和一些设计元素,比如表单、视图和代理。XML 允许您访问这些设计元素和文档,可以将它想像成合为一体的应用服务器、Web 服务器和数据库引擎。
另一种访问方法是 Domino JSP 标签库。这些库由 Lotus 提供,可以帮助开发人员构建启用 Domino 的 JSP。标签库隐藏了那些将 JavaServer Page(JSP)连接到 Lotus Domino 所需的基本 Java 代码。通信是通过 IIOP 使用 CORBA 进行的。这允许 Java 代码通过编程的方式访问数据库的几乎所有元素。
路标:XML 还是标签库?
这两种方法提供不同的集成途径。下列清单将帮助您确定哪种方法最适合您和(或)您要完成的工作。
专业知识
许多 Java 开发人员害怕学习 Lotus Domino,仅仅是因为 Lotus Domino 与他们所习惯的东西没有类似之处。这些人在开放标准领域寻求解决方案,在这个领域中,可以普遍使用诸如 Java 和 XML 之类的语言开发程序。如果您是这些开发人员中的一员,那么您将发现 XML 方法更易于理解。它需要最少的 Domino 专业知识,但是需要更多地了解 XML、XSLT 和 Java。
在这个群体的另一端是经验丰富的 Domino 开发人员,他们有全面的 Lotus Domino 知识,但是没有 Java 或 WebSphere 专业知识。对于这些开发人员,标签库更吸引人。这种方法需要有相当广泛的 Domino 知识和技能。同时它需要最少的管理经验和访问权来修改系统配置变化。
站点/应用程序的性质
表现型
许多 Web 站点是表现型的。这意味着它们的主要目标是通过 Web 显示 HTML 内容。这种类型的 Web 站点几乎不需要用户输入。内容在初始发布后通常不需要再进行修改。表现型站点的例子有新闻或产品文档页面。
有时可能需要在除了 Web 之外的媒体上发布数据。例如,可能需要创建传单和小册子,或从 Lotus Domino 中存储的数据生成电子邮件时事通讯。表现驱动的(presentational-driven)站点/应用程序主要受益于 XML 方法,因为 XML 是可扩展的,可以转换为无数格式。
事务型
在技术上,所有 Web 站点都是事务型的。但是在这里,为了便于解释,事务型站点是指非常依赖用户输入的站点。这些站点提供服务集合,其中内容都是可个性化的,且经常是动态的。这通常需要某种形式的授权和对用户注册的身份验证。事务型站点的例子有拍卖站点和在线论坛。这种类型的站点/应用程序主要受益于标签库解决方案。
这两种方法的特点
XML 非常便于移植。使用它几乎可以在所有使用最新编程语言的应用服务器与数据库之间共享数据。XML 使用行业标准,如 Java、XSLT 等,而且还可以扩展行业标准,但 XML 不是系统或平台相关的。使用 XML 不需要非常熟悉 Lotus Domino 和数据库。XML 非常适用于集中于内容交付的表现型 Web 站点。
标签库与 Lotus Domino 和 J2EE 标准紧密集成。它们提供低级 Domino 对象访问,如直接查询 Domino 视图。要使用标签库,必须非常熟悉 Domino 架构和数据库设计。标签库支持 Lotus Domino 和 WebSphere 之间的双向数据流动。它们非常适用于事务型和交互密集的 Web 站点。
|
XML 方法
在本系列文章的第 1 部分中,我们重点介绍了 XML 方法。在第 2 部分中,我们将侧重点放在了标签库上。XML 方法可以分为三部分:从 Domino 导出 XML、转换 XML 以及在 JSP 中显示生成的内容。我们按此顺序讨论这种方法。为了修改 JSP 文件,我们将使用 WebSphere Studio Application Developer 5.1,但是该软件并不是必需的。
介绍 Domino XML(DXL)
Lotus Domino 提供了许多功能,以便将 Domino 数据作为特殊类型的 XML 导出和导入并设计元素。Lotus Domino 将这种特殊类型的 XML 称为 DXL —— Domino XML 语言的缩写。不要为这个名称迷惑。DXL 就是符合 Domino DTD 的 XML,在 Notes\xmlschemas 目录中可以找到 Domino DTD。
在撰写本文时,Lotus Domino 6.5.1 提供了 8 个模式文档 —— 每个 Lotus Domino 6.x 迭代一个。
在继续后面的操作之前,要设置一下运行例子的环境。该例假设使用的是运行 Lotus Notes 6.5 的 Microsoft Windows 操作系统:
注意:在 ACL 中,至少需要具有 Designer 级别访问权,并且必须启用 Create Lotuscript/Java agents 选项。
现在,我们仔细研究一下刚才所做的各个部分的工作。
|
DxlExporter
Lotus Domino 6.5 提供名为 DxlExporter 的 Java 实用程序类。DxlExporter 向开发人员提供了从 Domino 元素中生成 DXL 的编程方法。在 Lotus Domino 6.5 之前,DxlExporter 是在称为 Lotus XML Toolkit 的单独下载产品中使用的。使用版本较老的 Lotus Domino 的那些人可能要使用这个版本的 DxlExporter。
在我们的例子中,使用 Domino Java 代理内的 DxlExporter。Java 代理是一种 Java 程序,它扩展了 Lotus 提供的称为 AgentBase 的基础类,并且可以在 Domino 框架内运行。有关 Java 代理的详细信息,请参阅 Domino Designer help。
DxlExporter 允许使用 exportDxl 方法将 4 种不同类型的 Domino 元素导出到 DXL。这些元素是数据库、文档、documentcollection 和 notecollection:
public String exportDxl(Database database)
将 Domino 数据库中的所有东西导出为 DXL 格式。其中包括设计元素和数据文档。
public String exportDxl(Document document)
将 Domino 文档导出到单个 DXL 文档。
public String exportDxl(DocumentCollection documentcollection)
将 Domino 文档的集合导出到单个 DXL 文档中。
public String exportDxl(NoteCollection notecollection)
导出 Domino 元素集合。这些元素可以包括设计元素和数据文档。
对于我们的例子,是在 GetandTransformDXL 中使用该方法的第二个版本,通过 For 循环每次导出一个文档。我们还可以轻松使用该方法的第三个版本,即导出 documentcollection,但是要为所有文档生成一个 XML 文件,而不是为每个文档生成一个文件。
DxlExporter exporter = session.createDxlExporter(); exporter.setForceNoteFormat(false); exporter.setOutputDOCTYPE(false); Stream stream = session.createStream(); if (stream.open(DXL_FILE_PATH+ this.getFilename()+ FILETYPE_SUBFIX)) { stream.writeText(exporter.exportDxl(doc)); } |
Lotus 为 DxlExporter 提供了许多方法来定制 DXL 输出。我们将讨论例子中使用的两种方法:ForceNoteFormat 和 OutputDOCTYPE。
exporter.setForceNoteFormat(false);
exporter.setOutputDOCTYPE(false);
ForceNoteFormat — DxlExporter.setForceNoteFormat(boolean)
将参数设为 true,告诉导出程序将每个 Domino 元素作为 note 元素导出。将参数设为 false,告诉导出程序将每个 Domino 元素以其自己的类型导出。为了对此进行说明,请参见下例。将 ForceNoteFormat 属性设置为 true,如下所示:
exporter.setForceNoteFormat(true);
这将生成一个包含名为 note 的顶级对象的 XML,这个对象有这样一个属性值 class = 'document'。从汽车例子中生成的 DXL 文档如下所示:
<note class='document' xmlns='http://www.lotus.com/dxl' version='6.5' maintenanceversion='1.0' replicaid='88256F0C0071CEAD'> … <note> |
另一方面,在将 ForceNoteFormat 设为 false 时,DxlExporter 将顶级元素作为 Domino 元素类型导出。将 ForceNoteFormat 属性设置为 false:
exporter.setForceNoteFormat(false);
生成如下所示的 DXL 文档:
<document xmlns='http://www.lotus.com/dxl' version='6.5' maintenanceversion='1.0' replicaid='88256F0C0071CEAD' form='car'> ... </document> |
注意:将 ForceNoteFormat 属性设为 true 或 false 都不会更改所包含元素的输出。
OutputDOCTYPE —— DxlExporter.setOutputDOCTYPE(boolean)
这方法将附加 DOCTYPE 标签以及 SYSTEM 和 DTD 信息。将生成的 DXL 传递到其他程序或个人来验证 DXL 的完整性时,此方法很有用。SYSTEM 可以通过 DxlExporter.setDoctypeSYSTEM( ) 来设置。注意 DOCTYPE 标签中对 Domino DTD 的引用。
<!DOCTYPE document SYSTEM 'xmlschemas/domino_6_5_1.dtd'>
DxlExporter 有一个 LotusScript 版本,称为 NotesDxlExporter。它提供的功能几乎与它的 Java 版本的对应功能一样。它最初是随 Lotus Domino 6 发行的。
|
研究 DXL
现在浏览至 C:\article\dxl\,并在最喜欢用的文本编辑器或浏览器中打开新创建的 DXL 文件(扩展名仍为 XML)。我们研究一下它的结构和内容。
图 3. 在浏览器中打开生成的 DXL
DXL 的设计目标是用类似树状的分层结构来表现 Domino 元素。它受 Domino DTD 限制,该 DTD 根据 Domino 构造描述每个元素。因此,对于数据,DXL 文档在语义上通常没有任何意义。可以通过汽车例子来思考这个问题:假设有一个名为 VIN 的文本字段,它存储 Domino 文档中的字母数字值。此字段的导出 DXL 表示为:
<item name='VIN'><text>9135D30E168BEC6688256F0D00626201</text></item>
虽然这是有效的 XML,然而它并没有表示车辆识别号(即汽车的惟一 ID)的真实意义。实际上,VIN 的表示形式与文档中的其他任何文本字段没什么区别。是否将 DXL 文档转换为可以表示语义的 XML 文件由开发人员决定。为了获得最大的可移植性,我们建议将 DXL 文档转换为可以更有效地描述数据的 XML 文件。
|
转换 DXL
转换 XML 的功能是非常强大的。这项功能由 XSLT(Extensible Stylesheet Language Transformation)处理。如果不熟悉 XSLT 和其他相关技术,请参阅 http://www.w3.org/Style/XSL/。
使用 DXL 的情况下,在使得数据在 Lotus Domino 之外的地方同样有意义方面,转换起着重要作用。在下面各小节中,我们将介绍转换 DXL 的细节和一些技巧。
覆盖名称空间 dxl
DXL 文档包含 XML 名称空间 dxl。虽然这个名称空间值对于描述 DXL 文档很有意义,但对于描述 XML 格式,这个值没有任何用处。默认情况下,XSLT 引擎在生成的 XML 中附加源 XML 的名称空间。要覆盖 dxl,需要在 <xsl:stylesheet> 标签中添加属性 exclude-result-prefixes="dxl":
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dxl="http://www.lotus.com/dxl" version="1.0" xmlns:xalan="http://xml.apache.org/xslt" exclude-result-prefixes="dxl">
处理文本字段和其他简单数据类型
Domino 6.5.1 DTD 中定义了 7 种简单数据类型。这些类型是:
要使 XSL 更加智能,可以考虑使用 choose/when 标签来检测数据类型,并选择适当的模板来处理该数据类型:
<xsl:choose> <xsl:when test="name(child::*)='text'"> <xsl:apply-templates select="dxl:text" /> </xsl:when> <xsl:when test="name(child::*)=’number’"> <xsl:apply-templates select="dxl:number" /> </xsl:when> <xsl:when test="name(child::*)='datetime'"> <xsl:apply-templates select="dxl:datetime" /> </xsl:when> <xsl:when test="name(child::*)='textlist'"> <xsl:apply-templates select="dxl:textlist" /> </xsl:when> <xsl:when test="name(child::*)='numberlist'"> <xsl:apply-templates select="dxl:numberlist" /> </xsl:when> <xsl:when test="name(child::*)='datetimelist'"> <xsl:apply-templates select="dxl:datetimelist" /> </xsl:when> </xsl:choose> |
下面我们加进来了一些简单类型的模板。
将元素值转换为属性值
按照一般 XML 惯例,顶级元素通常包含 ID 类型属性,以标识它们的惟一性,例如:
<car vin="0C96E710809A900D88256F0D006260E8">
在 DXL 文档中,VIN 数值仅作为 <text> 元素列出。要将其添加到生成的 XML 的属性中,则需要进行下列操作:首先,使用 match="dxl:document" 测试文档是否存在。如果文档存在,则创建汽车元素(因为每个 DXL 文档表示一个汽车对象)。然后,向该汽车元素添加 vin 属性,这个属性包含 VIN 项的值。最后,使用 xPath 定位 VIN 项,如下所示:
<xsl:value-of select="./dxl:item[attribute::name='VIN']/dxl:text/text()" /> <xsl:template match="dxl:document"> <xsl:element name="car"> <xsl:attribute name="vin"> <xsl:value-of select="./dxl:item[attribute::name='VIN']/dxl:text/text()" /> </xsl:attribute> <xsl:apply-templates select="./dxl:item" /> </xsl:element> </xsl:template> |
处理多值字段
Lotus Domino 支持多值字段的概念。这种类型的字段经常称为列表。textlist 是最常使用的多值字段类型。在我们的例子中,包含名为 Specifications 的多值字段,其包含车辆具有的各种选项。下面是多值 DXL。注意 item 标签中的 <textlist> 标签集合。
<item name='Specifications'> <textlist> <text>Power locks</text> <text>AWD</text> <text>Anti-lock brakes</text> <text>Automatic windows</text><text>A/C</text> <text>ABS</text> </textlist> </item> |
将字段名称用作元素名称
其他多数 Domino 字段都有一般 DXL 表示,如下所示:
<item name='fieldName'> <fieldType>Acura</fieldType> </item> |
通常,在生成的 XML 中,将 fieldName 用作元素名称是最理想的:
<fieldName>Acura</fieldName>
因此,使用我们例子中的元素时,将会如下所示:
<item name='Make'> <text>Acura</text> </item> |
转换为:
<Make>Acura</Make>
进行这项操作的 XSL 代码如下所示:
<xsl:element name="{@name}"> <xsl:apply-templates select="dxl:text" /> </xsl:element> <xsl:template match="dxl:text"> <xsl:value-of select="text()" /> </xsl:template> |
我们要将上面的代码转换为以下格式:
<Specifications> <listitem>A/C</listitem> <listitem>Anti-lock brakes</listitem> <listitem>AWD</listitem> <listitem>Defrost</listitem> </Specifications> |
在该例中,使用:
<xsl:template match="dxl:textlist"> <xsl:for-each select="./dxl:text"> <xsl:element name="listitem"> <xsl:apply-templates select="text()" /> </xsl:element> </xsl:for-each> </xsl:template> |
在 JSP 中显示数据
此时,可以使用 JSP 显示 Domino 数据。启动 WebSphere Studio Application Developer 5.1,并导入 ArticleWeb.war 作为新的 Web 项目。(有关 WebSphere Studio Application Developer 的详细信息,请参阅 developerWorks: WebSphere Studio zone)。找到并展开 ArticleWeb 项目文件夹。然后双击 WebContent 文件夹并找到文件 dispxmlcar.jsp。最后右击 dispxmlcar.jsp 并选择 Run on Server。
图 4. WebSphere Studio Application Developer Project Navigator
如果提示选择服务器实例的版本,请选择 WebSphere Application Server 5.1。服务器和应用程序将自动启动。
在启动应用程序后,会在 WebSphere Studio Application Developer 的内嵌 Web 浏览器窗口中看到错误消息。忽略这条消息,因为 JSP 要求查询字符串中包含 vin 参数。要解决这个问题,只需从 XML 文件或 Domino 数据库中获取车辆识别号,并将其作为查询字符串添加到 URL 中即可,如下所示:
http://localhost:9080/ArticleWeb/dispxmlcar.jsp?vin=[vin number]
按 Enter 键后,然后会看到结果。
图 5. 预览生成的 HTML
|
JSP 和转换器
Dispxmlcar.jsp 提供基本 HTML 框架。可以在该框架中设置公司站点报头(masthead)和导航。中间是 dispxmltable.jsp 的 <jsp:include>。这个 JSP 只显示包含汽车数据的中间表。
Dispxmltable.jsp <%@page import="java.io.*,java.util.*, java.net.*, com.ibm.alphaworks.utils.xml.*" %> <% String vin = request.getParameter("vin"); String xml = "c:\\article\\xml\\" + vin + ".xml"; String xsl = "c:\\article\\xsl\\TransformHTML.xsl"; aWTransformer at = new aWTransformer(); at.setXmlin(xml); at.setXslin(xsl); at.setWriter(response.getWriter()); at.doTransform(); %> |
它使用 vin 参数作为关键字来查找 C:\article\xml\ 目录中的 XML 文档。XSL 文档 TransformHTML.xsl 有硬编码路径。
注意:有更成熟的方法来存储和检索 XML 或 XSL。一个普遍使用的方法是使用关系数据库(如 DB2)将 XML 作为 CLOB(Character Large Object)存储。为了不使本文过于复杂,我们采用了文件系统。
实际转换由名为 aWTransformer 的类处理。该类基于 Xalan 的示例转换器类,一般来说,应该不需要进行任何进一步的开发。
dispxmltable.jsp 中没有 HTML 代码。HTML 表是基于 TransformHTML.xsl 样式表中的构造生成的。这种设置具有很大的灵活性:
该应用程序还可以在其他 J2EE 应用服务器上使用。
|
结束语
Lotus Domino 向开发人员提供了许多集成实用程序和工具。在本文中,我们介绍了如何使用 DxlExporter 生成 DXL 文档,如何将这些文档转换为有意义的 XML 文件,以及如何在 WebSphere 中将这些文件作为 JSP 显示。在第二篇文章中,我们将详细讨论如何使用 Domino 标签库创建动态 JSP。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者