LotusNotesDomino 7 Web Services.docx
- 文档编号:9652593
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:49
- 大小:196.38KB
LotusNotesDomino 7 Web Services.docx
《LotusNotesDomino 7 Web Services.docx》由会员分享,可在线阅读,更多相关《LotusNotesDomino 7 Web Services.docx(49页珍藏版)》请在冰豆网上搜索。
LotusNotesDomino7WebServices
LotusNotes/Domino7WebServices
RobertPerron,文档架构师
RobertPerron是位于马萨诸塞州Westford的Lotus的文档架构师。
自从20世纪90年代初开始,他就一直为LotusNotes和Domino开发文档,主要致力于可编程能力的开发。
他曾为LotusScript和JavaNotes类开发文档,并与别人合著了60MinuteGuidetoLotusScript3-ProgrammingforNotes4一书。
他为LDDToday撰写了多篇文章。
去年,他为TheView撰写了“AComprehensiveTourofProgrammingEnhancementsinNotes/Domino6”一文。
简介:
WebServices是LotusNotes/Domino7的新特性。
本文介绍新WebServices设计元素,展示如何在DominoDesigner中创建这种设计元素,并描述了如何用LotusScript和Java代码示例来实现WebServices。
本文的标签:
lotus,lotus_domino,web_服务
标记本文!
发布日期:
2005年8月08日
级别:
初级
访问情况 1075次浏览
建议:
0 (添加评论)
平均分(共4个评分)
[编者注:
本文描述WebServices的LotusNotes/Domino7Beta2实现。
它可能并不准确反映LotusNotes/Domino7的Gold版本的特性或功能。
]
Web服务是可以通过在Internet上发送消息来调用的远程操作的档案。
Web服务供应商发布用于查询和使用的Web服务,而Web服务消费者调用来自这些服务的操作。
Web服务供应商提供了定义服务接口的WSDL(WebServicesDescriptionLanguage,Web服务描述语言)文档。
WSDL文档是XML格式的。
接口的底层由供应商实现,但大多数供应商将接口映射为支持的编程语言的过程调用。
来自消费者的入站请求传递给底层代码,然后结果返回给消费者。
LotusDomino将WSDL接口映射为可以用LotusScript或Java编码的类似代理的Web服务设计元素。
要被使用,Web服务必须位于启用HTTP的Domino服务器上。
(我们可以通过Notes客户机预览中的HTTP会话测试Web服务。
)通过下列DominoURL命令之一进行访问:
∙?
OpenWebService调用Web服务以响应通过HTTPPOST发送的SOAP编码消息。
HTTPGET(例如,浏览器查询)返回服务的名称及其操作。
∙?
WSDL返回WSDL文档以响应HTTPGET。
本文描述LotusNotes/Domino7中的Web服务器设计元素,并提供了设计元素的LotusScript和Java示例。
本文假设您是了解LotusScript或Java的经验丰富的Notes应用程序开发人员。
示例
让我们看一个简单的例子。
给定数据库名称、视图名称和文档号,我们的操作返回Subject项的内容。
我们将调用操作getNthSubject。
图1.getNthSubject图表
要让该操作可用于外部世界,将其发布在名为GetSubject的Web服务中。
GetSubject可以包含任意数目的操作。
例如,可能发现getFirstSubject和getLastSubject都有用。
但现在只处理示例操作getNthSubject。
下列代码段摘自描述包含这样一个操作的Web服务的WSDL文档。
下面看一下代码段及其注释。
messagename="getNthSubjectRequest"> (4) partname="dbname"type="xsd: string"/> (5) partname="viewname"type="xsd: string"/> (5) partname="n"type="xsd: int"/> (5) message> messagename="getNthSubjectResponse"> (4) partname="getNthSubjectReturn"type="xsd: string"/> (6) message> portTypename="GetSubjectPortType"> (1) operationname="getNthSubject" parameterOrder="dbnameviewnamen"> (2) inputmessage="impl: getnthSubjectRequest"name="GetNthSubjectRequest"/> (3) outputmessage="impl: getNthSubjectResponse"name="GetNthSubjectResponse"/> (3) operation> portType> 首先看portType元素 (1),它定义了服务的操作集合。 我们的服务只有一个portType,它只有一个操作getNthSubject (2)。 该操作有两个“消息”(3): 一个用于输入,一个用于输出。 消息在消息元素(4)中定义。 我们看到,输入消息有三个部分(5): 两个名为dbname和viewname的字符串,一个名为n的int。 输出消息只有一个部分(6),即名为getNthSubjectReturn的字符串。 所以,我们的操作有三个输入部分和一个输出部分,这非常巧妙地映射为具有三个只读参数和一个返回值的过程。 在LotusScript中,这样的过程将通过下列函数来定义: PublicFunctiongetNthSubject(dbnameAsString,viewnameAsString,nAsLong)AsString 在Java中,通过下列方法来定义: publicStringgetNthSubject(Stringdbname,Stringviewname,intn) Web服务设计元素 在DominoDesigner中创建Web服务设计元素有多种可行方法。 可以完全用LotusScript或Java来编码。 在这种情况下,保存设计元素会生成反映LotusScript或Java代码的WSDL文档。 或者可以导入现有的WSDL文档。 在这种情况下,在导入的WSDL中会生成反映操作的LotusScript或Java代码。 Web服务设计元素保存WSDL文档以及代码。 如果公共接口未更改,则WSDL文档保持不变。 如果在编码中更改了影响公共接口的部分,则会生成新的WSDL。 在DominoDesigner中,Web服务设计元素驻留在Shared代码中的Agents之下。 Web服务设计窗口的外观与代理设计窗口非常相似。 单击“NewWebService”按钮以创建新Web服务。 双击现有Web服务以对其进行编辑。 图2.NewWebService WebServicesProperty框有三个类似代理的选项卡。 下面是Basics选项卡: 图3.WebServicesProperty框 名称是必需的。 别名和备注可以提供也可以不提供。 如果编码更改引起新WSDL的生成,则会收到警告消息。 PortType类是定义映射为WSDL操作的过程的类名。 这些过程在LotusScript中必须是公共函数或子程序,在Java中必须是公共方法。 私有函数、子程序和方法不通过Web服务接口暴露。 不能在属性框中输入PortType类,除非已经通过编码或导入WSDL创建了该类。 稍后将详细介绍代码。 Security选项卡几乎与代理Security选项卡完全一样。 稍后将详细介绍Security。 Advanced选项卡具有用于定义Web服务和生成WSDL的其他信息。 稍后将详细介绍。 编辑器窗格与代理的编辑器窗格相似。 在右下拉框中,可以选择LotusScript或Java。 下面显示的是选择Java。 左边是Objects和Reference窗格。 图4.Web服务(Java) 使用“ImportWSDL”按钮以基于现有WSDL创建新Web服务。 “ShowWSDL”按钮编译对Web服务的任何更改,并显示定义公共接口的WSDL文档。 “ExportWSDL”按钮编译对Web服务的任何更改,并导出定义公共接口的WSDL文档。 还可以通过保存或关闭Web服务来编译。 仅当公共接口更改时,才会重新生成WSDL。 基本编码 Web服务的代码具有下列元素: ∙实现代码的类定义。 该类必须成为属性框的Basics选项卡中命名的PortType类,且必须是公共的。 ∙在类中,Web服务中每个操作的过程(函数、子程序或方法)定义。 这些过程必须是公共的。 不想放在接口中的支持过程必须是私有的。 ∙LotusScript中lsxsd.lss的包含。 Java中lotus.domino.types.*的导入。 ∙访问DominoObjects对象时NotesSession(LotusScript)或Session(Java)的初始化。 对于LotusScriptobject,此操作最好是在新块中完成,对于Java,最好是在无参构造函数中完成。 对于Java,使用WebServiceBase.getCurrentSession()来获得Session对象。 我们可能还想使用Session.getAgentContext()来获得AgentContext对象。 WebServiceBase等同于JavaAgent,但Web服务不能访问对象。 惟一有用的方法是静态getCurrentSession()。 下面是LotusScript代码的模板,其中Web服务包含一个操作。 该操作是上述具有三个输入参数和一个返回值的示例操作。 OptionPublic %INCLUDE"lsxsd.lss" DimsAsNotesSession ClassGetSubject SubNEW Sets=NewNotesSession EndSub FunctiongetNthSubject(dbnameAsString,viewnameAsString,nAsLong)AsString ! Codefordoingtheoperationgoeshere EndFunction EndClass 下面是Java代码的模板,其中Web服务包含一个操作。 构造函数必须是默认构造函数(无参数)。 其他构造函数被忽略。 importlotus.domino.*; importlotus.domino.types.*; publicclassGetSubject{ Sessions; publicGetSubject(){ s=WebServiceBase.getCurrentSession(); } publicStringgetNthSubject(Stringdbname,Stringviewname,intn){ //Codefordoingoperationgoeshere } } 现在我们将扩展示例以包括工作代码。 下面是LotusScript代码: OptionPublic %INCLUDE"lsxsd.lss" DimsAsNotesSession ClassGetSubject SubNEW Sets=NewNotesSession EndSub FunctiongetNthSubject(dbnameAsString,viewnameAsString,nAsLong)AsString DimdbAsNotesDatabase DimviewAsNotesView DimdocAsNotesDocument Setdb=s.GetDatabase("",dbname) IfNot(db.IsOpen)Then getNthSubject="Cannotopendatabase"&dbname ExitFunction EndIf Setview=db.GetView(viewname) IfviewIsNothingThen getNthSubject="Cannotopenview"&viewname ExitFunction EndIf Setdoc=view.GetNthDocument(n) IfdocIsNothingThen getNthSubject="Cannotgetdocument"&n ExitFunction EndIf Ifdoc.HasItem("Subject")Then getNthSubject=doc.GetItemValue("Subject")(0) Else getNthSubject="DocumentdoesnothaveSubject" EndIf EndFunction EndClass 下面是Java代码: importlotus.domino.*; importlotus.domino.types.*; publicclassGetSubject{ Sessions; publicGetSubject(){ s=WebServiceBase.getCurrentSession(); } publicStringgetNthSubject(Stringdbname,Stringviewname,intn){ Stringsubject=null; try{ Databasedb=s.getDatabase(null,dbname); if(! db.isOpen())subject="Cannotopendatabase"+dbname; else{ Viewview=db.getView(viewname); if(view==null)subject="Cannotopenview"+viewname; else{ Documentdoc=view.getNthDocument(n); if(doc==null)subject="Cannotgetdocument"+n; else{ if(doc.hasItem("Subject")) subject=doc.getItemValueString("Subject"); elsesubject="DocumentdoesnothaveSubject"; } } } } catch(Exceptione){ subject=e.toString(); e.printStackTrace(); } returnsubject; } } 调用和测试Web服务 最终,Web服务设计元素必须驻留在运行HTTP的Domino7服务器上。 我们可以测试驻留于DominoDesigner上的Web服务设计元素。 首先必须在启动HTTP的任何位置(比如,窗体)选择WebBrowser中的Design-Preview。 如果消费者与Notes客户机位于同一机器上,则使用127.0.0.1作为计算机地址。 要扮演Web服务的消费者,必须在HTTP请求中向DominoWeb服务的URL发送一条SOAP消息。 URL如下: SOAP消息如下: Envelope ENV="http: //schemas.xmlsoap.org/soap/envelope/" xmlns: xsd="http: //www.w3.org/2001/XMLSchema" xmlns: xsd="http: //www.w3.org/2001/XMLSchema" Body> getNthSubject (1) SOAP-ENV: encodingStyle="http: //schemas.xmlsoap.org/soap/encoding/" xmlns: ns0="urn: DefaultNamespace"> type="xsd: string">Webservices2 (2) type="xsd: string">MainView (2) type="xsd: int">2 (2) getNthSubject> Body> Envelope> 在本例中,SOAP消息 (1)标识操作, (2)并提供输入部分的值。 显示在SOAP-ENV: body中的特定元素由WSDL绑定特征确定,尤其是SOAP消息格式。 (详细信息请参阅下文的“高级属性”)。 Web服务的WebSphereSDK提供了调用Web服务和查看结果的工具。 此SDK运行于Eclipse中。 必须安装: ∙Eclipse2.1 ∙IBMWebSphereSDKforWebServicesVersion5.1 WebSpereSDK(截止撰写本文时)不与Eclipse3.0一起使用。 还可以使用WebSphereStudioApplicationDeveloper来调用Web服务。 最新版本是v5.1.2。 要支持WebSphereSDK工具,打开Eclipse并选择Run-LaunchtheWebServicesExplorer。 WebServicesExplorer加载后: 1.单击WSDLPage图标。 它是右上角右箭头之后的第三个图标。 WSDLMain链接显示在左边的Navigator窗格中。 2.单击WSDLMain链接。 OpenWSDL框显示在右窗格中。 3.用命令? WSDL输入Web服务的URL,例如,Go。 我们想要? WSDL(而非? OpenWebService),因为此处WebServicesExplorer阅读WSDL文档。 4.WSDLBindingDetails框显示在右窗格中,它包含到Web服务定义的操作的链接。 5.单击操作名称,例如getNthSubject。 显示InvokeaWSDLOperation框。 6.输入输入部分(参数)的值,然后单击Go。 响应返回在底部(Status)窗格中。 调用示例Web服务之后,WebServicesExplorer的外观如下。 图5.WebServicesExplorer Actions框的右上角有Source链接。 单击Source显示实际SOAP消息。 可以修改SOAP消息,然后单击Go将其发送。 单击右上角的Form以返回到原始显示。 Status框也有Source链接,该链接允许查看SOAP响应,如果状态指示没有要显示的内容(且期望响应),则代码可能失败了。 运行Web服务之后,检查服务器控制台或log.nsf以获得错误消息。 可以通过插入MessageBox语句来登录或调试,从而打印到服务器控制台或log.nsf。 (不要使用Beta2中的Print打印语句。 这些语句转到代理的HTTP流并破坏SOAP响应。 ) 高级属性 属性框的Advanced选项卡影响WSDL文档反映的Web服务定义。 图6.WebServicesProperty框的Advanced选项卡 可以提供想要为端口类型、服务元素和服务端口命名的名称。 例如,可以将GetSubject用作所有名称。 为了清晰,使用反映元素类型的后缀。 在属性框中提供名称时,这些名称插入到生成的WSDL文档中。 如果导入WSDL文档,则WSDL文档中的名称自动插入到属性框中。 下面是GetSubject示例完整的WSDL文档。 注释部分是WebServicesProperty框的Advanced选项卡反映的内容。 xmlversion="1.0"encoding="UTF-8"? > definitionstargetNamespace="urn: DefaultNamespace" xmlns="http: //schemas.xmlsoap.org/wsdl/" xmlns: apachesoap="http: //xml.apache.org/xml-soap" xmlns: impl="urn: DefaultNamespace"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LotusNotesDomino Web Services