数据绑定(data binding)并不是一个新概念,ie 4.0就已对其给予了丰富的支持。但是,数据绑定并未受到应有的重视,许多开发者似乎更加愿意使用服务器端脚本(server script)的方法。然而实际上,无论是在动态网页的代码实现方面,还是在动态网页的工作效率方面,数据绑定的效率都比后者更高。
本文将介绍数据绑定的体系结构、工作原理及其实现方式,最后对这两种方法在编程工作量和网页效率等方面做出比较和结论。
首先让我们看一个简单的例子。某一网页显示仓库的当前库存情况,用户可自行选择数据的排序方式:按货物的名称、价格、库存量等排序。使用服务器端的技术,例如cgi、isapi,或者asp等中间件,用户若需要n种排序方式,则应用程序脚本至少要向服务器提交n次数据请求。对于同样内容的数据,仅仅因为显示方式的不同,就要进行多次数据库操作,耗费大量的网络带宽。
另一个常见的例子是,大量数据需要分页显示时,每一次翻页都需要重新向服务器建立连接,递交查询请求,再定位数据。对这些类似问题,数据绑定都提供了高效的解决方案。
数据绑定的体系结构和工作原理
数据绑定体系结构包括四个组成部分:数据源对象(data source object)、数据显示对象(data consumers)和两个代理器(binding agent与table reptition agent)。数据源对象向网页提供数据,数据显示对象就是显示数据的html元素,代理器则用来保证前两者的工作同步。图1显示了这四个部分协同工作的原理。
如图1所示,数据源对象负责与后台数据库服务器通信,并将db server返回的数据以集合形式缓存在本地cache。此后,对此数据集所做的任何操作,如排序、过滤、取子集等,都在本地cache中进行,由代理器来负责数据源和显示该数据的html元素之间的通信和同步。
http://www.ccidnet.com/tech/web/2000/12/25/image/001225i1-1.jpg
图1
数据绑定的这种工作方式,使得程序开发人员只要使用扩展html和可插入的数据源对象,就能使脚本的编程量达到最小。与传统的服务器端脚本生成的网页相比,数据只要一次下载到客户端后,对该数据所做的任何操作都不再需要额外的服务器请求,因此节省了网络带宽,提高了下载速度。
数据绑定的实现
本节将根据数据绑定的体系结构,分别介绍它的各个组成部分及其实现。
1. 数据源对象(data source object)
实现数据绑定的第一步是:确定网页所要显示的数据,据此选择一个适合的数据源对象(dso),再在网页中引用该dso。数据绑定的灵活性首先表现在支持多种dso,ie 4.0及以上版本支持下列dso类型:
●tabular data control(tdc):这是一种简单的dso,提供对格式化文本文件的访问。也就是说,tdc提供的数据来源是用指定分隔符来格式化的文本文件。
●remote data service(rds):rds的前身是adc(access data control)。rds通过ole-db或odbc与数据库通信,获得数据。
●jdbc datasource applet:它与rds的不同之处在于数据库连接使用jdbc。
●xml data source:扩展标记语言xml使用标准的方式来描述和交换结构化数据;xml的数据以开放的、基于文本的格式进行描述,并通过标准http协议传输。xml本身的特性决定了它天生就是一种灵活强大的dso。ie4.0使用java applet来实现xml dso;ie5.0支持data island,用户可以直接用<xml>标记定义的数据作为dso。
●mshtml data source:除了使用外部的控件作为dso外,开发人员还可以在html文档中定义数据集,并使用mshtml本身作为数据源。
●自定义类型dso:除了以上明确定义的这五类dso,ie还支持用户自定义类型的dso,只要该dso遵循ie 4/mshtml data binding interface即可。
dso可以在设计时指定,也可以在运行时动态增加、修改和删除。
2.支持数据绑定的数据显示对象(data consumer)
可绑定的html元素共分为两大类:单值对象(single-valued consumer)和表对象(tabular consumer)。单值对象显示dso提供的当前记录的某一个域,而表对象中的每行元素则分别对应一条记录中不同的域,并以此为模板重复显示数据集中的每条记录。数据显示对象既可以在设计时绑定到dso,也可以在运行时动态绑定。
dso和data consumer的动态特性,使得已经存在的元素绑定可以被修改;不但如此,dhtml对象模型(dhtml object modle)还支持运行时动态增加数据绑定元素和数据源对象,因此数据可以以异步方式下载到客户端。该特性使得开发人员可以减少网页内容的初始化下载时间,并可在一个页面上显示多个不同数据集的内容,交互式用户将由此获得高质量的服务。
支持数据绑定的html元素包括:a、applet、button、div、frame、iframe、img、input(包括checkbox、hidden、label、password、radio、text等类型)、label、marquee、select、span和textarea。其中,a、button、div、img、frame、iframe、lable、marquee以及span支持只读功能的数据绑定;而input(除button类型外)、select、textarea、object和applet元素支持被绑定数据的update功能。
3. 数据绑定支持的操作
对于只读类型的data consumer来说,数据绑定支持的操作就是显示dso提供的数据集。具体功能包括:
● 动态增加和修改被绑定元素及dso,如改变所显示的数据字段、对数据集进行过滤和排序等。
● 动态改变数据集的显示方式,数据可以用html格式显示,也可用简单的text格式显示。
● 动态控制被显示数据的数量,即可动态改变分页显示时每页包含的记录数。
支持update功能的data consumer不但支持上述功能,还支持记录的增加、修改和删除。也就是说,用户在交互页面上对数据的增加、修改和删除,将影响到显示该数据的元素所绑定到的数据集。为了方便对数据集的控制,数据绑定允许开发人员使用ado(active data objects)提供的所有方法和属性来维护dso提供的数据集,包括insert、update、delete及navigation等操作。
数据绑定中一个非常重要的问题是,一定要清楚对data consumer所做的操作到底影响了哪些数据:是只对本地cache中的数据起作用,还是已真正改变了后端数据库(这与dso的类型有关)。tdc、xml data source以及mshtml data source都只支持对cache中的数据进行改变,而不支持将改变后的cache中的数据提交到数据源所连接的后端数据库。而rds和jdbc datasource applet都支持修改后端数据库的功能。
比较及结论
从表1可以看出,相对于服务器端脚本,数据绑定所生成的网页工作效率明显提高。但是使用该方法对程序员的要求较高,需要对data binding的深刻理解才能充分发挥将它的优良特性。复杂的工作就是高效率所必须付出的代价,在应用中,开发者应根据具体的需求和实际情况,选择适宜的方法或是将两者结合使用,以便获得最高的性能价格比。
| 比较项目 | 数据绑定 | 服务器端脚本 | |
| 网页工作效率 | 数据下载 | 同步/异步 | 同步 |
| 对数据进行过滤或排序 | 只需建立一次连接 | n次操作需建立n次连接 | |
| 分页显示 | 只需建立一次连接 | 每次翻页需要新连接和定位数据 | |
| 通过data consumer直接修改数据库 | 支持,且不需编程 | 支持,但需编程 | |
| 结论 | 下载速度明显提高,与用户交互快,提供高质量的服务 | 下载速度与交互速度不如数据绑定方式 | |
| 编程工作效率 | 编程灵活性 | 高 | 高 |
| 编程工作量 | 少 | 多 | |
| 编程复杂性 | 高 | 低 | |
| 结论 | 编程工作量少,使用灵活.但要求程序员必须熟悉dso和data consumer所支持的特殊方法和属性,编程比服务器端脚本复杂 | 虽然编程工作量大,但使用灵活简便,只需熟悉一般数据库操作的程序员即可胜任 |
