本文对比分析了LotusNotes平台上两种视图技术。架构和运转过程的分析特定于Lotus Notes平台,其后的关于二进制文件和文本文件的讨论则具有普遍性。(严格地说,XPages指的是IBM基于Lotus Domino和JSF的快速开发技术,XPage则指单个页面,两者的首两个字母都大写。笔者一直遵守这个拼写上的规则。)
架构
XPages的引入是Lotus Notes作为一个开发平台二十多年的历史中最具革命性的变化。从架构上讲,最根本的变化就是把视图和数据定义分离开。这里的视图不是指Notes视图,而是应用程序中展现给用户的界面部分。在传统的Lotus Notes应用程序里,表单既是用户界面,又负责定义字段。这样虽然使视图设计和数据设计的工作合二为一,加快了开发速度,但是视图和数据过于紧密不可拆分的联系大大束缚了系统的结构,不仅减少了灵活性,而且很多时候成为负担。新的XPage则和后端的数据设计没有直接的关系。表单退化成仅仅定义各种类型的文档的字段,也就是定义应用程序用到的各种数据实体存储在数据库时对应的容器的规范,类似于基于关系型数据库的应用程序里的表定义。设计表单时不用考虑用户界面,可以使这些“表”设计得更紧凑、合理、高效。另一方面,以XPage作界面解脱了与后端数据库的结构的捆绑,能够专心适应用户对界面的要求,免去了原来每个表单后面拖着的文档的负担,并且可以接合更广泛的数据类型,实现更灵活的处理。
运转过程
除去架构上的优点,XPage作为一种视图技术与Lotus Notes表单也有很大的差异。从运转过程来说,在一个典型的客户端服务器环境的应用程序里,开发人员设计的表单直接以二进制格式存储于服务器上的某个数据库里,随用户打开文档的操作被传输到Notes客户端,然后由客户端解释,最终展现在用户眼前;XPage页面对应的是XML格式的文本文件,XPages设计时引擎首先将它一一对应转化成Java源文件,然后编译成字节码的class文件,用户从浏览器请求某个页面时,XPages运行时引擎装入该XPage对应的class文件,执行生成前端文件(包括HTML、CSS和JavaScript等),返回给浏览器,最后浏览器再解释这些文件将页面呈现给用户。
二进制文件与文本文件
上面提到表单和XPage在存储格式上的不同,这也是两种技术本质上的重大差别。表单和其他传统的设计元素一样,都是以Lotus Notes私有的“复合数据”(Composite Data简称CD)二进制格式存储在数据库里,只能用Designer和Notes客户端这些特定的软件写入、读取和识别(NotesPeek是IBM提供的一个可以一窥LotusNotes数据库和各个设计元素内部组成的小工具)。XPage则是以文本格式保存(当然也是被包容在一个Lotus Notes数据库的基本存储单元note内)。这个二进制与文本格式的差异意味着什么呢?
首先是文件的编辑方式。二进制文件因为对人是不可读的,只能借助于专门的软件读取和修改。此软件将二进制的代码转换成对人有意义的形式,如属性,再将在此形式下的修改转换回二进制代码保存。文本文件则使用任何文本编辑器都能阅读和修改。在涉及到诸如表单和XPage这样的界面文件时,现代的开发工具基本上都装备了可视化的编辑器,用户只需在视图上添加控件,拖拉位置和修改属性就能完成界面设计。似乎背后采用的是二进制还是文本格式关系不大。但是能够以文本形式编辑在某些场合仍然更加便利。比如要批量修改多个对象的属性时,在可视化的编辑环境里使用属性框时,有两种途径可循。第一种是很多开发环境都采用的,即选中多个对象后,在属性框里允许有相同值的属性处可以统一地编辑,新的值会被应用到所有选中的对象。Domino Designer在同时修改多个设计元素的属性(如继承的模版、是否允许设计变更和刷新更新等)时就是如此。第二种方法比较少见,是将某一个对象的某一种属性的当前值复制到其他同类对象上。Designer在编辑视图时,很多视图列的属性就可以这种方式应用到所有列上。
其次是文件的可移植性。字节顺序,数据对齐(Data alignment),这些问题对于文本文件和二进制文件都是存在的。Unicode用Byte order mark标志字节顺序(endianess)。Java class文件是big endian。文本文件因为每个字符都具有跨平台的明确含义,并且占用的字节数也是固定的,跨机器的文件复制对用户来说是完全透明的。只要使用一致的字符编码,在任何机器上读写文本文件都没有差别。具体到Lotus Notes的环境,传统的设计元素采用的二进制格式在不同平台的存储器里遵循的规则就可能不同。例如,运行在Intel x86机器上的Lotus Notes客户端和运行在基于POWER指令集的机器上的LotusDomino服务器,一个数据库里的设计元素在这两台机器的存储器里就具有不同的字节顺序【注1】。所以Lotus Notes读写数据库的API规定了不依赖于底层机器的数据标准,各个平台上的不同的Lotus Notes/Domino版本的本机代码负责在所在平台的底层编码和这个标准之间转换【注】。XPage和生成的Java文件都是文本格式的,先天就更容易在不同平台间移植,就像其他常用的跨平台的web开发的脚本语言一样。
第三是文件的版本控制。在比较版本之间的差异,合并分支版本等版本控制的常见任务上,文本文件都比二进制文件容易很多。Lotus Notes平台上迟迟出现的版本控制功能便是利用DXL将设计元素从二进制格式转换成XML的文本文件,其中的XPage相关文件就省去了转换的步骤。
注1:Intel x86平台的字节顺序是little endian,POWER的是big endian。
注2:参看Lotus C API for Domino and Notes的TYPE_xxx - Item Data Type definitions.、ODSReadMemory - Convert a structure from canonical format to machine-specific format.、ODSWriteMemory - Convert a structure from machine-specific format to canonical format.三页。