首页专业论文技术应用政策标准解决方案常用资料经验交流教育培训企业技术专家访谈电力期刊
您现在的位置:北极星电力网 > 技术频道 > 常用资料 > 访问Notes/Domino数据的定制DXL框架

访问Notes/Domino数据的定制DXL框架

北极星电力网技术频道    作者:佚名   2008/8/6 13:43:03   

 关键词:  数据 DOM

级别:中级

RajBalasubramanian
咨询IT架构师,IBM
2005年6月16日

使用DominoXML(DXL)可以使其他应用程序能够创建、查看和更新LotusNotes/Domino6.x中的Notes文档。通过LotusScript代理,可以查看DXL格式的Notes文档,从DXL创建文档,还可以从DXL更新文档。

DominoXML(DXL)是Domino设计元素的XML格式表示,这种XML使用Notes\xmlschemas目录中的DominoDTD。(LotusNotes/Domino7还将包括XML模式文档。)DXL为将Domino应用程序数据暴露给其他平台提供了一种很好的方式。例如,DXL允许以XML格式导出和导入Domino数据和设计元素。DXL最初是在LotusDomino5中引入的,在更新的版本中,DXL已成为LotusDomino的核心的一部分。(developerWorks:Lotus文章"LotusDomino与IBMWebSphere集成解决方案:DominoXML"对DXL作了很好的介绍)。

在本文中,我们讨论了LotusDomino6.5.x中创建的DXL框架的一些关键组件,这些组件用于浏览、创建和更新Domino数据。这个框架由一个Domino数据库组成,该数据库包含三个LotusScript代理,分别用于浏览、更新和创建Notes文档。本文假设您是一名有经验的应用程序开发人员,拥有使用LotusDomino和XML的经验。

DXL框架
我们的定制DXL框架简化了任何客户机对Notes对象的访问。有很多方法可以从不同的编程平台访问Domino对象。然而,面对某种给定的场景,每种访问方法都呈现着其特有的挑战。例如,常规Java应用程序使用的DIIOP访问方法不能穿越传统的防火墙,因为这些防火墙只允许HTTP传输。因此,不存在与应用程序无关的开箱即用的方式来创建或读取文档。这就说明了为什么XML是很好的选择。如果您正在构建有特殊需求(例如防火墙)的Microsoft.Net客户机或常规Java客户机,那么这里的DXL框架可以提供一个良好的解决方案。

例如,您可以使用DXL框架来构建一个应用程序,这个应用程序允许用户:

  • 在Notes视图中查看一组Notes文档。
  • 从该组文档中选择一个文档,并查看该Notes文档的细节。
  • 在选定的文档上更新值。
  • 创建新的Notes文档。
  • 图1说明了组成这个DXL框架的关键设计元素。

    图1.DXL框架

    如图1所示,我们的DXL框架由一个Domino数据库(database.nsf)组成,该数据库包含三个LotusScript代理:

  • [DXLUpdateDoc]接受DXL格式的XML,并处理来自客户机的请求,以更新具有给定UNID的选定文档。
  • [DXLCreateDoc]接受DXL格式的XML,并处理客户机请求,以创建一个新的文档。
  • [DXLViewDoc]返回具有给定UNID的选定文档的XML。
  • 我们将在后面描述这些代理的内部工作原理。此外,您可以使用Notes视图的本地功能通过?ReadViewEntriesURL命令呈现XML数据,从选定的Notes视图中请求XML数据。

    在本文中,我们主要关注DXL框架的服务器端组件。(要下载图1中所示的样本代理,请查看本文后面的下载小节)。

    视图和文档的DXL格式
    现在让我们看看如何安排视图和文档的DXL格式。图2展示了一个视图的DXL。

    图2.一个Notes视图DXL格式

    在图2中:

  • 蓝色的圆圈表示元素。
  • 灰色的椭圆表示属性。
  • 黄色的矩形表示字符数据。
  • 绿色的箭头表示“含有一个……”。
  • 黑色的箭头表示聚合。
  • 如图2所示,viewentries是顶层元素。它包含一个或多个viewentry元素,这些元素又各自包含一个或多个entrydata元素。每个entrydata元素可以包含以下几个元素中的一个:text、number、datetime和numberlist。

    注:在这一节中,我们讨论DXLviewentries元素,该元素含有DXL格式的视图的内容。不要将它与DXL视图元素混淆,后者是DXL格式的视图的实际描述。

    图中还给出了我们在XML处理过程中使用的关键属性。对于viewentries元素,我们使用toplevelentries来得到一个视图中所有文档的计数。从viewentry我们可以得到UNID(存储起来供以后使用),从entrydata可以得到columnnumber属性,以便用于查找需要的字段值。

    下面是视图DXL代码的一个片段:

    <?xmlversion="1.0"encoding="UTF-8"?><viewentriestoplevelentries="26"><viewentryposition="1"unid="F0C7DF1BE84F48B685256F0800720716"noteid="1392"siblings="26"><entrydatacolumnnumber="0"name="$18"><number>0</number></entrydata><entrydatacolumnnumber="1"name="$17"><text>Styles,Ron</text></entrydata><entrydatacolumnnumber="2"name="$12"><text></text></entrydata><entrydatacolumnnumber="3"name="CompanyName"><text></text></entrydata><entrydatacolumnnumber="4"name="$16"><text>RStyles@ABC</text></entrydata><entrydatacolumnnumber="5"name="$21"><text>NotesMail/HQ/ABC</text></entrydata></viewentry>......</viewentries>

    图3演示了Notes文档DXL(在这里就是database.nsf中的一个Person文档)。

    图3.一个Notes文档的DXL格式

    在本文中,我们主要关注上面关于DXLNotes文档的图中所显示的元素和属性。(我们不使用noteinfo和updatedby元素,所以图3没有给出这两个元素)。如演示所示,document是顶层元素,它包含一个或多个item元素。每个item元素各自又可以包含以下元素中的一个:text、number、datetime、numberlist和textlist。item元素的关键属性是name,用于查看我们感兴趣的字段值。

    下面是一个例子文档的DXL代码的片段:

    <?xmlversion=''1.0''encoding=''utf-8''?><!DOCTYPEdocumentSYSTEM''xmlschemas/domino_6_5_1.dtd''><documentxmlns="http://www.lotus.com/dxl"version=''6.5''maintenanceversion=''1.0''replicaid="85256F080071E637" form="Person"><noteinfo>......</noteinfo><updatedby>......</updatedby><itemname="Title"><text/></item>......<itemname="Owner" authors="true" names="true" protected="true"><text>CN=RonStyles/OU=HQ/O=ABC</text></item></document>

    打开一个视图
    至此我们对视图和文档的DXL格式已经有所理解,现在让我们看看,当一个客户机查看样本数据库的AllDocuments视图中的文档列表时在内部所发生的一系列事件:

  • 用户打开常规客户机应用程序,输入用户ID和密码。(或者,也可以在配置文件中提供)。
  • 客户机应用程序使用?ReadViewEntries查询字符串,针对目标数据库视图创建到Domino服务器的一个HTTP请求。在这里,这个视图就是样本AllDocuments视图,该视图显示例子数据库中的所有文档。
  • Domino服务器验证用户,处理请求,并在HTTP响应中将XML数据返回给客户机。
  • 客户机应用程序处理从服务器收到的XML数据,并显示AllDocuments视图中的文档列表。
  • 图4演示了这个过程。

    图4.查看文档

    打开一个文档
    当一个客户机打开AllDocuments视图中的一个Notes文档时,将进行以下步骤:

  • 像上一节中描述的那样,用户打开AllDocuments视图。
  • 用户选择一个要打开的文档。
  • 客户机应用程序获得所选文档的UNID,并发送一个针对URI为/ViewDXLDoc?Open&unid=<docUNID>的目标数据库的HTTP请求到Domino服务器。
  • Domino服务器处理该请求,验证用户并处理代理请求,输出DXL格式的文档(文档的UNID是在请求中发送的)。
  • 常规客户机收取DXL文档的XML数据并加以处理。
  • 为用户显示所选文档的一个细节视图。
  • 图5展示了这个过程。

    图5.打开一个文档

    创建一个文档
    当用户创建一个新的Notes文档时,将进行以下步骤:

  • 用户启动客户机应用程序,选择用于创建新文档的菜单选项。
  • 用户在应用程序中看到一个常规的表单。用户填好该表单,并提交/保存表单。
  • 应用程序提取表单数据,将其格式化为XML(遵从DXL文档格式),然后调用DXLCreateDoc代理。这样将在HTTP请求中发送DXL内容。
  • Domino服务器验证用户,并处理代理请求。
  • DXLCreateDoc代理处理DXL文档中的XML数据,返回的消息被发送到客户机。
  • 用户看到关于表单提交动作的成功/失败消息。
  • 图6展示了这些步骤。

    图6.创建一个文档

    定制的DXL代理
    在这一节中,我们研究[DXLViewDoc]、[DXLUpdateDoc]和[DXLCreateDoc]这几个LotusScript代理的内部工作原理。这些代理是DXL框架的关键组件。我们研究每个代理的代码片段,解释每个片段所做的工作。(要下载这些代理的完整代码,请查看下载小节)。

    [DXLViewDoc]
    [DXLViewDoc]代理返回选定文档的XML。该代理首先设置一些标准变量。我们使用会话文档上下文方法获得文档对象。对HTTP请求的响应是通过标准打印语句来处理的。首先将响应内容类型初始化为text/xml。还要捕捉错误。

    SubInitializeDimsAsNewnotessessionDimdbAsnotesdatabaseDimdocAsnotesdocumentDimdoc1AsnotesdocumentSetdoc1=s.DocumentContextPrint"Content-type:text/xml"OnErrorGotoerr1Setdb=s.currentdatabaseDimstgAsString

    然后通过请求URL的查询字符串查找传入的UNID,并进行最小错误检查。

    stg=doc1.Query_String(0)IfLen(stg)<5ThenGotoerr1EndIfIfInstr(stg,"unid=")<1ThenGotoerr1Elsestg=Right(stg,Len(stg)-Instr(stg,"="))EndIf

    得到一个有效的UNID后,首先获取Notes文档的一个句柄,接着使用NotesDXLExporter将内容导出到XML,并确保XML中不需要提供DTD。

    Setdoc=db.GetDocumentByUnID(stg)DimexporterAsNotesDXLExporterDimstreamAsnotesstreamSetexporter=s.CreateDXLExporterexporter.OutputDOCTYPE=FalseSetstream=s.CreateStreamCallexporter.SetInput(doc)Callexporter.SetOutput(stream)Callexporter.Process

    然后从stream对象获得文本,并将文本输出到客户机。

    Printstream.ReadText()Enderr1:Print"Youreachedinerror"ResumeEndSub

    [DXLUpdateDoc]
    [DXLUpdateDoc]代理处理客户机请求,以更新所选定的文档。我们使用请求的Request_Content属性来获得由客户机发送的实际XML的句柄,并将其输送到stream对象。

    DimxAsNotesItemDimstreamAsNotesStreamSetx=doc.GetFirstItem("Request_Content")................Callstream.WriteText(x.Text)

    然后实例化NotesDXLImporter,以便在数据库上下文中使用stream,并规定这次的导入是更新而不是创建。

    DimimpAsNotesDXLImporterSetimp=session.CreateDXLImporter(stream,db)imp.DocumentImportOption=DXLIMPORTOPTION_UPDATE_ELSE_IGNOREimp.ReplicaRequiredForReplaceOrUpdate=FalseCallimp.Process

    [DXLCreateDoc]
    [DXLCreateDoc]代理处理客户机请求,以创建一个新的文档。该代理与DXLUpdateDoc代理很相似。它们之间的主要区别是,在使用stream(在数据库上下文中)的过程中,我们规定了这次的导入类型是创建,从而可以创建一个新的文档。

    imp.DocumentImportOption=DXLIMPORTOPTION_CREATE....

    结束语
    在本文中,我们描述了如何利用LotusNotes/Domino6中提供的DXL特性,然后描述了如何用定制的LotusScript代理创建一个框架,用于查看和更新已有的Notes文档。这个框架被设计用来简化对Notes对象的访问。它使用XML而不是HTML,因此,对于任何知道如何处理XML的应用程序来说,它处理起来比较简单。由于它是通过HTTP协议传输的,因此可以通过防火墙。

    本文的目的是为您提供必要的预备知识,以便能够使用我们描述的DXL框架来设计用来访问和处理Domino数据的应用程序。在设计用于Web(JSR168portlets)和丰富客户机(EclipseRCP)的应用程序时,也可以使用这个框架。

    来源:互连网
    友情链接
    北极星工程招聘网北极星电气招聘网北极星火电招聘网北极星风电招聘网北极星水电招聘网北极星环保招聘网北极星光伏招聘网北极星节能招聘网招标信息分类电子资料百年建筑网PLC编程培训

    广告直拨:   媒体合作/投稿:陈女士 13693626116

    关于北极星 | 广告服务 | 会员服务 | 媒体报道 | 营销方案 | 成功案例 | 招聘服务 | 加入我们 | 网站地图 | 联系我们 | 排行

    京ICP证080169号京ICP备09003304号-2京公网安备11010502034458号电子公告服务专项备案

    网络文化经营许可证 [2019] 5229-579号广播电视节目制作经营许可证 (京) 字第13229号出版物经营许可证新出发京批字第直200384号人力资源服务许可证1101052014340号

    Copyright © 2022 Bjx.com.cn All Rights Reserved. 北京火山动力网络技术有限公司 版权所有