级别: 初级 陈隽伟, 全球化认证实验室,IBM中国软件开发试验室, IBM
2004 年 5 月 01 日 本文主要分为两个部分,第一部分将让读者先对WDO的基本概念,体系框架及其发展趋势有些了解;而第二部分则会先介绍WDO的功能,然后通过一个完整的范例来介绍如何使用WSAD V5.1.1开发基于WDO的Web应用。
简介
在基于Web的电子商务应用中,绝大多数都是以“数据”为中心的。应用系统需要频繁地从各种各样的数据源中获取数据;对各种数据进行浏览,过滤;增加新的数据;更改已有的数据;删除不再需要的数据。正因为如此,高效,便捷,稳定的数据访问模型一直都是系统架构师,系统开发人员,应用开发人员等担任各种职责的IT专业人士都十分关心的话题。
长期以来,我们一直工作在“在线数据访问模型”之中,系统在进行各种数据操作的时候必须保持和数据源的连接。而在很多实际应用场景中,我们更希望看到数据和数据库连接能够分开,甚至应用运行时我们可以移走数据源,这就是理想中的“离线数据访问模型”。现在,WDO做到了这一点,并且已经在最新的WSAD V5.1.1和WAS V5.1中得到了初步地支持。下面就让我们开始WDO之旅。
本文涉及到的产品主要是WSAD V5.1.1,有兴趣的读者可以从IBM官方网站上下载试验版进行学习。
本文主要分为两个部分,第一部分将让读者先对WDO的基本概念,体系框架及其发展趋势有些了解;而第二部分则会先介绍WDO的功能,然后通过一个完整的范例来介绍如何使用WSAD V5.1.1开发基于WDO的Web应用。
第一部分:WDO的基本概念,体系框架及其发展趋势
WDO的基本概念
WDO(Web Data Object):Web数据对象,它是一种以数据为中心的,离线的,与XML集成的,独立于数据源的数据访问模型。
- 以数据为中心:数据从数据源获取之后,将按照WDO定义的结构存放在系统中,成为应用的中心。
- 离线:对数据的各种操作独立于各种与后台数据源之间的连接或是事务。
- 与XML集成:WDO所维护的数据可以方便的与XML格式的文档之间互相转换。
- 独立于数据源:WDO自己定义了数据的存放结构和规则,这些都是独立于具体的某种数据源的。
WDO的体系框架
我们先来看看WDO的应用框架,这也是一个典型的Web三层框架。
这当中的核心就是WDO运行时,它是由两个最核心的模块组成:
- 中介器:通过不同的中介器实现对不同的数据源进行数据访问。
- 数据列表:通过中介器获得,并经过转换的结构化数据集。
有了这样两个核心模块,我们来进一步细化上面的应用框架:
数据列表
数据列表在WDO中是一个核心的概念,它表示这样一种数据集,它是离线的,独立于后台数据源的,并且是结构化的,这种结构则是由WDO来负责维护的。
数据列表之所以“离线”是因为它是独立于任何和创建它自身有关的数据库连接或是事务的。很多应用正是需要这样一种离线的数据访问模型,而数据列表则给了它们最好的支持。此外,数据列表想要直接支持离线数据访问的应用就是能够记录从数据集的初始状态开始的种种变化,而这些变化能够在将来某个时候从数据列表中被提取出来,对原有的数据集进行更新。另外一大支持离线数据访问的特性则是数据列表能够非常方便的和XML文档之间进行互相转换,这样可以使得数据在一个多层的复杂应用系统中层与层之间方便的传输。
至于数据列表中的结构,它本身是与后台数据源无关的,不同的数据源诸如JDBC数据源,EJB,CICS或是XML文档,都可以生成同样的数据列表。这样就大大简化了客户端的编程模型,开发人员不需要考虑面对的是何种数据源以及它的结构和类型。
同时,一个数据列表又是由很多具有内在关联的WDO数据对象组成的,数据对象(Data Object)可以说是WDO中存储管理数据的基本单元。
作为一个WDO数据对象,它具有下面这些最基本的特性:
- 数据对象能够表示结构化的数据。
- 数据对象应该有一个数据类型。
- 数据对象是由很多字段组成的。
- 数据对象中的每个字段既可以是一个标准的数据库字段类型,也可以嵌套是另外一个数据对象。
- 数据对象能够记录下每个字段的初始值以及每次更新的记录。
在数据列表层面上,它还具有这样一些不同于数据对象的特别的特性:
- 数据列表能够非常方便的与XML文档间进行互相转换。
- 出错信息可以和数据列表相关联。
- 数据列表能够导出修改过的数据对象的列表。
通过上面这些叙述,我们已经大致了解了数据是如何在WDO的数据列表中存储和管理的,但这些数据又是从什么地方来的呢?这时,应该中介器出场了,WDO中是由它负责和各种不同的数据源打交道,从数据源提取数据,并将数据列表提供的数据修改更新到相应的数据源。
中介器
相对于数据列表是负责存储和管理数据,中介器则是专门负责在数据列表和数据源之间或是客户端和数据源之间传递数据。
WDO客户端通过调用和具体数据源相适应的中介器来得到一个数据列表。然后,WDO客户端就从数据列表中读取数据,并且对其进行更新操作,这些更新将会在晚些时候再次通过中介器更新至对应的数据源。
中介器的工作实际上是一个双向的过程:
- 当中介器被用来生成一个数据列表的时候,它访问对应的后台数据源得到原始的数据集,然后将其转换成WDO数据列表中规定格式的数据集。
- 当中介器被用来更新一个变化过的数据列表的时候,它会先提取出数据列表中的所有数据变化,然后通过一种优化的并发控制策略将这些数据变化更新到数据源中。
下面则是对WDO中介器功能的简单总结:
- 一个中介器能够被用来生成并返回一个数据列表。
- 中介器可以和数据列表相独立,它们之间并没有状态上的关联。
- 中介器能够将数据列表中的变化更新至相应的数据源。
- 对数据源的更新会由优化的并发控制策略控制。
- 中介器会因数据源的不同而不同,因此其创建时需要得到特定数据源的元数据。
本文所涉及的中介器主要是JDBC中介器,至于另外一种常用的XML中介器,将在其它文章中专门讲述。而JDBC中介器较之于其它中介器则是有一些特殊的特性的。
WDO的发展趋势
WDO是由IBM公司设计的,并已经在WSAD V5.1.1和WAS V5.1中得到实现,但还不是J2EE规范的一部分。为此,IBM已经和BEA联合向JCP(Java Community Process)提交了JSR235:SDO(Service Data Object)的规范,其很多基本的体系框架和设计思想均来源于WDO,相信不久的将来WDO的后继版本――SDO将成为J2EE规范的一部分,而得到更进一步地推广和应用。
第二部分:如何使用WSAD V5.1.1开发基于WDO的Web应用
第一部分中,我们已经列举了WDO的各种特点,但是如果没有一种合适的开发工具和运行环境来支持它的话,开发人员仍然无法体验到它带来的好处。
WSAD V5.1.1中已经有对WDO的技术预览版做了相应的集成和实现,并且会在将来的版本中得到正式地支持。
使用WSAD V5.1.1开发基于WDO的Web应用,会给开发人员带来哪些全新的体验:
- 会有丰富的Faces组件来支持WDO,有关数据的界面设计变得异常简单
- 代码中将不再出现SQL语句,常用的数据库操作均可以通过简单配置完成
还有更多更新的方便之处等着读者在实践中自己来体验。
下面会是一个完整的范例,这应该是本文最有价值的一部分。它包括了从简单的需求,
开发到最终的运行一个基于WDO的Web应用的全过程,其中涉及到了所有最常用的数据操作。
2.1 范例需求
范例需求:数据库中有一张记录公司员工信息的数据表,我们需要完成这样几个页面,能够分页显示数据表中所有的记录;有个页面能够显示指定的某条记录的详细信息;另外一个页面能够编辑某条记录的一些字段值,并能够提交修改或是删除这条记录;最后,还要有个页面可以新建一条记录。
注:范例数据库取自安装DB2 UDB V8时自带的SAMPLE数据库。
在开始我们的开发之前,先回想一下如果没有WDO,我们应该做些什么,可能脑海中已经开始在设想如何编写SQL代码,如何控制数据库连接了。现在,所有这都不再需要,一切都变了。
2.2 显示所有员工记录
下面,打开WSAD V5.1.1,开始我们的开发吧。
1.单击文件->新建来创建一个动态Web项目(如图1)
图1
2.接下来,指定该Web项目的名字,同时选中左下方的选项框以便能够编辑一些高级配置选项。
3.在这个配置框中,我们需要输入与该Web应用相对应的企业应用程序项目的名称以及Web应用的上下文的根。J2EE的级别应该选择1.3,而目标服务器则应该选择WAS V5.1,它对WDO提供运行时的支持。(如图2)
图2
4.这步比较重要,我们需要选择一些和WDO支持相关的高级配置选项。如下图,我们需要选择 WDO关系数据库运行时 以及 添加Faces基本组件,之所以选择后者,是因为后台数据在页面中的显示需要这些Faces组件的支持。(如图3)
图3
5.在页面设计当中,可以选择模板功能,这样便于将来网页的批量修改和管理。这里,既可以选择样本页面模板,也可以选择自定义的页面模板。
6.当Web项目新建完成之后,我们可以右键选择WebContent->新建->Faces JSP文件,来新建一个支持Faces系列组件的JSP页面。(如图4)
图4
7.然后,我们可以指定该JSP页面的路径和名称,这里我们保留它的默认路径;并且,我们选中该页面是从之前选定的页模板来创建。重复这一步,一共创建4个JSP页面,分别是stafflist.jsp,staffdetail.jsp,staffadd.jsp, staffedit.jsp。
8.接下来,我们选择编辑第一个JSP页面,这个页面需要完成的功能是分页显示STAFF这张数据表的所有记录。
我们先来创建一个数据列表(如图5):
图5
在下面的配置界面中选中 添加新的数据列表,以及 添加输出控件以在Web页面上显示数据列表(如图6)
图6
接下来,我们需要设置数据列表的名称, 请在操作类型中选择 显示现有数据列表,由于我们是第一次新建数据列表对象,目前还不存在数据库连接,所以需要先配置一个数据库连接。
在数据库连接的配置框中设置数据库连接的名称,并在下面的类型中选择新建连接。
下面这步比较重要,我们需要提供后台数据库供应商的种类,这里默认支持大多数主流数据库供应商的产品,并且还要提供数据库名称以及用户标识和密码。(如图7)
图7
当数据库连接建立成功之后,我们可以看到该数据库中的所有数据表会自动显示在下面的树状菜单中,选中我们这个例子中要用到的这张表STAFF,这表示已经将这张数据表和staff_list这个数据列表进行了绑定。(如图8)
图8
由于这张数据库表并没有定义主键,我们还可以在这里为其修改主键,这并不是对后台数据库做了修改,而是由数据列表来负责维护。(如图9)
图9
接下来,我们还可以设置数据列表中所有记录的排序依据等配置选项。
数据列表创建完毕之后,单击完成,WSAD V5.1.1会自动创建数据列表,并且在该JSP页面上创建对应的DataGrid控件。
9.在配置了数据列表之后,页面已经能够显示STAFF数据表中的所有信息,一切就是那么简单,不需要编写任何代码。
下面,我们会在DataGrid中的每行增加一些工具列,以便能够链接到其它功能页面。
我们先在DataGrid中增加了三列,分别注明 Details,Add,Edit;然后选中右面组件板上的超链接组件,拖放至Details列中,这时会弹出一个配置URL的配置框。在目标中选择staffdetail.jsp页面,而在标注中注明Details。(如图10)
图10
重复上面的步骤,创建另外两个超链接,分别链接至staffadd.jsf和staffedit.jsf。如图11所示:
图11
10.超链接创建好之后,我们为了能够让staffdetail.jsp页面能够获取需要显示的记录信息,必须将该条记录的主键ID传递过去,这需要做下面这样一些事情:
1)选中Details超链接,在其属性框中选择参数页,新建一个参数,并且将其和数据列表的ID列相绑定。(如图12,13)
图12
图13
2)同时,别忘了在页数据中的param类型新建一个名为ID的参数。
最后,为了能够分页显示所有记录,我们需要设置每页所包括的记录数(如图14):
图14
上述一切完成之后,有关stafflist.jsp的编辑配置工作就已经全部完成。
2.3 显示详细信息子页面
11.下面我们来编辑staffdetail.jsp这个页面,它要实现的功能是接收stafflist.jsp传过来的ID信息,显示该条记录的各个字段的值。这同样不需要开发人员编写一句代码,而只需要新建一个数据对象并对其进行适当地配置。
在staffdetail.jsp的页数据中新建一个数据对象(类似图5,选择关系数据对象):
请选择 添加新的数据对象 以及选中添加输入/输出控件以在Web页面上显示数据对象(类似图6)。
同数据列表类似,这里需要指定数据对象的名称,并且在操作类型中选择 显示现有数据对象 ,由于之前我们以及建立了数据库连接,这里只需要直接在下面列表中选择STAFF表即可 (类似图8)。
在接下来的配置中,请选择 显示现有记录(只读),在底下的列表中,我们可以选择在页面中显示哪些字段,它们的排列顺序,以及采用何种控件来显示这些字段,这里由于只是显示字段的内容,我们都选择输出字段(如图15):
图15
数据对象创建完成之后,美工可以在此基础上进行进一步的加工。
最后别忘了在该页的页数据中的param里新建一个名为ID的参数。这就完成了显示一条记录的所有字段的工作,是不是很简单呢?
2.4 显示编辑记录子页面
12.接下来我们要完成的这个页面staffedit.jsp要做的工作则是编辑一条已有记录,并且将修改提交到后台数据库中,或者删除该条记录。
这里,我们需要创建一个新的数据对象,操作的步骤读者应该已经很熟悉了。
在这里设定数据对象名称,选择操作类型以及对应的数据表(类似图8):
在下面的配置框中记得要选择 更新现有记录,这是和之前不一样的地方。如果你并不希望用户能够编辑所有的字段,那么可以在下面的列表中将它们相应的控件类型置为输出字段(类似图15):
为了完成和后台数据库之间的操作,这里我们需要编写一些非常简单的代码了,选中 提交 按钮,再选择快速编辑,在代码编辑框中加入这样一些代码,它们的功能是将这些编辑框的值赋给数据对象,然后由数据对象提交给后台数据库,一切就是那么简单,开发人员不用再担心是不是会忘记SQL代码中字符串两边的单引号了(如图16):
图16
对于删除操作则更为简单,只有两句代码,删除该数据对象,并且提交给后台数据库。
这里开发人员可能会担心,这些不可恢复的操作是不是在数据库事务的管理范围之内呢,回答是肯定的。WDO将帮我们管理这些数据库事务,而这一切对开发人员来说都将是透明的(如图17):
图17
2.5 显示添加记录子页面
13.好了,这个范例以及完成了一大半了,下面还剩下最后一个页面staffadd.jsp,它的功能是新建一条员工信息。
重复之前的一些操作,唯一需要特别注意的是在操作类型中选择 新建新的数据对象(类似图8):
然后在下面这个配置框中选择 创建新的记录(类似图15):
之后单击 提交 按钮,在快速编辑中添加这样一段代码,它的作用是将各个编辑框中的内容装入数据对象,然后提交给后台数据库,完成插入一条记录的操作(如图18):
图18
2.6 在测试环境中运行程序
14. 好了,经过上面的步骤,我们已经完成了所有的开发工作。看看手表,是不是比以前类似的开发要快许多。
这步,我们要做的是如何来运行这些程序。 WSAD V5.1.1集成了WAS V5.1的测试环境,因此我们可以直接在WSAD中看到它们的运行结果(如图19):
选中你想要运行的页面,右键单击选择 在服务器上运行
图19
接下来,选择你想要启动的服务器,单击完成。
WSAD会帮助你将应用自动打包发布到测试服务器上面(如图20):
图20
接下来,我们来看在测试浏览器中的显示效果(如图21):
这是主页面,分页显示所有的记录:
图21
依次点击每条记录右侧的Details,Add,Edit,将会分别看到详细信息页面,添加记录页面以及编辑记录页面。
这个范例只实现了一些最基本的数据操作,实际应用中还常常需要很多更为复杂的数据操作,这些话题将会在其它的文章中涉及。
小结
本文先是介绍了一种新的数据访问模型,然后描述了它的基本功能,并通过一个完整的范例来讲述如何在WSAD V5.1.1中使用它构建Web应用。
参考资料
- IBM官方网站WSAD主页
http://www-306.ibm.com/software/awdtools/studioappdev/
- JSR235的主页
http://jcp.org/en/jsr/detail?id=235
关于作者
对本文的评价
|