本文对比分析了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.三页。

71. 从Lotus Notes表单到XPage——兼谈程序里的二进制文件和文本文件相关推荐

  1. [vue-element] ElementUI是怎么做表单验证的?在循环里对每个input验证怎么做呢?

    [vue] ElementUI是怎么做表单验证的?在循环里对每个input验证怎么做呢? model 绑定表单数据,通过prop取表单数值,通过编写ref进行后台API验证 ,根据rules进行表单内 ...

  2. 使用 Netlify Forms 将联系表单添加到 React 应用程序

    将联系表单添加到 React 应用程序可能需要编写服务器端代码来处理表单提交,但是使用 Netlify Forms,您可以从逻辑中解脱出来,因​为当您的网站运行时,它会为您完成所有幕后工作部署在Net ...

  3. 微信提交表单到服务器,微信小程序页面表单如何跟图片一起上传服务器

    拆开写. 表单提交是 wx.request 上传图片是 wx.uploadFile 你需要写一个通用图片上传接口,上传图片后台返回图片的url.这个通用接口在任何需要提交图片的表单都可以用到. 添加图 ...

  4. java 植入 form_pdf form表单制作以及用java程序填充表单

    程序代码如下 import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import ...

  5. 微信公众号里如何上传html,微信公众号怎么做表单,微信万能表单如何添加到公众号里...

    微信的使用占据着大众的日常,而微信上的一些订单.预约.登记.投诉.反馈等功能都可以使用微信万能表单来实现,那么微信万能表单怎么做?下文带来微信公众号表单制作方法,方法很简单,需要的朋友一起看看吧. 微 ...

  6. html5表单属性自动获得焦点,HTML5里autofocus属性

    转载:http://www.webhek.com/html5-autofocus/ HTML5给我们带来了一大堆神奇的东西.以前需要用JavaScript和Flash完成的任务,例如表单校验,INPU ...

  7. php对接小程序获取表单,PHP实现微信小程序用户授权的工具类

    事先准备工作 1.申请一个小程序,申请地址:传送门 2.仔细阅读小程序的用户授权登陆官方文档:<用户授权登陆的流程> 3.仔细阅读微信用户数据解密的相关文档:<用户数据解密说明文档& ...

  8. php ajax弹出框传值,PHP_Yii2.0 模态弹出框+ajax提交表单,如题 我们使用模态弹出框+ajax - phpStudy...

    Yii2.0 模态弹出框+ajax提交表单 如题 我们使用模态弹出框+ajax提交表单 首先我们把index视图的create按钮添加data-toggle 和 data-target. 代码如下: ...

  9. ajax提交form表单数据_[基础编程学习] [PHP7数组详解]:第2章 (1)从表单提交数据说起...

    读完本章节内容,您能得到以下知识: 定义和使用数组 创建表单,并验证表单提交的数组 创建简单的数组结构 操作简单数组的值 遍历数组结构 将表单数据存入数组 存入数组之前进行数据验证 # 2.1 为什么 ...

最新文章

  1. AI时代的GitHub,这个陆奇看好的方向,终于有人做了
  2. Java数据结构类如何使用_Matlab如何使用Java的数据结构类型
  3. 【C 语言】文件操作 ( 按照文本行的方式读写文件 | fgets 函数 | fputs 函数 )
  4. C#--封装、继承、多态
  5. 野火 stm32f429 pcb_PCB板价格是如何核算的
  6. JavaScript对象的创建之动态原型方式
  7. nexus 代理阿里云_Azure容器镜像代理服务失效
  8. Visual Studio2017 远程调试 Remote Debugger
  9. three.js加载3d模型_基于WebGL的3D技术在网页中的运用 ThingJS 前端开发
  10. php实现数字滚动效果,vue如何实现数字滚动增加效果?代码示例
  11. noip2014到2017初赛提高组看程序写结果、完善程序
  12. 添加notepad到右键菜单栏
  13. getReadableDatabase VS getWritableDatabase
  14. 个人优盘更新涉密计算机病毒库,在涉密计算机和非涉密计算机之间交叉使用优盘、移动硬盘等移动存储介质时,只要及时升级杀毒软件病毒库,就不会造成泄密 - 作业在线问答...
  15. N32903系列的基础知识(1)
  16. 如何在C#中播放一些AVI短片,并且使背景透明
  17. python插排_PythonTkinter接收插座不接收
  18. 王道考研操作系统笔记(第五章)附:王道考研408所有PPT和思维导图
  19. android hardware解析
  20. GameSalad:让每个人都变成游戏开发者

热门文章

  1. linux netstat命令:网络状态查看命令
  2. Xftp传输文件发生错误
  3. python中PyGame的下载与安装
  4. 夜光:武汉加油,中国加油
  5. 成功的道路上,人脉比知识更重要。(SEO核心)
  6. Matplotlib绘制三维数据点与线
  7. Mac安装vim插件
  8. 追源索骥:透过源码看懂Flink核心框架的执行流程--来自GitHub
  9. 计算机乘法算法流程,布斯乘法算法
  10. NLP的“第四范式”之Prompt Learning总结:44篇论文逐一梳理