扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:陈 原 来源:论坛整理 2008年1月10日
关键字: lotus Lotus Notes
NSF 组件的开发
对一个复合应用的组件而言,最基本的部分是属性和操作。所以对组件的开发而言,最重要的部分也将围绕着属性和操作来进行,大体上可以分为三个步骤:定义属性和操作,属性的发布,操作的实现。
下面我们将用上面这个复合应用中的两个组件为例,描述 NSF 组件开发的过程。
这两个 NSF 组件一个是 Notes 视图(ImageNewsList),用于展示新闻列表。一个是 Notes 表单 (ImageDescForm),用于显示新闻具体内容。
定义属性和操作
属性和操作的定义过程首先是一个思考的过程:将一个 Notes 元素封装成一个组件,需要它对外发布什么属性,接收什么属性,完成什么操作。这个分析的过程与具体的编码实现同等重要。因为在设计组件时,模块化与可重用性是组件非常关键的要素,所以在构思一个组件时,考虑的不仅仅是实现功能,还应该考虑如何从一个特定功能中抽取出可通用的服务。
ImageNewsList 是一个非常典型的 NSF 组件。作为一个 Notes 视图,它本身提供了将新闻文档列举的功能,现在考虑把它封装成 NSF 组件,我们希望它能够在单击视图中的每个新闻文档时,对外发送一个属性:该篇新闻的新闻号。
图 5. NSF 组件——ImageNewsList
为此,我们需要给这个视图所在的 NSF 数据库定义一个 WSDL,在 Domino Designer 8 中增加了这样一个名为“连线属性”的新设计元素。在这个 WSDL 中我们将描述可对外发布的属性 NewsIDChanged。作为一个 XML 文件,WSDL 可以通过文本编辑器直接编写(复合应用的熟练开发者一般青睐这种方式),也可以利用 Domino Designer 8 里附带的 WSDL 可视化编辑器 Property Broker Editor 进行编辑,后者会自动生成 XML 代码。
图 6. Property Broker Editor——定义属性
如图,我们在 WSDL 中直接加入了一个叫 NewsIDChanged属性。该属性的类型是 ImageNewsIDType(这是一个自定义的类型),名称空间是com.ibm.xna。属性叫什么名称并不重要,重要的是名称空间和类型,因为这才是 Property Broker 在匹配属性和操作时的依据。
该属性在 WSDL 文件中的代码片断如下:
清单 1. WSDL 中对属性的定义
<message name="NewsIDChanged_Message">
<part name="NewsIDChanged_Part" type="cus:ImageNewsIDType"/>
</message>
接下来介绍如何在 WSDL 中定义操作。属性用于对外发布,而操作用于接收属性,所以每一个操作的定义都是和一个属性相关的。ImageDescForm 是一个 Notes 表单,该表单将接收前面定义的这个 NewsIDChanged 属性,并执行一个操作 ShowImageDesc,该操作将在表单中展现新闻号为 NewsIDChanged 的新闻文档的文字信息。
图 7. NSF 组件——ImageDescForm
这样一个操作在 Property Broker Editor 中的定义如下:
图 8. Property Broker Editor——定义操作
如图,操作 ShowImageDesc 与属性 NewsIDChanged 关联,一旦组件接收到 NewsIDChanged 类型的属性 —— 再次提醒:名称不重要,重要的是类型和名称空间匹配——就会执行 ShowImageDesc 的操作,该操作的具体实现将在后文中提到。
操作 ShowImageDesc 的定义在 WSDL 中的代码片断如下:
清单 2. WSDL 中对操作的定义
<operation name="ShowImageDesc">
<portlet:action activeOnStartup="true" caption="ShowImageDesc"
description="Used in tutorial" name="ShowImageDesc"
selectOnMultipleMatch="false" type="standard"/>
<input>
<portlet:param boundTo="request-attribute"
caption="NewsIDChanged" name="NewsIDChanged" partname="NewsIDChanged"/>
</input>
</operation>
在 WSDL 中定义好属性和操作之后,接下来的问题就是如何在 Notes 元素中实现属性的发布和操作的执行。
NSF 组件中属性的发布
对 ImageNewsList 这个 Note 视图组件而言,有两种方式实现属性 NewsIDChanged 的发布。我们先介绍最简单的一种做法,这也是在这个例子中我们所使用的方法。
首先我们需要在这个视图中添加一个列,该列的值为新闻文档的新闻号。
图 9. 在 Domino Desginer 中设计可发布属性的列
然后选择列属性窗口的 编程栏,赋予一个程序使用的列名称。最重要的是在 编写设置 中选择所要对应的属性:NewsIDChanged。然后保存整个视图即可。这样就可以实现 NewsIDChanged 属性的发布。无需编程,非常方便!
图 10. 在编写设置中指定所要发布的属性
很简单,不是吗?这种方法不需要写任何代码即可在 Notes 视图中实现属性的发布,但目前也只有 Notes 视图可以这样做。如果想在其他 Notes 元素中实现属性的发布,可以通过另一种更加通用的方法:编写 Lotusscript 代码来实现。
在这个例子中,我们也可以通过 Lotusscript 代码来发布 NewsIDChanged 属性。我们只需在 ImageNewsList 的 Onselect 事件中添加如下的内容:
清单 3. 发布属性的 Lotusscript 样例代码
Sub Onselect(Source As Notesuiview)
...
获取选中的文档的 ImageNewsID 域值
...
On Error 4719 Goto err4719 // 一旦不是复合应用环境,则跳至报错处
Dim pb As NotesPropertyBroker // 定义 NotesPropertyBroker 对象
Set pb = s.GetPropertyBroker()
If Not (pb Is Nothing) Then
Call pb.setPropertyValue("NewsIDChanged",ImageNewsID )
// 指定要发布的属性名和属性值
Call pb.Publish() // 发布属性
Exit Sub
End If
Exit Sub
err4719:
Print "Error" &Str(Err) &": " &Error$
Messagebox "It's not run in a Composite context"
End Sub
在代码中我们看到,Notes 8 中新增了一个 Notes 类 NotesPropertyBroker,通过该类,我们可以在 Lotusscript 中获得当前 Notes 8 客户端中的 Property Broker 对象,并执行相应的操作。在发布属性的时候,只要调用 propertyBroker 的 setPropertyValue 方法写入属性名和属性值,再调用 propertyBroker 的 publish方法即可完成属性的发布。同样非常简便!
了解了如何在 NSF 组件中发布属性之后,下面我们再来看看 NSF 组件中操作是如何获取这些属性值的。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者