过去几年里,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扩展应用的图书、杂志、文章和报纸所需的纸张,InfoQ的服务器不可能有足够的空间和文章去穷尽开发者可用以构建和使用Office扩展应用的方法。那些希望学习Office更多知识的朋友,可以参考我在文章末尾列出的资料。Office的扩展应用包括在Office应用程序中创建自定义工具栏、在Excel中添加新的公式等等。在本文中,我们将把重点放在Office 20031提供的有关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。文档内容大致如下图:
如果不论考虑其中用于识别手机号的正则表达式的复杂性,智能标记清单文件还是很好懂的:
在例图未出现的还有< 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的前身)的扩展应用,虽然技术陈旧,但也不乏亮点,特别是作者精心整理的那些使用案例。