扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:www.ibm.com 来源:www.ibm.com 2007年9月15日
关键字: lotus IBM MACROMEDIA FLASH Office
本文介绍如何基于平面 Domino 视图并在其中进行控制,将 IBM Lotus Domino 视图内容呈现在 Macromedia Flash 中。通过这种方法,只要更改 Domino 视图即可在 Lotus Notes 和 Flash 用户界面 (UI) 中维持相同的设计和内容。
通过采用此解决方案,不再需要在附加的视图中插入内联的 HTML 或 XML,就可以使用相同的方法在 Lotus Notes UI 和 Flash UI 中格式化内容。相反,创建这样一个 Domino 视图,它包括应用到列标题或行的格式化方法,例如字号、字体和字体灰度,UI 就可以共享相同的格式化方法。利用此方法在 Web 客户机中使用 Flash,可以将 Domino 视图的字体嵌入到 Flash 影片中,可以在 Web 客户机中完美地呈现。
本文描述名为 FlashNotesView 的 Flash 解决方案。它读取纯 Domino 视图的内容和设计,将其应用到 Flash UI 中(如图 1 所示)。本文假设您是有经验的 Flash 开发人员,具有 ActionScript 语言的知识,并熟悉 Lotus Notes/Domino 应用程序开发。
注意:本文的代码存放在名为 FlashNotesView.as 的外部 ActionScript 文件中。如果没有安装 Macromedia Flash,可以在文本编辑器中查看此代码。
创建 UI 组件
Macromedia Flash 带有一个预定义的 UI 组件集。当然也可以使用 Macromedia Flash Exchange 添加更多组件。只需将这些组件拖放到一个平台上,或者使用代码在运行时创建某些类的实例,即可在 Macromedia Flash 中创建 UI。
假设您想在 Macromedia Flash 中创建类似平面 Lotus Notes 视图的视图。为此,请使用名为 DataGrid 的 UI 组件。要在运行时创建组件,必须在 Flash 影片开始时为 3 个 UI 组件导入类。这些类是 Label、List 和 DataGrid,导入它们的命令如下:
import mx.controls.Label;
import mx.controls.List;
import mx.controls.DataGrid;
导入所需的类之后,可以使用下面的 createClassObject 方法在运行时创建新的类实例:
lblSelectView = createClassObject(Label, "lblSelectView", getNextHighestDepth()); lstSelectView= createClassObject(List,"lstSelectView", getNextHighestDepth()); dgridView = createClassObject(DataGrid, "dgridView", getNextHighestDepth()); |
|
准备数据提供程序
数据提供程序是在组件(如 List 和 DataGrid)中查看的数据的模型,理论上只是一个对象数组。使用 Array 类的 push 方法可以将新对象添加到数据提供程序中。该数组中的每个对象也称为数据提供程序中的项,每项在 List 或 DataGrid 组件中以单独的行显示。要定义显示在 List 组件中的数据,请使用以下代码:
var arrSelectViewDP = new Array();
arrSelectViewDP.push({label:"IBM Lotus software: Lotus Documentation",
data:"http://www.lotus.com/ldd/notesua.nsf/Date"});
在本文中,我们使用 Lotus Documentation site database (notesua.nsf) on developerWorks Lotus 中的 Domino 视图。
|
指定数据提供程序
List 组件的实例具有名为 dataProvider 的属性。要为 List 实例指定数据提供程序模型,请使用以下命令:
lstSelectView.dataProvider = arrSelectViewDP;
此命令将数据提供程序模型中的项填充到 List 组件中。现在,您已经设置好了 Flash 影片第一次运行时显示给用户的一切内容。在下面几节中,您将添加检索用户在 Flash 影片中的 List 组件中所选择的 Domino 视图的内容和设计所需的代码。(该 List 组件显示在图 1 中的 “Select view” 框中。)
|
以 XML 格式获取 Domino 视图的内容和设计
首先,必须检索 Domino 视图的内容。Lotus Domino 中有几个 URL 命令可用于此任务。例如,?OpenView、?OpenDocument、?OpenPage 和 ?ReadForm。但 ?ReadViewEntries 和 ?ReadDesign 是首选 URL 命令。
检索 Domino 视图的内容
使用 ?ReadViewEntries 可以用 XML 格式而不是预设格式检索视图中的内容。此检索的 URL 语法如下:
http://www.lotus.com/ldd/notesua.nsf/Date?ReadViewEntries
URL 结果如下:
<?xml version="1.0" encoding="UTF-8" ?> <!-- Lotus-Domino (Release 7.0.1 - January 17, 2006 on Windows NT/Intel) --> <viewentries toplevelentries="690"> <viewentry position="1" unid="E1EFAB2B58C8B68785257145005A41FC" noteid="86B6" siblings="690"> <entrydata columnnumber="0" name="Date_Update"> <datetime>20060403</datetime> </entrydata> <entrydata columnnumber="1" name="Titles"> <text>Real-time access and data management for the intelligent enterprise</text> </entrydata> <entrydata columnnumber="2" name="Language"> <text>English</text> </entrydata> </viewentry> ... </viewentries> |
检索 Domino 视图的设计
在这里向开发人员提供一条新闻:基本上未归档的 URL 命令 ?ReadDesign 允许您不仅检索视图的内容,还以 XML 格式检索视图的设计,即如何格式化视图列标题和行。检索设计的 URL 语法如下:
http://www.lotus.com/ldd/notesua.nsf/Date?ReadViewEntries
下面是 URL 结果:
<?xml version="1.0" encoding="UTF-8" ?> <!-- Lotus-Domino (Release 7.0.1 - January 17, 2006 on Windows NT/Intel) --> <viewdesign rowlines="3" direction="0" spacing="1" columns="3" totalscolor="#808080"> <column columnnumber="0" width="80" name="Date_Update" title="Last updated" sort="true" sortdescending="true" resortascending="true" format="2" listseparator="none"> <cfont style="r" size="7" color="#000000" face="Helvetica" /> <hfont style="b" size="7" color="#000000" face="Helvetica" /> <numberformat digits="0" format="general" /> <datetimeformat show="date" date="yearmonthday" time="hourminutesecond" zone="never" /> </column> ... </viewdesign> |
通过检索 Domino 视图的设计,就在 Lotus Notes 中具有了良好格式化的视图,并且字体设置和其他格式化也出现在 Flash UI 中。
|
创建 XML 对象
|
如何将 Domino 视图中获取的 XML 加载到 Macromedia Flash 中的 DataGrid 组件中呢?首先,必须有一个 XML 对象,用于通信和对发送到服务器的请求的响应进行处理。xmlView XML 对象包含服务器响应的 XML;由于不需要用户阅读所需的 XML 格式,所以您可以要求此对象忽略空白(参见侧栏 “在 Macromedia Flash 中处理 XML”)。
另外,还指定了一个当您从服务器获取 XML 结果时要执行的函数,如下所示:
var xmlView = new XML();
xmlView.ignoreWhite = true;
xmlView.onLoad = onXMLViewLoad;
|
检索视图内容
|
在 Macromedia Flash 中加载 UI 时,调用 XML 对象的加载方法,初始化用户所选视图中的 XML 内容的加载, 如下所示:
xmlView.load(strView+"?ReadViewEntries");
strView 变量具有当前所选视图的 URL。
|
在 DataGrid 中填充视图内容
当收到 Domino 视图的 XML 内容时,后面的两个代码清单由于已放在 onXMLViewLoad 函数中而会执行。当您遍历结果时,可以使用一个临时数组来保存 XML 节点。
var arrView = arrViewRows=arrViewCols=[];
下一个代码清单遍历 XML 节点并创建一个临时的 objRow 对象,该对象由 Domino 视图每行的列内容填充。然后,objRow 对象附加到 DataGrid 组件的 dataProvider 属性中。
arrViewRows = xmlView.firstChild.childNodes; for (var row = 0; row<(arrViewRows.length); row++) { if (arrViewRows[row].nodeName == "viewentry") { arrViewCols = arrViewRows[row].childNodes; var objRow = new Object(); for (var col = (arrViewCols.length); col>=0; col--) { if (arrViewCols[col].nodeName == "entrydata") { objRow[arrViewCols[col].attributes.columnnumber] = arrViewCols[col].firstChild.firstChild; } } arrView.push(objRow); } } dgridView.dataProvider = arrView; // Clear datagrid column headers for (var col = 0; col<(dgridView.columnCount); col++) { var column = dgridView.getColumnAt(col); column.headerText = ""; } |
要获得清晰的表示,DataGrid 的列标题在此处被清除,并在以后应用视图设计时填充。
|
将视图设计应用于 DataGrid
要应用视图的设计设置,必须将此处显示的代码添加到 onXMLViewDesignLoad 函数中,获取 ?ReadDesign 命令的内容时将执行该函数。同样,遍历结果时使用一个临时数组来保存 XML 节点。
var arrViewCols = []; arrViewCols = xmlViewDesign.firstChild.childNodes; for (var col = 0; col<(arrViewCols.length); col++) { if (arrViewCols[col].nodeName == "column") { var column = dgridView.getColumnAt(col); column.headerText = arrViewCols[col].attributes.title; column.width = int(arrViewCols[col].attributes.width); column.resizable = Boolean(arrViewCols[col].attributes.resize); column.setStyle("fontSize", int(arrViewCols[col].firstChild.nextSibling.attributes.size)); column.setStyle("fontFamily", arrViewCols[col].firstChild.nextSibling.attributes.face); column.setStyle("color", arrViewCols[col].firstChild.nextSibling.attributes.color); } } dgridView.redraw(); |
此代码遍历 XML 中定义的每一列,并将设置应用于 DataGrid 组件的列。它通过使用 setStyle 属性设置适当的层叠样式表 (CSS) 值来完成此操作。
此代码支持的视图设计的设计属性包括:
当然,通过添加代码以支持更多视图设计的属性,可以轻松地扩展此列表。
|
在新解决方案中实现 FlashNotesView.as
要在新 Flash 影片(例如 FlashNotesView_clean.fla 中包括的影片)开始时使用 FlashNotesView.as,可以在 Flash 影片的 Actions 窗格的第 1 帧中添加此行:
#include "FlashNotesView.as"
|
接下来,将 Label、List 和 DataGrid 从 Components 窗格中拖动到平台上,然后删除平台上新创建的实例。这告诉您的 Flash 影片在将 Flash 文件编译成 Macromedia Flash Player 可播放的 ShockWave Flash (SWF) 格式时包括这些新添加的组件。由于实际代码位于外部 FlashNotesView.as ActionScript 文件中,因此以上是您在 Macromedia Flash 中需要做的所有事情。
|
自定义 FlashNotesView 解决方案
除更改 FlashNotesView.as 之外,必须使用 Macromedia Flash 将 Flash (FLA) 文件编译成 Macromedia Flash Player 可以播放的 SWF Flash 影片。首先,尝试自定义用户可选择的视图列表。可以轻松地在代码中更改此过程。例如,要从 Bob Balaban (Looseleaf) Forum 添加视图,只需添加以下代码即可,其中数据提供程序定义在开始部分:
arrSelectViewDP.push({label:"Bob Balaban (Looseleaf) Forum",
data:"http://www.looseleaf.net/Looseleaf/Forum.nsf/
8178b1c14b1e9b6b8525624f0062fe9f"});
注意:URL 必须排除任何现有 URL 命令,所以您在从 Web 复制您自己的 URL 时请从初始的 URL 删除 ?OpenView。
当您熟悉自定义此解决方案时,请考虑创建一个自定义类,用于扩展包含首选方法和属性的 DataGrid。
|
安全
如果测试提供的 FlashNotesView_final.swf Flash 影片时出现安全消息,请按照显示的指示以允许本地的 SWF 文件与外部地址通信。
随着 Macromedia Flash Player 8 的发布,有了更高的安全级别,即只允许 Flash 影片与同一域中的后台系统通信。要避免此问题,可以在后台服务器上创建一个 Flash 影片能与之通信的文本文件(叫做策略文件)。然后,将应该允许与当前服务器通信的域添加到该文本文件。
下面是一个位于 backendhost.com(它接受来自 clienthost.com 的请求)中的策略文件的示例:
<cross-domain-policy>
<allow-access-from domain="clienthost.com" />
</cross-domain-policy>
该策略文件的文件名是 crossdomain.xml。有关 Macromedia Flash Player 8 中增强的安全模型的详细信息,请参考 Adobe 文章 “Security Changes in Flash Player 8”。
|
结束语
这几年来,富 Internet 应用程序(即具有可以结合视频和声音的桌面应用程序的能力的基于 Flash 的 UI)已成为 Flash 开发的热门话题。这类应用程序也很可能与后台系统连接,向用户传递内容。
您可以将 Lotus Domino 服务器作为基于 Flash 的 UI 的后台系统,可以将用于 Domino 数据库的 HTML 文件中的 Flash 应用程序嵌入不同平台上的客户机计算机中。还可能将 Flash 应用程序编译成独立的可执行文件,管理员可以刻光盘并分发这些文件。光盘中的 Flash 应用程序保留了它与后台 Domino 服务器的连接,可在客户机计算机上通过 HTTP 来访问。这是 Macromedia Flash 用作基于 Domino 的解决方案中的单独表示层的一个优点。如果需要,可以轻松地将 Flash 应用程序应用到其他后台系统。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者