过去几年里,RIA(Rich Internet Applications 的缩写)的呼声日益高涨。但请勿将 RIA 与“rich client application”、“smart client application”混淆,当然三者差别不大,类似这些术语在技术层面并无本质区别。
客户端应用再次升温的原因很简单:HTML 在用户接口能力上的拙劣,搞得用户身心疲惫,即便使用 AJAX 等客户端脚本技术后,仍然无法让人满意。开发者不愿意丢弃服务端分发的优势;在每个用户 PC 都安装可执行客户端程序的传统所谓“富客户端”方式,往轻里说是不现实,说严重了根本就不可能实现。因此,一个新型的、混合型客户端技术应运而生——它主要运行于客户端,这就充分利用了本地机的能力,避免了网络流量过大,同时保留了从服务端自动更新的分发能力。其名可曰“富客户端”、“智能客户端”或“富互联网应用”等等。
富客户端实现技术的选择,一直存在大量争议。一些人推崇 RCP(Eclipse Rich Client Platform),因为它已经集成了很多可管理客户端代码库自动更新的工具和技术;也有人热衷于 AJAX,因为使用它能更容易将现存的 HTML 和 servlet/JSP 应用转化为富客户端程序;还有人对 Adobe 的 Flash player 及其开发工具 Flex 赞不绝口,并引证说几乎在每个用户的浏览器中都已经安装了 Flash player 插件。
然而,引起我极大兴趣的是另一个富客户端平台——仍然没有照顾广大 Java 开发者、已经存在于几乎所有用户的桌面、在用户接口方面提供了令人瞠目的能力和灵活性、每个版本都经过了精心研究、用户接口为广大用户熟悉的 Microsoft Office 平台:Word、Excel、Outlook、PowerPoint 和 InfoPath。
Office 扩展
森林被大片砍伐,用以制造讲解 Office 扩展应用的图书、杂志、文章和报纸所需的纸张,InfoQ 的服务器不可能有足够的空间和文章去穷尽开发者可用以构建和使用 Office 扩展应用的方法。那些希望学习 Office 更多知识的朋友,可以参考我在文章末尾列出的资料。Office 的扩展应用包括在 Office 应用程序中创建自定义工具栏、在 Excel 中添加新的公式等等。在本文中,我们将把重点放在 Office 2003 1 提供的有关 UI 的一个新特性上:智能标记(Smart Tag)。
智能标记
举几个智能标记的例子:Word 中出现在单词下部的紫色点画线;出现在 Excel 单元格中的紫色直角三角形;鼠标停留在某个单词上部时,出现“i”按钮,点击后,可以出现该单词相关信息的弹出菜单等等。例如在 Word 中,键入一个像 916-555-1212 这样的电话号码后,其右键菜单中会包含“添加为联系人”功能,借此可将该号码添加到 Outlook 的地址簿。下面是本段内容(译者注:英文原文)在 Word 中的截图:
根本而言,智能标记的工作过程是这样的:首先识别文档中特定文本内容,然后生成对应的图标和右键菜单。此“识别器”,会与一系列行为关联,这点在文章后面还有阐述。Office 默认安装智能标记组件,但各分项功能未全部开启。我们在 Word 和 Excel 中的“自动更正”对话框(“工具”|“自动更正选项”)中的“智能标记”栏,可设置各项标记功能。
如图所示,是否勾选各项标记框,决定了对应标记功能的开启与关闭;也可以通过“使用智能标记标识文字”,决定是否开启全部标记功能。
使用 Excel、PowerPoint 等不同的 Office 应用软件时,智能标记的实际行为和配置会有轻微不同——比如 Excel 和 Word 的配置对话框不一样;再如我们在 Word 中看到的是紫色点划线,而 Excel 的单元格里则是一个小三角形。
智能标记的实现
有两种实现智能标记的方法,前种实现的功能和实现方法都很简单,而另一个则需要编写代码,但提供的功能也更为灵活。从某种角度讲,在.NET 中使用 Office 工具包(Visual Studio Tools for Office,VSTO)做智能标记 DLL 开发(也就是第二种办法),是一件很有趣的事情。但第一个方法更为简单,特别适合 Java 用户——创建一个 XML 格式的“智能标记列表”文件,再放到用户硬盘的某个适当位置就可以了。至于使用.NET 开发智能标记,可参考 Carter 和 Lippert 的《Visual Studio Tools for Office》,或下载 VSTO 2005 第二版。
在这里,我们以常用的 Spring“JPetStore”为例(在我的本机上运行于 Tomcat 中,而在真实环境里,自然应该使用公网服务器),看看如何教会 Excel 识别 JPetStore 的“Product ID”和“Item ID”,然后再让智能标记显示一个右键菜单,这样,用户就可以利用菜单功能在浏览器中查看对应的“Product”和“Item”——借此就可为用户提供验证待售宠物的机会 2 。当然在真实环境中,标记将放在标准格式的 Excel 文档模板中,供用户在线订购宠物和销售人员与客户沟通时使用。
Microsoft 为方便用户,提供了便捷创建智能标记的方法——使用 XML 文件(其具体格式可参看智能标记 SDK 文档)。这也就是众所周知的 MOSTL (Microsoft Office Smart Tag List),它使用的 XML 文档被命名为“智能标记列表”。举例来说,安装目录为“C:\Program Files\Common Files\Microsoft Shared\Smart Tag”,其下将有一个叫做“LISTS”的子目录,我们可以将共享使用的 XML 文档放在这里 3 。文档内容大致如下图:
如果不论考虑其中用于识别手机号的正则表达式的复杂性,智能标记清单文件还是很好懂的:
- 首先要说的是两个命名空间。图中所示为 Office 2003 环境,在 Office XP 中则会有不同的命名空间 URI(具体请参看相关文档)。另外,即便无实际需要,若没有比保持一致性更重要的原因,文档建议所有地方均加上“FL”前缀。
- FL:name 的意思浅显易懂,而且此项是必须的。 FL:lcid 描述语言环境,是可选项(若无,则表示适用于所有环境)。 FL:description 是必须的。 FL:updateable 和 FL:autoupdate 设定智能标记的更新方式。
- FL:smarttag 逐项描述智能标记的细节,在上例中,除了正则表达式的支持,主要包括可识别文本及对应行为。“type”属性指定的命名空间必须唯一,格式也是固定的,也就是说它必须带后缀标签(跟在“#”后面)。无后缀标签的标记是不合法的,但遗憾的是,Office 对于错误的智能标记清单文件没有任何提示,唯一的表现就是“智能标记”对话框中不予显示。
- FL:caption ,即在右键菜单中显示的菜单文本。
在例图未出现的还有 < FL:terms> 和。前者包含智能标记需要识别的术语,后者描述点击右键菜单后的行为。将这些内容整合到一起,我们的 JPetStore 智能标记文件内容如下图:
注意,上图列出了两个智能标记,一个用于识别 JPetStore 的“Product ID”,另一个识别“Item ID”。完成识别后,都会开启一个浏览器窗口,以显示 JPetStore 服务器上的对应页面(用识别得到的内容替换 URL 中的“{TEXT}”占位符)。为“action”元素的“id”属性赋值时要小心,它遵循“末尾者胜出”的原则,重复的值是无效的。
现在可以将此文件保存到上面提到的目录中了,但此时一定要保证没有 Office 程序(包括 IE 和其他任何共享 Office 运行实例的程序)正在运行。最后,启动 Excel,就可以在“自动更正”对话框的“智能标记”页看到我们新增的标记了,一旦勾选,Excel 就能识别电子表格中的 Product ID 和 Item ID,并为用户提供打开相应 Web 页面的机会。
上面例子的不足在于,“Product ID”和“Item ID”识别格式都使用了硬编码。在真实环境中,我们肯定希望智能标记清单能从服务器上自动更新。解决办法很简单:为清单中增加必要信息,如更新路径 URL,再在服务端放置待更新、动态生成的智能标记文件就行了。如下图所示,文件内容只需要做轻微调整:
现在,每五分钟(由元素指定),Office 将通过指定的 URL 发出一次 HTTP POST 请求。服务端被请求文件的内容必须形如下图:
为了简单起见,我们在这里使用了 JSP 代码,实际上只要设置 MIME 类型为“text/xml”,它也可以是一个 Struts 或 Spring 的 MVC 视图。上述设置告知 Office 去下载元素指定的内容,其中就包含新版智能标记清单的定义。注意,这里的元素和智能标记清单定义里的是相互关联的——如果服务器上的 checkpoint 值大于客户机上的 lastCheckpoint,更新行为就会被触发。我们在这里将 checkpoint 固化为了 400(明显大于前面清单文件中的 lastCheckpoint 值 0),在真实环境中,它其实应该是一个随实际情况变化的递增量。
总结
到目前为止,我们仅仅了解了智能标记的皮毛。通过其他办法,我们还可以将其与 Java 应用程序或服务集成。例如,我们可以开发自定义的智能标记,直接向服务器查询各种数据(如通过 RPC 调用 Spring 容器的功能,或者借助外部进程访问服务器):产品目录、价格等等。
Office 本身也还有很多其他类型的扩展功能,如 Word 的调查面板(Research Pane):它在 Word 中位于文档右侧,可为用户提供搜索服务,其本质,是通过 WebService 提供的 WSDL 接口实现的。显然,这类 WebService 并不必须用.NET 编写,用 JAX-WS(Java API for XML Web Services)也可轻松完成运行在 J2EE 环境下的服务。
部分开发人员可能在 Office 的使用上遭遇障碍,因为 Office 的所有权归 Microsoft,在终端用户机上使用时要求许可授权。当然使用 Office 也有其优势,比如其安装率很高,特别是在商业环境下;另外,Microsoft 也开始适度免费,比如推出了无许可要求的 Word、Excel 和 PowerPoint 文档“阅读器”,可帮助用户“打开、浏览和打印”文档。在某些情况下(如在线销售时发送收据),文档不需要更改,只读功能已经足够了。
最后,一些开发者可能指出上述特性和功能在 OpenOffice(一个开源的、平台无关的 Office 2003 和 2007 的竞争者)大都存在。毫无疑问,如果 OpenOffice 已经具有 Office 那样的用户基础,它也应该走上我们在上面讨论过的与 Office 同样的道路。但是,对 OpenOffice 开发者说实话,Microsoft 在 Office 扩展应用上已经积累大量经验,而且更重要的是,有大量的知识和例子供用户研究学习。
无论选择哪种办公软件产品或平台,充分利用用户已经安装的软件环境实现富客户端应用,毫无疑问是一个很有前途的解决方案。尽管 Office 不见得是所有项目的富客户端万能解决方案,但使用 Office 作为客户端再做扩展开发,将比使用 Swing、SWT 和 AJAX 等从头实现容易得多。
参考资源
Microsoft Visual Studio Tools for Office Second Edition Runtime (VSTO 2005 SE) (x86),见 http://www.microsoft.com/downloads
/details.aspx?familyid=f5539a90-dc41-4792-8ef8-f4de62ff1e81&displaylang=en 。这是配合 Office 2007 使用的最新、最好的 VSTO 包。不过得注意它仅仅是一个运行时环境,如果构建 VSTO 扩展应用,还需要下面提到的 SDK。
Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System,见 http://www.microsoft.com/downloads/details.aspx?familyid=
5E86CAB3-6FD6-4955-B979-E1676DB6B3CB&displaylang=en 。VSTO 2005 SE SDK。
Office 2003: Smart Tag SDK,见 http://www.microsoft.com/downloads/details.aspx?familyid=
c6189658-d915-4140-908a-9a0114953721&displaylang=en 。智能标记 SDK 下载页面,其文档可参考 http://msdn2.microsoft.com/en-us/library/bb190881(office.11).aspx 。
《Visual Studio Tools for Office: Using C# with Excel, Word, Outlook, and InfoPath》,作者是 Carter 和 Lippert,Addison-Wesley 出版。此书专门讲解 VSTO。
《Building Microsoft Office Applications》。这本书有些年头了,主要是讲“Visual Basic for Applications”技术(VSTO 的前身)的扩展应用,虽然技术陈旧,但也不乏亮点,特别是作者精心整理的那些使用案例。
查看英文原文: Rich Office Client Applications - - - - - -
译者简介:罗小平,上海某大型公司互联网中心技术总监, CSDN 大版主,网络 ID 为 lxpbuaa(桂枝香在故国晚秋),曾著有《Delphi 精要》一书。个人博客为 http://blog.csdn.net/lxpbuaa ,现在 CSDN 主持翻译国外专家 Herb Sutter 的中文博客。他的 Email 和 MSN 为 lxpbuaa AT 263.net 。
评论